@rosen-bridge/config 0.1.0 → 0.2.1

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/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  export * from './config';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxVQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NvbmZpZyc7XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxVQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NvbmZpZyc7XG4iXX0=
@@ -1,29 +1,32 @@
1
1
  import { ConfigValidator } from '../../config';
2
2
  import * as types from '../types/fields';
3
3
  export declare const propertyValidators: {
4
- all: {
5
- type: (field: types.ConfigField, config: ConfigValidator) => void;
6
- label: (field: types.ConfigField, config: ConfigValidator) => void;
7
- description: (field: types.ConfigField, config: ConfigValidator) => void;
8
- };
9
- primitive: {
10
- validations: (field: types.PrimitiveField, config: ConfigValidator) => void;
11
- };
12
- object: {
13
- children: (field: types.ObjectField, config: ConfigValidator) => void;
14
- };
15
- string: {
16
- default: (field: types.StringField, config: ConfigValidator) => void;
17
- };
18
- boolean: {
19
- default: (field: types.BooleanField, config: ConfigValidator) => void;
20
- };
21
- number: {
22
- default: (field: types.NumberField, config: ConfigValidator) => void;
23
- };
24
- bigint: {
25
- default: (field: types.BigIntField, config: ConfigValidator) => void;
26
- };
4
+ all: {
5
+ type: (field: types.ConfigField, config: ConfigValidator) => void;
6
+ label: (field: types.ConfigField, config: ConfigValidator) => void;
7
+ description: (field: types.ConfigField, config: ConfigValidator) => void;
8
+ };
9
+ primitive: {
10
+ validations: (field: types.PrimitiveField, config: ConfigValidator) => void;
11
+ };
12
+ object: {
13
+ children: (field: types.ObjectField, config: ConfigValidator) => void;
14
+ };
15
+ array: {
16
+ items: (field: types.ArrayField, config: ConfigValidator) => void;
17
+ };
18
+ string: {
19
+ default: (field: types.StringField, config: ConfigValidator) => void;
20
+ };
21
+ boolean: {
22
+ default: (field: types.BooleanField, config: ConfigValidator) => void;
23
+ };
24
+ number: {
25
+ default: (field: types.NumberField, config: ConfigValidator) => void;
26
+ };
27
+ bigint: {
28
+ default: (field: types.BigIntField, config: ConfigValidator) => void;
29
+ };
27
30
  };
28
31
  export declare const supportedTypes: string[];
29
- //# sourceMappingURL=fieldProperties.d.ts.map
32
+ //# sourceMappingURL=fieldProperties.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fieldProperties.d.ts","sourceRoot":"","sources":["../../../lib/schema/Validators/fieldProperties.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAC;AAGzC,eAAO,MAAM,kBAAkB;;sBAEb,MAAM,WAAW,UAAU,eAAe;uBAWzC,MAAM,WAAW,UAAU,eAAe;6BAKpC,MAAM,WAAW,UAAU,eAAe;;;6BAU1C,MAAM,cAAc,UAAU,eAAe;;;0BAuEhD,MAAM,WAAW,UAAU,eAAe;;;yBAK3C,MAAM,WAAW,UAAU,eAAe;;;yBAY1C,MAAM,YAAY,UAAU,eAAe;;;yBAY3C,MAAM,WAAW,UAAU,eAAe;;;yBAY1C,MAAM,WAAW,UAAU,eAAe;;CAW9D,CAAC;AAEF,eAAO,MAAM,cAAc,UAE1B,CAAC"}
1
+ {"version":3,"file":"fieldProperties.d.ts","sourceRoot":"","sources":["../../../lib/schema/Validators/fieldProperties.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAC;AAGzC,eAAO,MAAM,kBAAkB;;sBAEb,MAAM,WAAW,UAAU,eAAe;uBAWzC,MAAM,WAAW,UAAU,eAAe;6BAKpC,MAAM,WAAW,UAAU,eAAe;;;6BAU1C,MAAM,cAAc,UAAU,eAAe;;;0BAuEhD,MAAM,WAAW,UAAU,eAAe;;;uBAa7C,MAAM,UAAU,UAAU,eAAe;;;yBASvC,MAAM,WAAW,UAAU,eAAe;;;yBAY1C,MAAM,YAAY,UAAU,eAAe;;;yBAY3C,MAAM,WAAW,UAAU,eAAe;;;yBAY1C,MAAM,WAAW,UAAU,eAAe;;CAW9D,CAAC;AAEF,eAAO,MAAM,cAAc,UAE1B,CAAC"}
@@ -1,254 +1,221 @@
1
1
  export const propertyValidators = {
2
- all: {
3
- type: (field, config) => {
4
- if (!Object.hasOwn(field, 'type') || typeof field.type !== 'string') {
5
- throw new Error(
6
- `every schema field must have a "type" property of type "string"`
7
- );
8
- }
9
- if (!supportedTypes.includes(field.type)) {
10
- throw new Error(`unsupported field type "${field.type}"`);
11
- }
2
+ all: {
3
+ type: (field, config) => {
4
+ if (!Object.hasOwn(field, 'type') || typeof field.type !== 'string') {
5
+ throw new Error(`every schema field must have a "type" property of type "string"`);
6
+ }
7
+ if (!supportedTypes.includes(field.type)) {
8
+ throw new Error(`unsupported field type "${field.type}"`);
9
+ }
10
+ },
11
+ label: (field, config) => {
12
+ if (Object.hasOwn(field, 'label') && typeof field.label !== 'string') {
13
+ throw new Error(`"label" property should be a "string"`);
14
+ }
15
+ },
16
+ description: (field, config) => {
17
+ if (Object.hasOwn(field, 'description') &&
18
+ typeof field.description !== 'string') {
19
+ throw new Error(`"description" property should be a "string"`);
20
+ }
21
+ },
22
+ },
23
+ primitive: {
24
+ validations: (field, config) => {
25
+ if (!Object.hasOwn(field, 'validations')) {
26
+ return;
27
+ }
28
+ if (!Array.isArray(field.validations)) {
29
+ throw new Error('"validations" property must be an array of validation descriptions');
30
+ }
31
+ for (const validation of field.validations) {
32
+ if (Object.hasOwn(validation, 'error') &&
33
+ typeof validation.error !== 'string') {
34
+ throw new Error('"error" property of a validation description must be a string');
35
+ }
36
+ if (Object.hasOwn(validation, 'when') && validation.when != undefined) {
37
+ if (!Object.hasOwn(validation.when, 'path') ||
38
+ typeof validation.when.path !== 'string') {
39
+ throw new Error(`"when" property of a validation description must have a "path" property of type "string"`);
40
+ }
41
+ if (config.getSchemaField(validation.when.path.split('.')) == undefined) {
42
+ throw new Error(`"when" property of a validation description has a non-existent path=[${validation.when.path}]`);
43
+ }
44
+ if (!Object.hasOwn(validation.when, 'value')) {
45
+ throw new Error(`"when" property of a validation description must have a "value" property`);
46
+ }
47
+ }
48
+ const validationProperties = Object.keys(validation).filter((key) => key !== 'when' && key !== 'error');
49
+ if (validationProperties.length !== 1) {
50
+ throw new Error('validation description format is wrong');
51
+ }
52
+ const validationName = validationProperties[0];
53
+ const primitiveValidator = fieldValidations.primitive[validationName];
54
+ const typeValidator = fieldValidations[field.type][validationName];
55
+ if (primitiveValidator == undefined && typeValidator == undefined) {
56
+ throw new Error(`validation description has an unknown validator "${validationName}"`);
57
+ }
58
+ if (primitiveValidator != undefined) {
59
+ primitiveValidator(validation);
60
+ }
61
+ else {
62
+ typeValidator(validation);
63
+ }
64
+ }
65
+ },
66
+ },
67
+ object: {
68
+ children: (field, config) => {
69
+ if (!Object.hasOwn(field, 'children') ||
70
+ typeof field.children !== 'object') {
71
+ throw new Error(`object field type must have a "children" property of type "object"`);
72
+ }
73
+ return;
74
+ },
75
+ },
76
+ array: {
77
+ items: (field, config) => {
78
+ if (!Object.hasOwn(field, 'items') || typeof field.items !== 'object') {
79
+ throw new Error(`array field type must have a "items" property of type "object"`);
80
+ }
81
+ },
82
+ },
83
+ string: {
84
+ default: (field, config) => {
85
+ if (Object.hasOwn(field, 'default') &&
86
+ typeof field.default !== 'string') {
87
+ throw new Error(`default value=[${field.default}] doesn't match field type=[${field.type}]`);
88
+ }
89
+ },
90
+ },
91
+ boolean: {
92
+ default: (field, config) => {
93
+ if (Object.hasOwn(field, 'default') &&
94
+ typeof field.default !== 'boolean') {
95
+ throw new Error(`default value=[${field.default}] doesn't match field type=[${field.type}]`);
96
+ }
97
+ },
98
+ },
99
+ number: {
100
+ default: (field, config) => {
101
+ if (Object.hasOwn(field, 'default') &&
102
+ typeof field.default !== 'number') {
103
+ throw new Error(`default value=[${field.default}] doesn't match field type=[${field.type}]`);
104
+ }
105
+ },
106
+ },
107
+ bigint: {
108
+ default: (field, config) => {
109
+ if (Object.hasOwn(field, 'default') &&
110
+ typeof field.default !== 'bigint') {
111
+ throw new Error(`default value=[${field.default}] doesn't match field type=[${field.type}]`);
112
+ }
113
+ },
12
114
  },
13
- label: (field, config) => {
14
- if (Object.hasOwn(field, 'label') && typeof field.label !== 'string') {
15
- throw new Error(`"label" property should be a "string"`);
16
- }
17
- },
18
- description: (field, config) => {
19
- if (
20
- Object.hasOwn(field, 'description') &&
21
- typeof field.description !== 'string'
22
- ) {
23
- throw new Error(`"description" property should be a "string"`);
24
- }
25
- },
26
- },
27
- primitive: {
28
- validations: (field, config) => {
29
- if (!Object.hasOwn(field, 'validations')) {
30
- return;
31
- }
32
- if (!Array.isArray(field.validations)) {
33
- throw new Error(
34
- '"validations" property must be an array of validation descriptions'
35
- );
36
- }
37
- for (const validation of field.validations) {
38
- if (
39
- Object.hasOwn(validation, 'error') &&
40
- typeof validation.error !== 'string'
41
- ) {
42
- throw new Error(
43
- '"error" property of a validation description must be a string'
44
- );
45
- }
46
- if (Object.hasOwn(validation, 'when') && validation.when != undefined) {
47
- if (
48
- !Object.hasOwn(validation.when, 'path') ||
49
- typeof validation.when.path !== 'string'
50
- ) {
51
- throw new Error(
52
- `"when" property of a validation description must have a "path" property of type "string"`
53
- );
54
- }
55
- if (
56
- config.getSchemaField(validation.when.path.split('.')) == undefined
57
- ) {
58
- throw new Error(
59
- `"when" property of a validation description has a non-existent path=[${validation.when.path}]`
60
- );
61
- }
62
- if (!Object.hasOwn(validation.when, 'value')) {
63
- throw new Error(
64
- `"when" property of a validation description must have a "value" property`
65
- );
66
- }
67
- }
68
- const validationProperties = Object.keys(validation).filter(
69
- (key) => key !== 'when' && key !== 'error'
70
- );
71
- if (validationProperties.length !== 1) {
72
- throw new Error('validation description format is wrong');
73
- }
74
- const validationName = validationProperties[0];
75
- const primitiveValidator = fieldValidations.primitive[validationName];
76
- const typeValidator = fieldValidations[field.type][validationName];
77
- if (primitiveValidator == undefined && typeValidator == undefined) {
78
- throw new Error(
79
- `validation description has an unknown validator "${validationName}"`
80
- );
81
- }
82
- if (primitiveValidator != undefined) {
83
- primitiveValidator(validation);
84
- } else {
85
- typeValidator(validation);
86
- }
87
- }
88
- },
89
- },
90
- object: {
91
- children: (field, config) => {
92
- return;
93
- },
94
- },
95
- string: {
96
- default: (field, config) => {
97
- if (
98
- Object.hasOwn(field, 'default') &&
99
- typeof field.default !== 'string'
100
- ) {
101
- throw new Error(
102
- `default value=[${field.default}] doesn't match field type=[${field.type}]`
103
- );
104
- }
105
- },
106
- },
107
- boolean: {
108
- default: (field, config) => {
109
- if (
110
- Object.hasOwn(field, 'default') &&
111
- typeof field.default !== 'boolean'
112
- ) {
113
- throw new Error(
114
- `default value=[${field.default}] doesn't match field type=[${field.type}]`
115
- );
116
- }
117
- },
118
- },
119
- number: {
120
- default: (field, config) => {
121
- if (
122
- Object.hasOwn(field, 'default') &&
123
- typeof field.default !== 'number'
124
- ) {
125
- throw new Error(
126
- `default value=[${field.default}] doesn't match field type=[${field.type}]`
127
- );
128
- }
129
- },
130
- },
131
- bigint: {
132
- default: (field, config) => {
133
- if (
134
- Object.hasOwn(field, 'default') &&
135
- typeof field.default !== 'bigint'
136
- ) {
137
- throw new Error(
138
- `default value=[${field.default}] doesn't match field type=[${field.type}]`
139
- );
140
- }
141
- },
142
- },
143
115
  };
144
- export const supportedTypes = Object.keys(propertyValidators).filter(
145
- (key) => key !== 'all' && key !== 'primitive'
146
- );
116
+ export const supportedTypes = Object.keys(propertyValidators).filter((key) => key !== 'all' && key !== 'primitive');
147
117
  const fieldValidations = {
148
- primitive: {
149
- required: (validation) => {
150
- if (!('required' in validation)) {
151
- return;
152
- }
153
- if (typeof validation.required !== 'boolean') {
154
- throw new Error(`"required" validation property should be a boolean`);
155
- }
156
- },
157
- },
158
- string: {
159
- regex: (validation) => {
160
- if (!('regex' in validation)) {
161
- return;
162
- }
163
- if (typeof validation.regex !== 'string') {
164
- throw new Error(`"regex" validation property should be a string`);
165
- }
166
- },
167
- choices: (validation) => {
168
- if (!('choices' in validation)) {
169
- return;
170
- }
171
- if (!Array.isArray(validation.choices)) {
172
- throw new Error(
173
- `"choices" validation property should be an "array" of strings`
174
- );
175
- }
176
- for (const choice of validation.choices) {
177
- if (typeof choice !== 'string') {
178
- throw new Error(
179
- `"choices" validation property should be an array of "strings"`
180
- );
181
- }
182
- }
183
- },
184
- },
185
- number: {
186
- gt: (validation) => {
187
- if (!('gt' in validation)) {
188
- return;
189
- }
190
- if (typeof validation.gt !== 'number') {
191
- throw new Error(`"gt" validation property should be a number`);
192
- }
193
- },
194
- gte: (validation) => {
195
- if (!('gte' in validation)) {
196
- return;
197
- }
198
- if (typeof validation.gte !== 'number') {
199
- throw new Error(`"gte" validation property should be a number`);
200
- }
201
- },
202
- lt: (validation) => {
203
- if (!('lt' in validation)) {
204
- return;
205
- }
206
- if (typeof validation.lt !== 'number') {
207
- throw new Error(`"lt" validation property should be a number`);
208
- }
209
- },
210
- lte: (validation) => {
211
- if (!('lte' in validation)) {
212
- return;
213
- }
214
- if (typeof validation.lte !== 'number') {
215
- throw new Error(`"lte" validation property should be a number`);
216
- }
217
- },
218
- },
219
- bigint: {
220
- gt: (validation) => {
221
- if (!('gt' in validation)) {
222
- return;
223
- }
224
- if (typeof validation.gt !== 'bigint') {
225
- throw new Error(`"gt" validation property should be a bigint`);
226
- }
227
- },
228
- gte: (validation) => {
229
- if (!('gte' in validation)) {
230
- return;
231
- }
232
- if (typeof validation.gte !== 'bigint') {
233
- throw new Error(`"gte" validation property should be a bigint`);
234
- }
235
- },
236
- lt: (validation) => {
237
- if (!('lt' in validation)) {
238
- return;
239
- }
240
- if (typeof validation.lt !== 'bigint') {
241
- throw new Error(`"lt" validation property should be a bigint`);
242
- }
243
- },
244
- lte: (validation) => {
245
- if (!('lte' in validation)) {
246
- return;
247
- }
248
- if (typeof validation.lte !== 'bigint') {
249
- throw new Error(`"lte" validation property should be a bigint`);
250
- }
118
+ primitive: {
119
+ required: (validation) => {
120
+ if (!('required' in validation)) {
121
+ return;
122
+ }
123
+ if (typeof validation.required !== 'boolean') {
124
+ throw new Error(`"required" validation property should be a boolean`);
125
+ }
126
+ },
127
+ },
128
+ string: {
129
+ regex: (validation) => {
130
+ if (!('regex' in validation)) {
131
+ return;
132
+ }
133
+ if (typeof validation.regex !== 'string') {
134
+ throw new Error(`"regex" validation property should be a string`);
135
+ }
136
+ },
137
+ choices: (validation) => {
138
+ if (!('choices' in validation)) {
139
+ return;
140
+ }
141
+ if (!Array.isArray(validation.choices)) {
142
+ throw new Error(`"choices" validation property should be an "array" of strings`);
143
+ }
144
+ for (const choice of validation.choices) {
145
+ if (typeof choice !== 'string') {
146
+ throw new Error(`"choices" validation property should be an array of "strings"`);
147
+ }
148
+ }
149
+ },
150
+ },
151
+ boolean: {},
152
+ number: {
153
+ gt: (validation) => {
154
+ if (!('gt' in validation)) {
155
+ return;
156
+ }
157
+ if (typeof validation.gt !== 'number') {
158
+ throw new Error(`"gt" validation property should be a number`);
159
+ }
160
+ },
161
+ gte: (validation) => {
162
+ if (!('gte' in validation)) {
163
+ return;
164
+ }
165
+ if (typeof validation.gte !== 'number') {
166
+ throw new Error(`"gte" validation property should be a number`);
167
+ }
168
+ },
169
+ lt: (validation) => {
170
+ if (!('lt' in validation)) {
171
+ return;
172
+ }
173
+ if (typeof validation.lt !== 'number') {
174
+ throw new Error(`"lt" validation property should be a number`);
175
+ }
176
+ },
177
+ lte: (validation) => {
178
+ if (!('lte' in validation)) {
179
+ return;
180
+ }
181
+ if (typeof validation.lte !== 'number') {
182
+ throw new Error(`"lte" validation property should be a number`);
183
+ }
184
+ },
185
+ },
186
+ bigint: {
187
+ gt: (validation) => {
188
+ if (!('gt' in validation)) {
189
+ return;
190
+ }
191
+ if (typeof validation.gt !== 'bigint') {
192
+ throw new Error(`"gt" validation property should be a bigint`);
193
+ }
194
+ },
195
+ gte: (validation) => {
196
+ if (!('gte' in validation)) {
197
+ return;
198
+ }
199
+ if (typeof validation.gte !== 'bigint') {
200
+ throw new Error(`"gte" validation property should be a bigint`);
201
+ }
202
+ },
203
+ lt: (validation) => {
204
+ if (!('lt' in validation)) {
205
+ return;
206
+ }
207
+ if (typeof validation.lt !== 'bigint') {
208
+ throw new Error(`"lt" validation property should be a bigint`);
209
+ }
210
+ },
211
+ lte: (validation) => {
212
+ if (!('lte' in validation)) {
213
+ return;
214
+ }
215
+ if (typeof validation.lte !== 'bigint') {
216
+ throw new Error(`"lte" validation property should be a bigint`);
217
+ }
218
+ },
251
219
  },
252
- },
253
220
  };
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRQcm9wZXJ0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3NjaGVtYS9WYWxpZGF0b3JzL2ZpZWxkUHJvcGVydGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRztJQUNoQyxHQUFHLEVBQUU7UUFDSCxJQUFJLEVBQUUsQ0FBQyxLQUF3QixFQUFFLE1BQXVCLEVBQUUsRUFBRTtZQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDbkUsTUFBTSxJQUFJLEtBQUssQ0FDYixpRUFBaUUsQ0FDbEUsQ0FBQzthQUNIO1lBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzthQUMzRDtRQUNILENBQUM7UUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUF3QixFQUFFLE1BQXVCLEVBQUUsRUFBRTtZQUMzRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0JBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQzthQUMxRDtRQUNILENBQUM7UUFDRCxXQUFXLEVBQUUsQ0FBQyxLQUF3QixFQUFFLE1BQXVCLEVBQUUsRUFBRTtZQUNqRSxJQUNFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQztnQkFDbkMsT0FBTyxLQUFLLENBQUMsV0FBVyxLQUFLLFFBQVEsRUFDckM7Z0JBQ0EsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO2FBQ2hFO1FBQ0gsQ0FBQztLQUNGO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsV0FBVyxFQUFFLENBQUMsS0FBMkIsRUFBRSxNQUF1QixFQUFFLEVBQUU7WUFDcEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxFQUFFO2dCQUN4QyxPQUFPO2FBQ1I7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQ2Isb0VBQW9FLENBQ3JFLENBQUM7YUFDSDtZQUVELEtBQUssTUFBTSxVQUFVLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRTtnQkFDMUMsSUFDRSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUM7b0JBQ2xDLE9BQU8sVUFBVSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQ3BDO29CQUNBLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0RBQStELENBQ2hFLENBQUM7aUJBQ0g7Z0JBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRTtvQkFDckUsSUFDRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7d0JBQ3ZDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUN4Qzt3QkFDQSxNQUFNLElBQUksS0FBSyxDQUNiLDBGQUEwRixDQUMzRixDQUFDO3FCQUNIO29CQUVELElBQ0UsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxTQUFTLEVBQ25FO3dCQUNBLE1BQU0sSUFBSSxLQUFLLENBQ2Isd0VBQXdFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQ2hHLENBQUM7cUJBQ0g7b0JBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRTt3QkFDNUMsTUFBTSxJQUFJLEtBQUssQ0FDYiwwRUFBMEUsQ0FDM0UsQ0FBQztxQkFDSDtpQkFDRjtnQkFFRCxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUN6RCxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLE1BQU0sSUFBSSxHQUFHLEtBQUssT0FBTyxDQUMzQyxDQUFDO2dCQUNGLElBQUksb0JBQW9CLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO2lCQUMzRDtnQkFFRCxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxrQkFBa0IsSUFBSSxTQUFTLElBQUksYUFBYSxJQUFJLFNBQVMsRUFBRTtvQkFDakUsTUFBTSxJQUFJLEtBQUssQ0FDYixvREFBb0QsY0FBYyxHQUFHLENBQ3RFLENBQUM7aUJBQ0g7Z0JBRUQsSUFBSSxrQkFBa0IsSUFBSSxTQUFTLEVBQUU7b0JBQ25DLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNoQztxQkFBTTtvQkFDTCxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQzNCO2FBQ0Y7UUFDSCxDQUFDO0tBQ0Y7SUFDRCxNQUFNLEVBQUU7UUFDTixRQUFRLEVBQUUsQ0FBQyxLQUF3QixFQUFFLE1BQXVCLEVBQUUsRUFBRTtZQUM5RCxPQUFPO1FBQ1QsQ0FBQztLQUNGO0lBQ0QsTUFBTSxFQUFFO1FBQ04sT0FBTyxFQUFFLENBQUMsS0FBd0IsRUFBRSxNQUF1QixFQUFFLEVBQUU7WUFDN0QsSUFDRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUM7Z0JBQy9CLE9BQU8sS0FBSyxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQ2pDO2dCQUNBLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0JBQWtCLEtBQUssQ0FBQyxPQUFPLCtCQUErQixLQUFLLENBQUMsSUFBSSxHQUFHLENBQzVFLENBQUM7YUFDSDtRQUNILENBQUM7S0FDRjtJQUNELE9BQU8sRUFBRTtRQUNQLE9BQU8sRUFBRSxDQUFDLEtBQXlCLEVBQUUsTUFBdUIsRUFBRSxFQUFFO1lBQzlELElBQ0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDO2dCQUMvQixPQUFPLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUNsQztnQkFDQSxNQUFNLElBQUksS0FBSyxDQUNiLGtCQUFrQixLQUFLLENBQUMsT0FBTywrQkFBK0IsS0FBSyxDQUFDLElBQUksR0FBRyxDQUM1RSxDQUFDO2FBQ0g7UUFDSCxDQUFDO0tBQ0Y7SUFDRCxNQUFNLEVBQUU7UUFDTixPQUFPLEVBQUUsQ0FBQyxLQUF3QixFQUFFLE1BQXVCLEVBQUUsRUFBRTtZQUM3RCxJQUNFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQztnQkFDL0IsT0FBTyxLQUFLLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFDakM7Z0JBQ0EsTUFBTSxJQUFJLEtBQUssQ0FDYixrQkFBa0IsS0FBSyxDQUFDLE9BQU8sK0JBQStCLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FDNUUsQ0FBQzthQUNIO1FBQ0gsQ0FBQztLQUNGO0lBQ0QsTUFBTSxFQUFFO1FBQ04sT0FBTyxFQUFFLENBQUMsS0FBd0IsRUFBRSxNQUF1QixFQUFFLEVBQUU7WUFDN0QsSUFDRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUM7Z0JBQy9CLE9BQU8sS0FBSyxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQ2pDO2dCQUNBLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0JBQWtCLEtBQUssQ0FBQyxPQUFPLCtCQUErQixLQUFLLENBQUMsSUFBSSxHQUFHLENBQzVFLENBQUM7YUFDSDtRQUNILENBQUM7S0FDRjtDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FDbEUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxLQUFLLElBQUksR0FBRyxLQUFLLFdBQVcsQ0FDOUMsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBQXdDO0lBQzVELFNBQVMsRUFBRTtRQUNULFFBQVEsRUFBRSxDQUFDLFVBQWdCLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLEVBQUU7Z0JBQy9CLE9BQU87YUFDUjtZQUVELElBQUksT0FBTyxVQUFVLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtnQkFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO2FBQ3ZFO1FBQ0gsQ0FBQztLQUNGO0lBQ0QsTUFBTSxFQUFFO1FBQ04sS0FBSyxFQUFFLENBQUMsVUFBbUIsRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsRUFBRTtnQkFDNUIsT0FBTzthQUNSO1lBQ0QsSUFBSSxPQUFPLFVBQVUsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7YUFDbkU7UUFDSCxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUMsVUFBbUIsRUFBRSxFQUFFO1lBQy9CLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxVQUFVLENBQUMsRUFBRTtnQkFDOUIsT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUNiLCtEQUErRCxDQUNoRSxDQUFDO2FBQ0g7WUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO29CQUM5QixNQUFNLElBQUksS0FBSyxDQUNiLCtEQUErRCxDQUNoRSxDQUFDO2lCQUNIO2FBQ0Y7UUFDSCxDQUFDO0tBQ0Y7SUFDRCxNQUFNLEVBQUU7UUFDTixFQUFFLEVBQUUsQ0FBQyxVQUE0QixFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxFQUFFO2dCQUN6QixPQUFPO2FBQ1I7WUFDRCxJQUFJLE9BQU8sVUFBVSxDQUFDLEVBQUUsS0FBSyxRQUFRLEVBQUU7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQzthQUNoRTtRQUNILENBQUM7UUFDRCxHQUFHLEVBQUUsQ0FBQyxVQUE0QixFQUFFLEVBQUU7WUFDcEMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFO2dCQUMxQixPQUFPO2FBQ1I7WUFDRCxJQUFJLE9BQU8sVUFBVSxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUU7Z0JBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQzthQUNqRTtRQUNILENBQUM7UUFDRCxFQUFFLEVBQUUsQ0FBQyxVQUE0QixFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxFQUFFO2dCQUN6QixPQUFPO2FBQ1I7WUFFRCxJQUFJLE9BQU8sVUFBVSxDQUFDLEVBQUUsS0FBSyxRQUFRLEVBQUU7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQzthQUNoRTtRQUNILENBQUM7UUFDRCxHQUFHLEVBQUUsQ0FBQyxVQUE0QixFQUFFLEVBQUU7WUFDcEMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFO2dCQUMxQixPQUFPO2FBQ1I7WUFFRCxJQUFJLE9BQU8sVUFBVSxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUU7Z0JBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQzthQUNqRTtRQUNILENBQUM7S0FDRjtJQUNELE1BQU0sRUFBRTtRQUNOLEVBQUUsRUFBRSxDQUFDLFVBQTRCLEVBQUUsRUFBRTtZQUNuQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLEVBQUU7Z0JBQ3pCLE9BQU87YUFDUjtZQUVELElBQUksT0FBTyxVQUFVLENBQUMsRUFBRSxLQUFLLFFBQVEsRUFBRTtnQkFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO2FBQ2hFO1FBQ0gsQ0FBQztRQUNELEdBQUcsRUFBRSxDQUFDLFVBQTRCLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUU7Z0JBQzFCLE9BQU87YUFDUjtZQUNELElBQUksT0FBTyxVQUFVLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRTtnQkFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO2FBQ2pFO1FBQ0gsQ0FBQztRQUNELEVBQUUsRUFBRSxDQUFDLFVBQTRCLEVBQUUsRUFBRTtZQUNuQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLEVBQUU7Z0JBQ3pCLE9BQU87YUFDUjtZQUNELElBQUksT0FBTyxVQUFVLENBQUMsRUFBRSxLQUFLLFFBQVEsRUFBRTtnQkFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO2FBQ2hFO1FBQ0gsQ0FBQztRQUNELEdBQUcsRUFBRSxDQUFDLFVBQTRCLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUU7Z0JBQzFCLE9BQU87YUFDUjtZQUNELElBQUksT0FBTyxVQUFVLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRTtnQkFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO2FBQ2pFO1FBQ0gsQ0FBQztLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmZpZ1ZhbGlkYXRvciB9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tICcuLi90eXBlcy9maWVsZHMnO1xuaW1wb3J0IHsgVkFsbCwgVk51bWVyaWMsIFZTdHJpbmcgfSBmcm9tICcuLi90eXBlcy92YWxpZGF0aW9ucyc7XG5cbmV4cG9ydCBjb25zdCBwcm9wZXJ0eVZhbGlkYXRvcnMgPSB7XG4gIGFsbDoge1xuICAgIHR5cGU6IChmaWVsZDogdHlwZXMuQ29uZmlnRmllbGQsIGNvbmZpZzogQ29uZmlnVmFsaWRhdG9yKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oZmllbGQsICd0eXBlJykgfHwgdHlwZW9mIGZpZWxkLnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgZXZlcnkgc2NoZW1hIGZpZWxkIG11c3QgaGF2ZSBhIFwidHlwZVwiIHByb3BlcnR5IG9mIHR5cGUgXCJzdHJpbmdcImBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzdXBwb3J0ZWRUeXBlcy5pbmNsdWRlcyhmaWVsZC50eXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGZpZWxkIHR5cGUgXCIke2ZpZWxkLnR5cGV9XCJgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGxhYmVsOiAoZmllbGQ6IHR5cGVzLkNvbmZpZ0ZpZWxkLCBjb25maWc6IENvbmZpZ1ZhbGlkYXRvcikgPT4ge1xuICAgICAgaWYgKE9iamVjdC5oYXNPd24oZmllbGQsICdsYWJlbCcpICYmIHR5cGVvZiBmaWVsZC5sYWJlbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcImxhYmVsXCIgcHJvcGVydHkgc2hvdWxkIGJlIGEgXCJzdHJpbmdcImApO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGVzY3JpcHRpb246IChmaWVsZDogdHlwZXMuQ29uZmlnRmllbGQsIGNvbmZpZzogQ29uZmlnVmFsaWRhdG9yKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIE9iamVjdC5oYXNPd24oZmllbGQsICdkZXNjcmlwdGlvbicpICYmXG4gICAgICAgIHR5cGVvZiBmaWVsZC5kZXNjcmlwdGlvbiAhPT0gJ3N0cmluZydcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwiZGVzY3JpcHRpb25cIiBwcm9wZXJ0eSBzaG91bGQgYmUgYSBcInN0cmluZ1wiYCk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgcHJpbWl0aXZlOiB7XG4gICAgdmFsaWRhdGlvbnM6IChmaWVsZDogdHlwZXMuUHJpbWl0aXZlRmllbGQsIGNvbmZpZzogQ29uZmlnVmFsaWRhdG9yKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oZmllbGQsICd2YWxpZGF0aW9ucycpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkLnZhbGlkYXRpb25zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1widmFsaWRhdGlvbnNcIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIGFycmF5IG9mIHZhbGlkYXRpb24gZGVzY3JpcHRpb25zJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb24gb2YgZmllbGQudmFsaWRhdGlvbnMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIE9iamVjdC5oYXNPd24odmFsaWRhdGlvbiwgJ2Vycm9yJykgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsaWRhdGlvbi5lcnJvciAhPT0gJ3N0cmluZydcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1wiZXJyb3JcIiBwcm9wZXJ0eSBvZiBhIHZhbGlkYXRpb24gZGVzY3JpcHRpb24gbXVzdCBiZSBhIHN0cmluZydcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24odmFsaWRhdGlvbiwgJ3doZW4nKSAmJiB2YWxpZGF0aW9uLndoZW4gIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIU9iamVjdC5oYXNPd24odmFsaWRhdGlvbi53aGVuLCAncGF0aCcpIHx8XG4gICAgICAgICAgICB0eXBlb2YgdmFsaWRhdGlvbi53aGVuLnBhdGggIT09ICdzdHJpbmcnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBcIndoZW5cIiBwcm9wZXJ0eSBvZiBhIHZhbGlkYXRpb24gZGVzY3JpcHRpb24gbXVzdCBoYXZlIGEgXCJwYXRoXCIgcHJvcGVydHkgb2YgdHlwZSBcInN0cmluZ1wiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuZ2V0U2NoZW1hRmllbGQodmFsaWRhdGlvbi53aGVuLnBhdGguc3BsaXQoJy4nKSkgPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBcIndoZW5cIiBwcm9wZXJ0eSBvZiBhIHZhbGlkYXRpb24gZGVzY3JpcHRpb24gaGFzIGEgbm9uLWV4aXN0ZW50IHBhdGg9WyR7dmFsaWRhdGlvbi53aGVuLnBhdGh9XWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFPYmplY3QuaGFzT3duKHZhbGlkYXRpb24ud2hlbiwgJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFwid2hlblwiIHByb3BlcnR5IG9mIGEgdmFsaWRhdGlvbiBkZXNjcmlwdGlvbiBtdXN0IGhhdmUgYSBcInZhbHVlXCIgcHJvcGVydHlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25Qcm9wZXJ0aWVzID0gT2JqZWN0LmtleXModmFsaWRhdGlvbikuZmlsdGVyKFxuICAgICAgICAgIChrZXkpID0+IGtleSAhPT0gJ3doZW4nICYmIGtleSAhPT0gJ2Vycm9yJ1xuICAgICAgICApO1xuICAgICAgICBpZiAodmFsaWRhdGlvblByb3BlcnRpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWxpZGF0aW9uIGRlc2NyaXB0aW9uIGZvcm1hdCBpcyB3cm9uZycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbk5hbWUgPSB2YWxpZGF0aW9uUHJvcGVydGllc1swXTtcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlVmFsaWRhdG9yID0gZmllbGRWYWxpZGF0aW9ucy5wcmltaXRpdmVbdmFsaWRhdGlvbk5hbWVdO1xuICAgICAgICBjb25zdCB0eXBlVmFsaWRhdG9yID0gZmllbGRWYWxpZGF0aW9uc1tmaWVsZC50eXBlXVt2YWxpZGF0aW9uTmFtZV07XG4gICAgICAgIGlmIChwcmltaXRpdmVWYWxpZGF0b3IgPT0gdW5kZWZpbmVkICYmIHR5cGVWYWxpZGF0b3IgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHZhbGlkYXRpb24gZGVzY3JpcHRpb24gaGFzIGFuIHVua25vd24gdmFsaWRhdG9yIFwiJHt2YWxpZGF0aW9uTmFtZX1cImBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByaW1pdGl2ZVZhbGlkYXRvciAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwcmltaXRpdmVWYWxpZGF0b3IodmFsaWRhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHlwZVZhbGlkYXRvcih2YWxpZGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIG9iamVjdDoge1xuICAgIGNoaWxkcmVuOiAoZmllbGQ6IHR5cGVzLk9iamVjdEZpZWxkLCBjb25maWc6IENvbmZpZ1ZhbGlkYXRvcikgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0sXG4gIH0sXG4gIHN0cmluZzoge1xuICAgIGRlZmF1bHQ6IChmaWVsZDogdHlwZXMuU3RyaW5nRmllbGQsIGNvbmZpZzogQ29uZmlnVmFsaWRhdG9yKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIE9iamVjdC5oYXNPd24oZmllbGQsICdkZWZhdWx0JykgJiZcbiAgICAgICAgdHlwZW9mIGZpZWxkLmRlZmF1bHQgIT09ICdzdHJpbmcnXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBkZWZhdWx0IHZhbHVlPVske2ZpZWxkLmRlZmF1bHR9XSBkb2Vzbid0IG1hdGNoIGZpZWxkIHR5cGU9WyR7ZmllbGQudHlwZX1dYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIGJvb2xlYW46IHtcbiAgICBkZWZhdWx0OiAoZmllbGQ6IHR5cGVzLkJvb2xlYW5GaWVsZCwgY29uZmlnOiBDb25maWdWYWxpZGF0b3IpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgT2JqZWN0Lmhhc093bihmaWVsZCwgJ2RlZmF1bHQnKSAmJlxuICAgICAgICB0eXBlb2YgZmllbGQuZGVmYXVsdCAhPT0gJ2Jvb2xlYW4nXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBkZWZhdWx0IHZhbHVlPVske2ZpZWxkLmRlZmF1bHR9XSBkb2Vzbid0IG1hdGNoIGZpZWxkIHR5cGU9WyR7ZmllbGQudHlwZX1dYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIG51bWJlcjoge1xuICAgIGRlZmF1bHQ6IChmaWVsZDogdHlwZXMuTnVtYmVyRmllbGQsIGNvbmZpZzogQ29uZmlnVmFsaWRhdG9yKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIE9iamVjdC5oYXNPd24oZmllbGQsICdkZWZhdWx0JykgJiZcbiAgICAgICAgdHlwZW9mIGZpZWxkLmRlZmF1bHQgIT09ICdudW1iZXInXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBkZWZhdWx0IHZhbHVlPVske2ZpZWxkLmRlZmF1bHR9XSBkb2Vzbid0IG1hdGNoIGZpZWxkIHR5cGU9WyR7ZmllbGQudHlwZX1dYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIGJpZ2ludDoge1xuICAgIGRlZmF1bHQ6IChmaWVsZDogdHlwZXMuQmlnSW50RmllbGQsIGNvbmZpZzogQ29uZmlnVmFsaWRhdG9yKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIE9iamVjdC5oYXNPd24oZmllbGQsICdkZWZhdWx0JykgJiZcbiAgICAgICAgdHlwZW9mIGZpZWxkLmRlZmF1bHQgIT09ICdiaWdpbnQnXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBkZWZhdWx0IHZhbHVlPVske2ZpZWxkLmRlZmF1bHR9XSBkb2Vzbid0IG1hdGNoIGZpZWxkIHR5cGU9WyR7ZmllbGQudHlwZX1dYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgc3VwcG9ydGVkVHlwZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbGlkYXRvcnMpLmZpbHRlcihcbiAgKGtleSkgPT4ga2V5ICE9PSAnYWxsJyAmJiBrZXkgIT09ICdwcmltaXRpdmUnXG4pO1xuXG5jb25zdCBmaWVsZFZhbGlkYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgcHJpbWl0aXZlOiB7XG4gICAgcmVxdWlyZWQ6ICh2YWxpZGF0aW9uOiBWQWxsKSA9PiB7XG4gICAgICBpZiAoISgncmVxdWlyZWQnIGluIHZhbGlkYXRpb24pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0aW9uLnJlcXVpcmVkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcInJlcXVpcmVkXCIgdmFsaWRhdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYSBib29sZWFuYCk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgc3RyaW5nOiB7XG4gICAgcmVnZXg6ICh2YWxpZGF0aW9uOiBWU3RyaW5nKSA9PiB7XG4gICAgICBpZiAoISgncmVnZXgnIGluIHZhbGlkYXRpb24pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGlvbi5yZWdleCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcInJlZ2V4XCIgdmFsaWRhdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYSBzdHJpbmdgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNob2ljZXM6ICh2YWxpZGF0aW9uOiBWU3RyaW5nKSA9PiB7XG4gICAgICBpZiAoISgnY2hvaWNlcycgaW4gdmFsaWRhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbGlkYXRpb24uY2hvaWNlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBcImNob2ljZXNcIiB2YWxpZGF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSBhbiBcImFycmF5XCIgb2Ygc3RyaW5nc2BcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBjaG9pY2Ugb2YgdmFsaWRhdGlvbi5jaG9pY2VzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2hvaWNlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBcImNob2ljZXNcIiB2YWxpZGF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSBhbiBhcnJheSBvZiBcInN0cmluZ3NcImBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgbnVtYmVyOiB7XG4gICAgZ3Q6ICh2YWxpZGF0aW9uOiBWTnVtZXJpYzxudW1iZXI+KSA9PiB7XG4gICAgICBpZiAoISgnZ3QnIGluIHZhbGlkYXRpb24pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGlvbi5ndCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcImd0XCIgdmFsaWRhdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYSBudW1iZXJgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGd0ZTogKHZhbGlkYXRpb246IFZOdW1lcmljPG51bWJlcj4pID0+IHtcbiAgICAgIGlmICghKCdndGUnIGluIHZhbGlkYXRpb24pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGlvbi5ndGUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJndGVcIiB2YWxpZGF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSBhIG51bWJlcmApO1xuICAgICAgfVxuICAgIH0sXG4gICAgbHQ6ICh2YWxpZGF0aW9uOiBWTnVtZXJpYzxudW1iZXI+KSA9PiB7XG4gICAgICBpZiAoISgnbHQnIGluIHZhbGlkYXRpb24pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0aW9uLmx0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwibHRcIiB2YWxpZGF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSBhIG51bWJlcmApO1xuICAgICAgfVxuICAgIH0sXG4gICAgbHRlOiAodmFsaWRhdGlvbjogVk51bWVyaWM8bnVtYmVyPikgPT4ge1xuICAgICAgaWYgKCEoJ2x0ZScgaW4gdmFsaWRhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbGlkYXRpb24ubHRlICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwibHRlXCIgdmFsaWRhdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYSBudW1iZXJgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBiaWdpbnQ6IHtcbiAgICBndDogKHZhbGlkYXRpb246IFZOdW1lcmljPGJpZ2ludD4pID0+IHtcbiAgICAgIGlmICghKCdndCcgaW4gdmFsaWRhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbGlkYXRpb24uZ3QgIT09ICdiaWdpbnQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJndFwiIHZhbGlkYXRpb24gcHJvcGVydHkgc2hvdWxkIGJlIGEgYmlnaW50YCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBndGU6ICh2YWxpZGF0aW9uOiBWTnVtZXJpYzxiaWdpbnQ+KSA9PiB7XG4gICAgICBpZiAoISgnZ3RlJyBpbiB2YWxpZGF0aW9uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbGlkYXRpb24uZ3RlICE9PSAnYmlnaW50Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwiZ3RlXCIgdmFsaWRhdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYSBiaWdpbnRgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGx0OiAodmFsaWRhdGlvbjogVk51bWVyaWM8YmlnaW50PikgPT4ge1xuICAgICAgaWYgKCEoJ2x0JyBpbiB2YWxpZGF0aW9uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbGlkYXRpb24ubHQgIT09ICdiaWdpbnQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJsdFwiIHZhbGlkYXRpb24gcHJvcGVydHkgc2hvdWxkIGJlIGEgYmlnaW50YCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBsdGU6ICh2YWxpZGF0aW9uOiBWTnVtZXJpYzxiaWdpbnQ+KSA9PiB7XG4gICAgICBpZiAoISgnbHRlJyBpbiB2YWxpZGF0aW9uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbGlkYXRpb24ubHRlICE9PSAnYmlnaW50Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwibHRlXCIgdmFsaWRhdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYSBiaWdpbnRgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxufTtcbiJdfQ==
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRQcm9wZXJ0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3NjaGVtYS9WYWxpZGF0b3JzL2ZpZWxkUHJvcGVydGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRztJQUNoQyxHQUFHLEVBQUU7UUFDSCxJQUFJLEVBQUUsQ0FBQyxLQUF3QixFQUFFLE1BQXVCLEVBQUUsRUFBRTtZQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDbkUsTUFBTSxJQUFJLEtBQUssQ0FDYixpRUFBaUUsQ0FDbEUsQ0FBQzthQUNIO1lBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzthQUMzRDtRQUNILENBQUM7UUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUF3QixFQUFFLE1BQXVCLEVBQUUsRUFBRTtZQUMzRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0JBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQzthQUMxRDtRQUNILENBQUM7UUFDRCxXQUFXLEVBQUUsQ0FBQyxLQUF3QixFQUFFLE1BQXVCLEVBQUUsRUFBRTtZQUNqRSxJQUNFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQztnQkFDbkMsT0FBTyxLQUFLLENBQUMsV0FBVyxLQUFLLFFBQVEsRUFDckM7Z0JBQ0EsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FB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RyxLQUFLLFFBQVEsRUFBRTtnQkFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO2FBQ2pFO1FBQ0gsQ0FBQztRQUNELEVBQUUsRUFBRSxDQUFDLFVBQTRCLEVBQUUsRUFBRTtZQUNuQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLEVBQUU7Z0JBQ3pCLE9BQU87YUFDUjtZQUNELElBQUksT0FBTyxVQUFVLENBQUMsRUFBRSxLQUFLLFFBQVEsRUFBRTtnQkFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO2FBQ2hFO1FBQ0gsQ0FBQztRQUNELEdBQUcsRUFBRSxDQUFDLFVBQTRCLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUU7Z0JBQzFCLE9BQU87YUFDUjtZQUNELElBQUksT0FBTyxVQUFVLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRTtnQkFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO2FBQ2pFO1FBQ0gsQ0FBQztLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmZpZ1ZhbGlkYXRvciB9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tICcuLi90eXBlcy9maWVsZHMnO1xuaW1wb3J0IHsgVkFsbCwgVk51bWVyaWMsIFZTdHJpbmcgfSBmcm9tICcuLi90eXBlcy92YWxpZGF0aW9ucyc7XG5cbmV4cG9ydCBjb25zdCBwcm9wZXJ0eVZhbGlkYXRvcnMgPSB7XG4gIGFsbDoge1xuICAgIHR5cGU6IChmaWVsZDogdHlwZXMuQ29uZmlnRmllbGQsIGNvbmZpZzogQ29uZmlnVmFsaWRhdG9yKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oZmllbGQsICd0eXBlJykgfHwgdHlwZW9mIGZpZWxkLnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgZXZlcnkgc2NoZW1hIGZpZWxkIG11c3QgaGF2ZSBhIFwidHlwZVwiIHByb3BlcnR5IG9mIHR5cGUgXCJzdHJpbmdcImBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzdXBwb3J0ZWRUeXBlcy5pbmNsdWRlcyhmaWVsZC50eXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGZpZWxkIHR5cGUgXCIke2ZpZWxkLnR5cGV9XCJgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGxhYmVsOiAoZmllbGQ6IHR5cGVzLkNvbmZpZ0ZpZWxkLCBjb25maWc6IENvbmZpZ1ZhbGlkYXRvcikgPT4ge1xuICAgICAgaWYgKE9iamVjdC5oYXNPd24oZmllbGQsICdsYWJlbCcpICYmIHR5cGVvZiBmaWVsZC5sYWJlbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcImxhYmVsXCIgcHJvcGVydHkgc2hvdWxkIGJlIGEgXCJzdHJpbmdcImApO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGVzY3JpcHRpb246IChmaWVsZDogdHlwZXMuQ29uZmlnRmllbGQsIGNvbmZpZzogQ29uZmlnVmFsaWRhdG9yKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIE9iamVjdC5oYXNPd24oZmllbGQsICdkZXNjcmlwdGlvbicpICYmXG4gICAgICAgIHR5cGVvZiBmaWVsZC5kZXNjcmlwdGlvbiAhPT0gJ3N0cmluZydcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwiZGVzY3JpcHRpb25cIiBwcm9wZXJ0eSBzaG91bGQgYmUgYSBcInN0cmluZ1wiYCk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgcHJpbWl0aXZlOiB7XG4gICAgdmFsaWRhdGlvbnM6IChmaWVsZDogdHlwZXMuUHJpbWl0aXZlRmllbGQsIGNvbmZpZzogQ29uZmlnVmFsaWRhdG9yKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oZmllbGQsICd2YWxpZGF0aW9ucycpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkLnZhbGlkYXRpb25zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1widmFsaWRhdGlvbnNcIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIGFycmF5IG9mIHZhbGlkYXRpb24gZGVzY3JpcHRpb25zJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb24gb2YgZmllbGQudmFsaWRhdGlvbnMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIE9iamVjdC5oYXNPd24odmFsaWRhdGlvbiwgJ2Vycm9yJykgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsaWRhdGlvbi5lcnJvciAhPT0gJ3N0cmluZydcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1wiZXJyb3JcIiBwcm9wZXJ0eSBvZiBhIHZhbGlkYXRpb24gZGVzY3JpcHRpb24gbXVzdCBiZSBhIHN0cmluZydcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24odmFsaWRhdGlvbiwgJ3doZW4nKSAmJiB2YWxpZGF0aW9uLndoZW4gIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIU9iamVjdC5oYXNPd24odmFsaWRhdGlvbi53aGVuLCAncGF0aCcpIHx8XG4gICAgICAgICAgICB0eXBlb2YgdmFsaWRhdGlvbi53aGVuLnBhdGggIT09ICdzdHJpbmcnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBcIndoZW5cIiBwcm9wZXJ0eSBvZiBhIHZhbGlkYXRpb24gZGVzY3JpcHRpb24gbXVzdCBoYXZlIGEgXCJwYXRoXCIgcHJvcGVydHkgb2YgdHlwZSBcInN0cmluZ1wiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuZ2V0U2NoZW1hRmllbGQodmFsaWRhdGlvbi53aGVuLnBhdGguc3BsaXQoJy4nKSkgPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBcIndoZW5cIiBwcm9wZXJ0eSBvZiBhIHZhbGlkYXRpb24gZGVzY3JpcHRpb24gaGFzIGEgbm9uLWV4aXN0ZW50IHBhdGg9WyR7dmFsaWRhdGlvbi53aGVuLnBhdGh9XWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFPYmplY3QuaGFzT3duKHZhbGlkYXRpb24ud2hlbiwgJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFwid2hlblwiIHByb3BlcnR5IG9mIGEgdmFsaWRhdGlvbiBkZXNjcmlwdGlvbiBtdXN0IGhhdmUgYSBcInZhbHVlXCIgcHJvcGVydHlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25Qcm9wZXJ0aWVzID0gT2JqZWN0LmtleXModmFsaWRhdGlvbikuZmlsdGVyKFxuICAgICAgICAgIChrZXkpID0+IGtleSAhPT0gJ3doZW4nICYmIGtleSAhPT0gJ2Vycm9yJ1xuICAgICAgICApO1xuICAgICAgICBpZiAodmFsaWRhdGlvblByb3BlcnRpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWxpZGF0aW9uIGRlc2NyaXB0aW9uIGZvcm1hdCBpcyB3cm9uZycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbk5hbWUgPSB2YWxpZGF0aW9uUHJvcGVydGllc1swXTtcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlVmFsaWRhdG9yID0gZmllbGRWYWxpZGF0aW9ucy5wcmltaXRpdmVbdmFsaWRhdGlvbk5hbWVdO1xuICAgICAgICBjb25zdCB0eXBlVmFsaWRhdG9yID0gZmllbGRWYWxpZGF0aW9uc1tmaWVsZC50eXBlXVt2YWxpZGF0aW9uTmFtZV07XG4gICAgICAgIGlmIChwcmltaXRpdmVWYWxpZGF0b3IgPT0gdW5kZWZpbmVkICYmIHR5cGVWYWxpZGF0b3IgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHZhbGlkYXRpb24gZGVzY3JpcHRpb24gaGFzIGFuIHVua25vd24gdmFsaWRhdG9yIFwiJHt2YWxpZGF0aW9uTmFtZX1cImBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByaW1pdGl2ZVZhbGlkYXRvciAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwcmltaXRpdmVWYWxpZGF0b3IodmFsaWRhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHlwZVZhbGlkYXRvcih2YWxpZGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIG9iamVjdDoge1xuICAgIGNoaWxkcmVuOiAoZmllbGQ6IHR5cGVzLk9iamVjdEZpZWxkLCBjb25maWc6IENvbmZpZ1ZhbGlkYXRvcikgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhT2JqZWN0Lmhhc093bihmaWVsZCwgJ2NoaWxkcmVuJykgfHxcbiAgICAgICAgdHlwZW9mIGZpZWxkLmNoaWxkcmVuICE9PSAnb2JqZWN0J1xuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgb2JqZWN0IGZpZWxkIHR5cGUgbXVzdCBoYXZlIGEgXCJjaGlsZHJlblwiIHByb3BlcnR5IG9mIHR5cGUgXCJvYmplY3RcImBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9LFxuICB9LFxuICBhcnJheToge1xuICAgIGl0ZW1zOiAoZmllbGQ6IHR5cGVzLkFycmF5RmllbGQsIGNvbmZpZzogQ29uZmlnVmFsaWRhdG9yKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oZmllbGQsICdpdGVtcycpIHx8IHR5cGVvZiBmaWVsZC5pdGVtcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBhcnJheSBmaWVsZCB0eXBlIG11c3QgaGF2ZSBhIFwiaXRlbXNcIiBwcm9wZXJ0eSBvZiB0eXBlIFwib2JqZWN0XCJgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgc3RyaW5nOiB7XG4gICAgZGVmYXVsdDogKGZpZWxkOiB0eXBlcy5TdHJpbmdGaWVsZCwgY29uZmlnOiBDb25maWdWYWxpZGF0b3IpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgT2JqZWN0Lmhhc093bihmaWVsZCwgJ2RlZmF1bHQnKSAmJlxuICAgICAgICB0eXBlb2YgZmllbGQuZGVmYXVsdCAhPT0gJ3N0cmluZydcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGRlZmF1bHQgdmFsdWU9WyR7ZmllbGQuZGVmYXVsdH1dIGRvZXNuJ3QgbWF0Y2ggZmllbGQgdHlwZT1bJHtmaWVsZC50eXBlfV1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgYm9vbGVhbjoge1xuICAgIGRlZmF1bHQ6IChmaWVsZDogdHlwZXMuQm9vbGVhbkZpZWxkLCBjb25maWc6IENvbmZpZ1ZhbGlkYXRvcikgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBPYmplY3QuaGFzT3duKGZpZWxkLCAnZGVmYXVsdCcpICYmXG4gICAgICAgIHR5cGVvZiBmaWVsZC5kZWZhdWx0ICE9PSAnYm9vbGVhbidcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGRlZmF1bHQgdmFsdWU9WyR7ZmllbGQuZGVmYXVsdH1dIGRvZXNuJ3QgbWF0Y2ggZmllbGQgdHlwZT1bJHtmaWVsZC50eXBlfV1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgbnVtYmVyOiB7XG4gICAgZGVmYXVsdDogKGZpZWxkOiB0eXBlcy5OdW1iZXJGaWVsZCwgY29uZmlnOiBDb25maWdWYWxpZGF0b3IpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgT2JqZWN0Lmhhc093bihmaWVsZCwgJ2RlZmF1bHQnKSAmJlxuICAgICAgICB0eXBlb2YgZmllbGQuZGVmYXVsdCAhPT0gJ251bWJlcidcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGRlZmF1bHQgdmFsdWU9WyR7ZmllbGQuZGVmYXVsdH1dIGRvZXNuJ3QgbWF0Y2ggZmllbGQgdHlwZT1bJHtmaWVsZC50eXBlfV1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgYmlnaW50OiB7XG4gICAgZGVmYXVsdDogKGZpZWxkOiB0eXBlcy5CaWdJbnRGaWVsZCwgY29uZmlnOiBDb25maWdWYWxpZGF0b3IpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgT2JqZWN0Lmhhc093bihmaWVsZCwgJ2RlZmF1bHQnKSAmJlxuICAgICAgICB0eXBlb2YgZmllbGQuZGVmYXVsdCAhPT0gJ2JpZ2ludCdcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGRlZmF1bHQgdmFsdWU9WyR7ZmllbGQuZGVmYXVsdH1dIGRvZXNuJ3QgbWF0Y2ggZmllbGQgdHlwZT1bJHtmaWVsZC50eXBlfV1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBzdXBwb3J0ZWRUeXBlcyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsaWRhdG9ycykuZmlsdGVyKFxuICAoa2V5KSA9PiBrZXkgIT09ICdhbGwnICYmIGtleSAhPT0gJ3ByaW1pdGl2ZSdcbik7XG5cbmNvbnN0IGZpZWxkVmFsaWRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBwcmltaXRpdmU6IHtcbiAgICByZXF1aXJlZDogKHZhbGlkYXRpb246IFZBbGwpID0+IHtcbiAgICAgIGlmICghKCdyZXF1aXJlZCcgaW4gdmFsaWRhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbGlkYXRpb24ucmVxdWlyZWQgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwicmVxdWlyZWRcIiB2YWxpZGF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSBhIGJvb2xlYW5gKTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBzdHJpbmc6IHtcbiAgICByZWdleDogKHZhbGlkYXRpb246IFZTdHJpbmcpID0+IHtcbiAgICAgIGlmICghKCdyZWdleCcgaW4gdmFsaWRhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0aW9uLnJlZ2V4ICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwicmVnZXhcIiB2YWxpZGF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSBhIHN0cmluZ2ApO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2hvaWNlczogKHZhbGlkYXRpb246IFZTdHJpbmcpID0+IHtcbiAgICAgIGlmICghKCdjaG9pY2VzJyBpbiB2YWxpZGF0aW9uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsaWRhdGlvbi5jaG9pY2VzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFwiY2hvaWNlc1wiIHZhbGlkYXRpb24gcHJvcGVydHkgc2hvdWxkIGJlIGFuIFwiYXJyYXlcIiBvZiBzdHJpbmdzYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNob2ljZSBvZiB2YWxpZGF0aW9uLmNob2ljZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaG9pY2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFwiY2hvaWNlc1wiIHZhbGlkYXRpb24gcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5IG9mIFwic3RyaW5nc1wiYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBib29sZWFuOiB7fSxcbiAgbnVtYmVyOiB7XG4gICAgZ3Q6ICh2YWxpZGF0aW9uOiBWTnVtZXJpYzxudW1iZXI+KSA9PiB7XG4gICAgICBpZiAoISgnZ3QnIGluIHZhbGlkYXRpb24pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGlvbi5ndCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcImd0XCIgdmFsaWRhdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYSBudW1iZXJgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGd0ZTogKHZhbGlkYXRpb246IFZOdW1lcmljPG51bWJlcj4pID0+IHtcbiAgICAgIGlmICghKCdndGUnIGluIHZhbGlkYXRpb24pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGlvbi5ndGUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJndGVcIiB2YWxpZGF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSBhIG51bWJlcmApO1xuICAgICAgfVxuICAgIH0sXG4gICAgbHQ6ICh2YWxpZGF0aW9uOiBWTnVtZXJpYzxudW1iZXI+KSA9PiB7XG4gICAgICBpZiAoISgnbHQnIGluIHZhbGlkYXRpb24pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0aW9uLmx0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwibHRcIiB2YWxpZGF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSBhIG51bWJlcmApO1xuICAgICAgfVxuICAgIH0sXG4gICAgbHRlOiAodmFsaWRhdGlvbjogVk51bWVyaWM8bnVtYmVyPikgPT4ge1xuICAgICAgaWYgKCEoJ2x0ZScgaW4gdmFsaWRhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbGlkYXRpb24ubHRlICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwibHRlXCIgdmFsaWRhdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYSBudW1iZXJgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBiaWdpbnQ6IHtcbiAgICBndDogKHZhbGlkYXRpb246IFZOdW1lcmljPGJpZ2ludD4pID0+IHtcbiAgICAgIGlmICghKCdndCcgaW4gdmFsaWRhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbGlkYXRpb24uZ3QgIT09ICdiaWdpbnQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJndFwiIHZhbGlkYXRpb24gcHJvcGVydHkgc2hvdWxkIGJlIGEgYmlnaW50YCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBndGU6ICh2YWxpZGF0aW9uOiBWTnVtZXJpYzxiaWdpbnQ+KSA9PiB7XG4gICAgICBpZiAoISgnZ3RlJyBpbiB2YWxpZGF0aW9uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbGlkYXRpb24uZ3RlICE9PSAnYmlnaW50Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwiZ3RlXCIgdmFsaWRhdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYSBiaWdpbnRgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGx0OiAodmFsaWRhdGlvbjogVk51bWVyaWM8YmlnaW50PikgPT4ge1xuICAgICAgaWYgKCEoJ2x0JyBpbiB2YWxpZGF0aW9uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbGlkYXRpb24ubHQgIT09ICdiaWdpbnQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJsdFwiIHZhbGlkYXRpb24gcHJvcGVydHkgc2hvdWxkIGJlIGEgYmlnaW50YCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBsdGU6ICh2YWxpZGF0aW9uOiBWTnVtZXJpYzxiaWdpbnQ+KSA9PiB7XG4gICAgICBpZiAoISgnbHRlJyBpbiB2YWxpZGF0aW9uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbGlkYXRpb24ubHRlICE9PSAnYmlnaW50Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwibHRlXCIgdmFsaWRhdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYSBiaWdpbnRgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxufTtcbiJdfQ==