@mediusinc/mng-commons-data-api 6.0.0-rc.4 → 6.0.0-rc.6

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.
@@ -1,377 +0,0 @@
1
- import { CommonsInternalError, fromAngularDateFormatToPrime } from '@mediusinc/mng-commons/core';
2
- import { EnumDescriptor } from '@mediusinc/mng-commons/model';
3
- import { FieldInputDescriptor, TableviewDescriptorInst } from '@mediusinc/mng-commons/tableview/api';
4
- import { enumModelFromSchema } from './enum-from-schema';
5
- import { fromSchemaFilterNonArrayProperties } from './internal/common-from-schema';
6
- /**
7
- * <em>Experimental:</em> Builder for adding fields to editor.
8
- *
9
- * @experimental
10
- */
11
- export class SchemaFieldsBuilder {
12
- constructor(descriptor, schema, opts) {
13
- this.descriptor = descriptor;
14
- this.schema = schema;
15
- this.opts = opts;
16
- }
17
- mergeFieldsInputOpts(property, opts) {
18
- return {
19
- ...this.opts,
20
- fieldType: opts?.fieldTypes?.[property] ?? this.opts?.fieldTypes?.[property],
21
- enumModel: opts?.enumModels?.[property] ?? this.opts?.enumModels?.[property],
22
- enumSchema: opts?.enumSchemas?.[property] ?? this.opts?.enumSchemas?.[property],
23
- ...opts
24
- };
25
- }
26
- mergeFieldInputOpts(property, opts) {
27
- return {
28
- ...this.opts,
29
- fieldType: this.opts?.fieldTypes?.[property],
30
- enumModel: this.opts?.enumModels?.[property],
31
- enumSchema: this.opts?.enumSchemas?.[property],
32
- ...opts
33
- };
34
- }
35
- /**
36
- * <em>Experimental:</em> Adds a single input field via {addFieldInputFromSchema}.
37
- *
38
- * @experimental
39
- *
40
- * @param {Property} property - The property to add the field for.
41
- * @param {FieldInputFromSchemaOptsType<SchModel>} opts - Additional options.
42
- *
43
- * @return {FieldInputDescriptor<Model, NonNullable<Model[Property]>, Model[Property], Parent>} The added field descriptor.
44
- */
45
- add(property, opts) {
46
- return addFieldInputFromSchema(this.descriptor, property, this.schema.properties[property], this.mergeFieldInputOpts(property, opts));
47
- }
48
- /**
49
- * <em>Experimental:</em> Adds all input fields for the non-array properties via {addFieldInputFromSchema}.
50
- *
51
- * @experimental
52
- *
53
- * @param {FieldsFromSchemaOptsType<SchModel>} opts - Additional options.
54
- *
55
- * @return {this} - The current instance of the builder.
56
- */
57
- withAddAll(opts) {
58
- this.addFields(undefined, opts);
59
- return this;
60
- }
61
- withAdd(propOrOpts, ...properties) {
62
- if (typeof propOrOpts === 'object') {
63
- this.addFields(properties.length === 0 ? undefined : properties, propOrOpts);
64
- }
65
- else {
66
- this.addFields(propOrOpts === undefined ? properties : [propOrOpts, ...properties]);
67
- }
68
- return this;
69
- }
70
- addFields(properties, opts) {
71
- const addProperties = properties ?? fromSchemaFilterNonArrayProperties(this.schema.properties);
72
- addProperties.forEach(property => {
73
- addFieldInputFromSchema(this.descriptor, property, this.schema.properties[property], this.mergeFieldsInputOpts(property, opts));
74
- });
75
- }
76
- /**
77
- * <em>Experimental:</em> Adds a single input field via {addFieldInputFromSchema} where property schema is manually provided.
78
- *
79
- * @experimental
80
- *
81
- * @param {Property} property - The property to add the field for.
82
- * @param {SchemaProperty} schemaProperty - Manually provided schema property.
83
- * @param {FieldInputFromSchemaOptsType<Model>} opts - Additional options.
84
- *
85
- * @return {FieldInputDescriptor<Model, NonNullable<Model[Property]>, Model[Property], Parent>} The added field descriptor.
86
- */
87
- addFromSchema(property, schemaProperty, opts) {
88
- return addFieldInputFromSchema(this.descriptor, property, schemaProperty, this.mergeFieldInputOpts(property, opts));
89
- }
90
- /**
91
- * <em>Experimental:</em> Adds an enum lookup field via {addFieldEnumLookupFromSchema}.
92
- *
93
- * @experimental
94
- *
95
- * @param {Property} property - The property to add the enum lookup field for.
96
- * @param {SchemaEnum<Enum> | EnumDescriptor<Enum>} [enumOpt] - The enum schema or the enum model descriptor. If non provided, builder opts will be checked.
97
- *
98
- * @returns {FieldLookupEnumDescriptor<Enum, Model, Parent>} - The added field descriptor.
99
- *
100
- * @throws {CommonsInternalError} - If no enum metadata is found for the property either from parameter or from builder's opts.
101
- */
102
- addEnum(property, enumOpt) {
103
- if (!enumOpt) {
104
- enumOpt = this.opts?.enumModels?.[property] ?? this.opts?.enumSchemas?.[property];
105
- }
106
- if (!enumOpt) {
107
- throw new CommonsInternalError(`Enum lookup field for property ${property} cannot be added because enum metadata was not provided.`);
108
- }
109
- return addFieldEnumLookupFromSchema(this.descriptor, property, enumOpt, this.schema.properties[property]);
110
- }
111
- /**
112
- * <em>Experimental:</em> Adds an enum lookup field via {addFieldEnumLookupFromSchema} where property schema is manually provided.
113
- *
114
- * @experimental
115
- *
116
- * @param {Property} property - The property to add the enum lookup field for.
117
- * @param {SchemaEnum<Enum> | EnumDescriptor<Enum>} [enumOpt] - The enum schema or the enum model descriptor. If non provided, builder opts will be checked.
118
- * @param {SchemaProperty} schemaProperty - Manually provided schema property.
119
- *
120
- * @returns {FieldLookupEnumDescriptor<Enum, Model, Parent>} - The added field descriptor.
121
- *
122
- * @throws {CommonsInternalError} - If no enum metadata is found for the property either from parameter or from builder's opts.
123
- */
124
- addEnumFromSchema(property, enumOpt, schemaProperty) {
125
- if (!enumOpt) {
126
- enumOpt = this.opts?.enumModels?.[property] ?? this.opts?.enumSchemas?.[property];
127
- }
128
- if (!enumOpt) {
129
- throw new CommonsInternalError(`Enum lookup field for property ${property} cannot be added because enum metadata was not provided.`);
130
- }
131
- return addFieldEnumLookupFromSchema(this.descriptor, property, enumOpt, schemaProperty);
132
- }
133
- /**
134
- * <em>Experimental:</em> Adds a lookup field.
135
- * {EditorDescriptorInt.addFieldLookup} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
136
- *
137
- * @experimental
138
- *
139
- * @param {Property} property - The property to create the lookup field for.
140
- * @param {FieldLookupProviderType<LookupModel, Service>} provider - Data provider for the lookup field.
141
- *
142
- * @return The created lookup field.
143
- */
144
- addLookup(property, provider) {
145
- const field = this.descriptor.addFieldLookup(property, { serviceProvider: provider });
146
- setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
147
- return field;
148
- }
149
- /**
150
- * <em>Experimental:</em> Adds a lookup field where property schema is manually provided.
151
- * {EditorDescriptorInt.addFieldLookup} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
152
- *
153
- * @experimental
154
- *
155
- * @param {Property} property - The property to create the lookup field for.
156
- * @param {FieldLookupProviderType<LookupModel, Service> | undefined} provider - Data provider for the lookup field.
157
- * @param {SchemaProperty} schemaProperty - Manually provided schema property.
158
- *
159
- * @return The created lookup field.
160
- */
161
- addLookupFromSchema(property, provider, schemaProperty) {
162
- const field = this.descriptor.addFieldLookup(property, { serviceProvider: provider });
163
- setFieldBasicOptionsFromSchema(field, schemaProperty);
164
- return field;
165
- }
166
- /**
167
- * <em>Experimental:</em> Adds a one-to-many editor field.
168
- * {EditorDescriptorInt.addFieldManyEditor} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
169
- *
170
- * @experimental
171
- *
172
- * @param {Property} property - The property to create the many editor field for.
173
- * @param {TableviewDescriptorInst<FieldModel, any, any, FieldsModel>} tableviewDescriptor - Tableview descriptor.
174
- *
175
- * @return The created one-to-many editor field.
176
- */
177
- addManyEditor(property, tableviewDescriptor) {
178
- const field = this.descriptor.addFieldManyEditor(property, tableviewDescriptor);
179
- setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
180
- return field;
181
- }
182
- /**
183
- * <em>Experimental:</em> Adds an one-to-many editor field where property schema is manually provided.
184
- * {EditorDescriptorInt.addFieldManyEditor} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
185
- *
186
- * @experimental
187
- *
188
- * @param {Property} property - The property to create the many editor field for.
189
- * @param {TableviewDescriptorType<FieldModel, any, any, FieldsModel>} tableviewDescriptor - Tableview descriptor.
190
- * @param {SchemaProperty} schemaProperty - Manually provided schema property.
191
- *
192
- * @return The created one-to-many editor field.
193
- */
194
- addManyEditorFromSchema(property, tableviewDescriptor, schemaProperty) {
195
- const field = this.descriptor.addFieldManyEditor(property, tableviewDescriptor);
196
- setFieldBasicOptionsFromSchema(field, schemaProperty);
197
- return field;
198
- }
199
- /**
200
- * <em>Experimental:</em> Adds a many-to-many editor field.
201
- * {EditorDescriptorInt.addFieldManyToManyEditor} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
202
- *
203
- * @experimental
204
- *
205
- * @param {Property} property - The property to create the many editor field for.
206
- * @param {TableDescriptorInst<FieldModel>} mainTableDescriptor - Main table descriptor.
207
- * @param {TableDescriptorInst<FieldModel>} lookupTableDescriptor - Lookup table descriptor.
208
- * @param {ITableDataProvider<FieldModel, ServiceType>} lookupDataProvider - Lookup data provider.
209
- *
210
- * @return The created many-to-many editor field.
211
- */
212
- addManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider) {
213
- const field = this.descriptor.addFieldManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider);
214
- setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
215
- return field;
216
- }
217
- /**
218
- * <em>Experimental:</em> Adds a many-to-many editor field where property schema is manually provided.
219
- * {EditorDescriptorInt.addFieldManyToManyEditor} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
220
- *
221
- * @experimental
222
- *
223
- * @param {Property} property - The property to create the many editor field for.
224
- * @param {TableDescriptorInst<FieldModel>} mainTableDescriptor - Main table descriptor.
225
- * @param {TableDescriptorInst<FieldModel>} lookupTableDescriptor - Lookup table descriptor.
226
- * @param {ITableDataProvider<FieldModel, ServiceType>} lookupDataProvider - Lookup data provider.
227
- * @param {SchemaProperty} schemaProperty - Manually provided schema property.
228
- *
229
- * @return The created many-to-many editor field.
230
- */
231
- addManyToManyEditorFromSchema(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider, schemaProperty) {
232
- const field = this.descriptor.addFieldManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider);
233
- setFieldBasicOptionsFromSchema(field, schemaProperty);
234
- return field;
235
- }
236
- }
237
- /**
238
- * <em>Experimental:</em> Creates builder for adding fields to descriptor based on provided model schema.
239
- *
240
- * @experimental
241
- *
242
- * @param {TableviewDescriptorInst<Model, any, any, Parent, any, AddModel, EditModel, FieldsModel> | EditorDescriptorInst<Model, Parent>} descriptor - Descriptor to add fields to.
243
- * @param {SchemaModel<SchModel>} schema - The schema with metadata about properties for fields.
244
- * @param {FieldsFromSchemaOptsType<SchModel>} [opts] - Additional options.
245
- *
246
- * @return {SchemaFieldsBuilder<Model, Parent, AddModel, EditModel , FieldsModel, SchModel>} - The SchemaFieldsBuilder object containing the extracted fields.
247
- */
248
- export function fieldsFromSchema(descriptor, schema, opts) {
249
- return new SchemaFieldsBuilder(descriptor, schema, opts);
250
- }
251
- /**
252
- * <em>Experimental:</em> Adds a field input to editor descriptor based on the given schema property and options.
253
- *
254
- * @experimental
255
- *
256
- * @param {TableviewDescriptorInst | EditorDescriptorInst} descriptor - Descriptor to add field to.
257
- * @param {keyof Model} property - The property of the model.
258
- * @param {SchemaProperty} propertySchema - The property's schema for the field.
259
- * @param {FieldInputFromSchemaOptsType<Model>} [opts] - Additional options.
260
- *
261
- * @return {FieldInputDescriptor<Model, NonNullable<Model[Property]>, Model[Property], Parent>} - The generated field input descriptor.
262
- */
263
- export function addFieldInputFromSchema(descriptor, property, propertySchema, opts) {
264
- const propertyType = opts?.fieldType ?? propertySchema.type;
265
- const field = new FieldInputDescriptor(property);
266
- if (descriptor instanceof TableviewDescriptorInst) {
267
- descriptor.addFieldDescriptor(field);
268
- }
269
- else {
270
- descriptor.addFieldDescriptor(field);
271
- }
272
- // Handle different property types
273
- switch (propertyType) {
274
- case 'number':
275
- field.asNumber();
276
- break;
277
- case 'currency':
278
- field.asCurrency({
279
- currency: opts?.currency,
280
- currencyDisplay: opts?.currencyDisplay,
281
- currencyProperty: opts?.currencyProperty
282
- });
283
- break;
284
- case 'boolean':
285
- field.asSwitch();
286
- break;
287
- case 'text':
288
- case 'string':
289
- field.asText();
290
- break;
291
- case 'textarea':
292
- field.asTextarea();
293
- break;
294
- case 'date':
295
- field.asDatePicker({ format: opts?.dateFormat ? fromAngularDateFormatToPrime(opts.dateFormat) : undefined });
296
- break;
297
- case 'date-time':
298
- field.asDatePicker({ showTime: true, format: opts?.dateTimeFormat ? fromAngularDateFormatToPrime(opts.dateTimeFormat) : undefined });
299
- break;
300
- case 'enum':
301
- // eslint-disable-next-line no-case-declarations
302
- const enumModel = opts?.enumSchema ? enumModelFromSchema(opts.enumSchema) : opts?.enumModel;
303
- if (enumModel) {
304
- field.asRadioFromEnum(enumModel);
305
- }
306
- else {
307
- field.asText();
308
- }
309
- break;
310
- case 'hidden':
311
- field.asHidden();
312
- break;
313
- }
314
- // Handle different property validations
315
- if (propertyType === 'number' || propertyType === 'currency') {
316
- field.withNumberValidation({
317
- min: propertySchema.exclusiveMinimum && propertySchema.minimum != undefined ? propertySchema.minimum + (propertySchema.isInteger ? 1 : 0.0001) : propertySchema.minimum,
318
- max: propertySchema.exclusiveMaximum && propertySchema.maximum != undefined ? propertySchema.maximum - (propertySchema.isInteger ? 1 : 0.0001) : propertySchema.maximum,
319
- step: opts?.numberStep
320
- });
321
- if (opts?.numberUseGrouping) {
322
- field.withNumberGrouping();
323
- }
324
- if (opts?.numberMinFractionDigits != null || opts?.numberMaxFractionDigits != null) {
325
- field.withNumberFractions({
326
- minFractionDigits: opts?.numberMinFractionDigits,
327
- maxFractionDigits: opts?.numberMaxFractionDigits
328
- });
329
- }
330
- }
331
- if (propertyType === 'string' || propertyType === 'textarea' || propertyType === 'text') {
332
- field.withTextValidation({
333
- minLength: propertySchema.minLength,
334
- maxLength: propertySchema.maxLength,
335
- pattern: propertySchema.pattern ? new RegExp(propertySchema.pattern.slice(1, -1)) : undefined
336
- });
337
- if (propertyType === 'textarea' && opts?.textareaRows != null) {
338
- field.withTextareaRows(opts.textareaRows);
339
- }
340
- if (propertyType !== 'textarea' && propertySchema.isEmail) {
341
- field.withTextValidationEmail();
342
- }
343
- }
344
- setFieldBasicOptionsFromSchema(field, propertySchema);
345
- return field;
346
- }
347
- /**
348
- * <em>Experimental:</em> Adds a field enum lookup to editor descriptor based on the given schema property and options.
349
- *
350
- * @experimental
351
- *
352
- * @param {TableviewDescriptorInst<Model, any, any, Parent> | EditorDescriptorInst<Model, Parent>} descriptor - Descriptor to add field to.
353
- * @param {keyof Model} property - The property of the model.
354
- * @param {SchemaEnum<Enum> | EnumDescriptor<Enum>} enumOpt - The enum schema or enum model descriptor.
355
- * @param {SchemaProperty} propertySchema - The property's schema for the field.
356
- *
357
- * @returns {FieldLookupEnum<Enum>} - The field with enumeration values.
358
- */
359
- export function addFieldEnumLookupFromSchema(descriptor, property, enumOpt, propertySchema) {
360
- const enumDescriptor = enumOpt instanceof EnumDescriptor ? enumOpt : enumModelFromSchema(enumOpt);
361
- const field = descriptor.addFieldLookupEnumUnsafe(property, enumDescriptor);
362
- setFieldBasicOptionsFromSchema(field, propertySchema);
363
- return field;
364
- }
365
- /**
366
- * <em>Experimental:</em> Sets basic options for a field based on a given property schema.
367
- *
368
- * @param {AFieldDescriptor<FieldModel, EditorModel, FieldValue, ParentEditorModel>} field - The field to set options for.
369
- * @param {SchemaProperty} propertySchema - The property schema to base the options on.
370
- */
371
- export function setFieldBasicOptionsFromSchema(field, propertySchema) {
372
- if (propertySchema.required)
373
- field.withRequired();
374
- if (propertySchema.isReadOnly)
375
- field.withDisabled();
376
- }
377
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLWZyb20tc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9zY2hlbWEvZmllbGRzLWZyb20tc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBZ0Isb0JBQW9CLEVBQUUsNEJBQTRCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFFNUQsT0FBTyxFQUdILG9CQUFvQixFQU1wQix1QkFBdUIsRUFDMUIsTUFBTSxzQ0FBc0MsQ0FBQztBQUU5QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQTZCakY7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFRNUIsWUFDcUIsVUFBK0ksRUFDL0ksTUFBNkIsRUFDdEMsSUFBeUM7UUFGaEMsZUFBVSxHQUFWLFVBQVUsQ0FBcUk7UUFDL0ksV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFDdEMsU0FBSSxHQUFKLElBQUksQ0FBcUM7SUFDbEQsQ0FBQztJQUVJLG9CQUFvQixDQUFDLFFBQWEsRUFBRSxJQUErQjtRQUN2RSxPQUFxQztZQUNqQyxHQUFHLElBQUksQ0FBQyxJQUFJO1lBQ1osU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLFFBQXdCLENBQUM7WUFDNUYsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLFFBQXdCLENBQUM7WUFDNUYsVUFBVSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFB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LGNBQThCO0lBRTlCLE1BQU0sY0FBYyxHQUFHLE9BQU8sWUFBWSxjQUFjLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEcsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLHdCQUF3QixDQUFPLFFBQWtCLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUYsOEJBQThCLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSw4QkFBOEIsQ0FDMUMsS0FBK0UsRUFDL0UsY0FBOEI7SUFFOUIsSUFBSSxjQUFjLENBQUMsUUFBUTtRQUFFLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNsRCxJQUFJLGNBQWMsQ0FBQyxVQUFVO1FBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ3hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NjaGVtYUVudW0sIFNjaGVtYU1vZGVsLCBTY2hlbWFQcm9wZXJ0eX0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy1kYXRhLWFwaSc7XG5pbXBvcnQge0FycmF5SXRlbVR5cGUsIENvbW1vbnNJbnRlcm5hbEVycm9yLCBmcm9tQW5ndWxhckRhdGVGb3JtYXRUb1ByaW1lfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtFbnVtRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9tb2RlbCc7XG5pbXBvcnQge0lUYWJsZURhdGFQcm92aWRlciwgVGFibGVEZXNjcmlwdG9ySW5zdH0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZS9hcGknO1xuaW1wb3J0IHtcbiAgICBBRmllbGREZXNjcmlwdG9yLFxuICAgIEVkaXRvckRlc2NyaXB0b3JJbnN0LFxuICAgIEZpZWxkSW5wdXREZXNjcmlwdG9yLFxuICAgIEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3IsXG4gICAgRmllbGRMb29rdXBQcm92aWRlclR5cGUsXG4gICAgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcixcbiAgICBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLFxuICAgIFRhYmxldmlld0Rlc2NyaXB0b3JGaWVsZHNNYW5hZ2VNdWx0aVR5cGUsXG4gICAgVGFibGV2aWV3RGVzY3JpcHRvckluc3Rcbn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZXZpZXcvYXBpJztcblxuaW1wb3J0IHtlbnVtTW9kZWxGcm9tU2NoZW1hfSBmcm9tICcuL2VudW0tZnJvbS1zY2hlbWEnO1xuaW1wb3J0IHtmcm9tU2NoZW1hRmlsdGVyTm9uQXJyYXlQcm9wZXJ0aWVzfSBmcm9tICcuL2ludGVybmFsL2NvbW1vbi1mcm9tLXNjaGVtYSc7XG5cbnR5cGUgRmllbGRJbnB1dFR5cGUgPSAnbnVtYmVyJyB8ICdjdXJyZW5jeScgfCAnYm9vbGVhbicgfCAnc3RyaW5nJyB8ICd0ZXh0JyB8ICd0ZXh0YXJlYScgfCAnZGF0ZScgfCAnZGF0ZS10aW1lJyB8ICdlbnVtJyB8ICdoaWRkZW4nO1xuXG50eXBlIEZyb21TY2hlbWFDb21tb25PcHRzVHlwZTxNb2RlbD4gPSB7XG4gICAgZGF0ZUZvcm1hdD86IHN0cmluZztcbiAgICBkYXRlVGltZUZvcm1hdD86IHN0cmluZztcbiAgICB0ZXh0YXJlYVJvd3M/OiBudW1iZXI7XG4gICAgbnVtYmVyVXNlR3JvdXBpbmc/OiBib29sZWFuO1xuICAgIG51bWJlclN0ZXA/OiBudW1iZXI7XG4gICAgbnVtYmVyTWluRnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gICAgbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gICAgY3VycmVuY3k/OiBzdHJpbmc7XG4gICAgY3VycmVuY3lQcm9wZXJ0eT86IGtleW9mIE1vZGVsO1xuICAgIGN1cnJlbmN5RGlzcGxheT86ICdzeW1ib2wnIHwgJ2NvZGUnIHwgJ25hbWUnO1xufTtcblxudHlwZSBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWwgPSBhbnk+ID0gRnJvbVNjaGVtYUNvbW1vbk9wdHNUeXBlPE1vZGVsPiAmIHtcbiAgICBmaWVsZFR5cGVzPzogUGFydGlhbDxSZWNvcmQ8a2V5b2YgTW9kZWwsIEZpZWxkSW5wdXRUeXBlPj47XG4gICAgZW51bU1vZGVscz86IFBhcnRpYWw8UmVjb3JkPGtleW9mIE1vZGVsLCBFbnVtRGVzY3JpcHRvcjxhbnk+Pj47XG4gICAgZW51bVNjaGVtYXM/OiBQYXJ0aWFsPFJlY29yZDxrZXlvZiBNb2RlbCwgU2NoZW1hRW51bTxhbnk+Pj47XG59O1xuXG50eXBlIEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWwgPSBhbnksIEVudW0gPSBhbnk+ID0gRnJvbVNjaGVtYUNvbW1vbk9wdHNUeXBlPE1vZGVsPiAmIHtcbiAgICBmaWVsZFR5cGU/OiBGaWVsZElucHV0VHlwZTtcbiAgICBlbnVtU2NoZW1hPzogU2NoZW1hRW51bTxFbnVtPjtcbiAgICBlbnVtTW9kZWw/OiBFbnVtRGVzY3JpcHRvcjxFbnVtPjtcbn07XG5cbi8qKlxuICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBCdWlsZGVyIGZvciBhZGRpbmcgZmllbGRzIHRvIGVkaXRvci5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFGaWVsZHNCdWlsZGVyPFxuICAgIE1vZGVsLFxuICAgIFBhcmVudCA9IHVua25vd24sXG4gICAgQWRkTW9kZWwgPSBNb2RlbCxcbiAgICBFZGl0TW9kZWwgPSBNb2RlbCxcbiAgICBGaWVsZHNNb2RlbCA9IFRhYmxldmlld0Rlc2NyaXB0b3JGaWVsZHNNYW5hZ2VNdWx0aVR5cGU8TW9kZWwsIEFkZE1vZGVsLCBFZGl0TW9kZWw+LFxuICAgIFNjaE1vZGVsID0gTW9kZWxcbj4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PE1vZGVsLCBhbnksIGFueSwgUGFyZW50LCBhbnksIEFkZE1vZGVsLCBFZGl0TW9kZWwsIEZpZWxkc01vZGVsPiB8IEVkaXRvckRlc2NyaXB0b3JJbnN0PEZpZWxkc01vZGVsLCBQYXJlbnQ+LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHNjaGVtYTogU2NoZW1hTW9kZWw8U2NoTW9kZWw+LFxuICAgICAgICBwcml2YXRlIG9wdHM/OiBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+XG4gICAgKSB7fVxuXG4gICAgcHJpdmF0ZSBtZXJnZUZpZWxkc0lucHV0T3B0cyhwcm9wZXJ0eTogYW55LCBvcHRzPzogRmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlKSB7XG4gICAgICAgIHJldHVybiA8RmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZT57XG4gICAgICAgICAgICAuLi50aGlzLm9wdHMsXG4gICAgICAgICAgICBmaWVsZFR5cGU6IG9wdHM/LmZpZWxkVHlwZXM/Lltwcm9wZXJ0eV0gPz8gdGhpcy5vcHRzPy5maWVsZFR5cGVzPy5bcHJvcGVydHkgYXMga2V5b2Ygb2JqZWN0XSxcbiAgICAgICAgICAgIGVudW1Nb2RlbDogb3B0cz8uZW51bU1vZGVscz8uW3Byb3BlcnR5XSA/PyB0aGlzLm9wdHM/LmVudW1Nb2RlbHM/Lltwcm9wZXJ0eSBhcyBrZXlvZiBvYmplY3RdLFxuICAgICAgICAgICAgZW51bVNjaGVtYTogb3B0cz8uZW51bVNjaGVtYXM/Lltwcm9wZXJ0eV0gPz8gdGhpcy5vcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5IGFzIGtleW9mIG9iamVjdF0sXG4gICAgICAgICAgICAuLi5vcHRzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtZXJnZUZpZWxkSW5wdXRPcHRzKHByb3BlcnR5OiBhbnksIG9wdHM/OiBGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlKSB7XG4gICAgICAgIHJldHVybiA8RmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZTxGaWVsZHNNb2RlbD4+e1xuICAgICAgICAgICAgLi4udGhpcy5vcHRzLFxuICAgICAgICAgICAgZmllbGRUeXBlOiB0aGlzLm9wdHM/LmZpZWxkVHlwZXM/Lltwcm9wZXJ0eSBhcyBrZXlvZiBvYmplY3RdLFxuICAgICAgICAgICAgZW51bU1vZGVsOiB0aGlzLm9wdHM/LmVudW1Nb2RlbHM/Lltwcm9wZXJ0eSBhcyBrZXlvZiBvYmplY3RdLFxuICAgICAgICAgICAgZW51bVNjaGVtYTogdGhpcy5vcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5IGFzIGtleW9mIG9iamVjdF0sXG4gICAgICAgICAgICAuLi5vcHRzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgc2luZ2xlIGlucHV0IGZpZWxkIHZpYSB7YWRkRmllbGRJbnB1dEZyb21TY2hlbWF9LlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gYWRkIHRoZSBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPn0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0ZpZWxkSW5wdXREZXNjcmlwdG9yPE1vZGVsLCBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+LCBNb2RlbFtQcm9wZXJ0eV0sIFBhcmVudD59IFRoZSBhZGRlZCBmaWVsZCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGQ8UHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIEZpZWxkc01vZGVsLCBrZXlvZiBTY2hNb2RlbD4+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG9wdHM/OiBGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPlxuICAgICk6IEZpZWxkSW5wdXREZXNjcmlwdG9yPEZpZWxkc01vZGVsLCBOb25OdWxsYWJsZTxGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZHNNb2RlbFtQcm9wZXJ0eV0sIFBhcmVudD4ge1xuICAgICAgICByZXR1cm4gYWRkRmllbGRJbnB1dEZyb21TY2hlbWE8UHJvcGVydHksIE1vZGVsLCBQYXJlbnQsIEFkZE1vZGVsLCBFZGl0TW9kZWwsIEZpZWxkc01vZGVsPihcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcixcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgdGhpcy5zY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0sXG4gICAgICAgICAgICB0aGlzLm1lcmdlRmllbGRJbnB1dE9wdHMocHJvcGVydHksIG9wdHMpIGFzIEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8RmllbGRzTW9kZWwsIGFueT4gfCB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYWxsIGlucHV0IGZpZWxkcyBmb3IgdGhlIG5vbi1hcnJheSBwcm9wZXJ0aWVzIHZpYSB7YWRkRmllbGRJbnB1dEZyb21TY2hlbWF9LlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dGhpc30gLSBUaGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgYnVpbGRlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEFkZEFsbChvcHRzPzogRmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPik6IHRoaXMge1xuICAgICAgICB0aGlzLmFkZEZpZWxkcyh1bmRlZmluZWQsIG9wdHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgaW5wdXQgZmllbGRzIGZvciBwcm9wZXJ0aWVzIHZpYSB7YWRkRmllbGRJbnB1dEZyb21TY2hlbWF9LlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7Li4uUHJvcGVydHlbXX0gcHJvcGVydGllcyAtIFByb3BlcnRpZXMgdG8gYWRkIGZpZWxkcyBmb3IuIElmIG5vbiBwcm92aWRlZCwgYWxsIG5vbi1hcnJheSBwcm9wZXJ0aWVzIGZyb20gc2NoZW1hIHdpbGwgYmUgYWRkZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSAtIFRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBidWlsZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQWRkPFByb3BlcnR5S2V5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBNb2RlbCwga2V5b2YgU2NoTW9kZWw+PihvcHRzOiBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+LCAuLi5wcm9wZXJ0aWVzOiBQcm9wZXJ0eUtleVtdKTogdGhpcztcbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgZmllbGRzIGZvciBwcm9wZXJ0aWVzIHZpYSB7YWRkRmllbGRJbnB1dEZyb21TY2hlbWF9LlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHsuLi5Qcm9wZXJ0eVtdfSBwcm9wZXJ0aWVzIC0gUHJvcGVydGllcyB0byBhZGQgZmllbGRzIGZvci4gSWYgbm9uIHByb3ZpZGVkLCBhbGwgbm9uLWFycmF5IHByb3BlcnRpZXMgZnJvbSBzY2hlbWEgd2lsbCBiZSBhZGRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3RoaXN9IC0gVGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIGJ1aWxkZXIuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhBZGQ8UHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIEZpZWxkc01vZGVsLCBrZXlvZiBTY2hNb2RlbD4+KC4uLnByb3BlcnRpZXM6IFByb3BlcnR5W10pOiB0aGlzO1xuICAgIHB1YmxpYyB3aXRoQWRkPFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBGaWVsZHNNb2RlbCwga2V5b2YgU2NoTW9kZWw+Pihwcm9wT3JPcHRzOiBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+IHwgUHJvcGVydHksIC4uLnByb3BlcnRpZXM6IFByb3BlcnR5W10pOiB0aGlzIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wT3JPcHRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5hZGRGaWVsZHMocHJvcGVydGllcy5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiBwcm9wZXJ0aWVzLCBwcm9wT3JPcHRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmllbGRzKHByb3BPck9wdHMgPT09IHVuZGVmaW5lZCA/IHByb3BlcnRpZXMgOiBbcHJvcE9yT3B0cywgLi4ucHJvcGVydGllc10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkRmllbGRzPFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBGaWVsZHNNb2RlbCwga2V5b2YgU2NoTW9kZWw+Pihwcm9wZXJ0aWVzPzogUHJvcGVydHlbXSwgb3B0cz86IEZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZTxTY2hNb2RlbD4pIHtcbiAgICAgICAgY29uc3QgYWRkUHJvcGVydGllcyA9IHByb3BlcnRpZXMgPz8gZnJvbVNjaGVtYUZpbHRlck5vbkFycmF5UHJvcGVydGllcyh0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzKTtcblxuICAgICAgICBhZGRQcm9wZXJ0aWVzLmZvckVhY2gocHJvcGVydHkgPT4ge1xuICAgICAgICAgICAgYWRkRmllbGRJbnB1dEZyb21TY2hlbWE8a2V5b2YgRmllbGRzTW9kZWwsIE1vZGVsLCBQYXJlbnQsIEFkZE1vZGVsLCBFZGl0TW9kZWwsIEZpZWxkc01vZGVsPihcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IsXG4gICAgICAgICAgICAgICAgcHJvcGVydHkgYXMgdW5rbm93biBhcyBrZXlvZiBGaWVsZHNNb2RlbCxcbiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSxcbiAgICAgICAgICAgICAgICB0aGlzLm1lcmdlRmllbGRzSW5wdXRPcHRzKHByb3BlcnR5LCBvcHRzKSBhcyBGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlPEZpZWxkc01vZGVsLCBhbnk+IHwgdW5kZWZpbmVkXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBzaW5nbGUgaW5wdXQgZmllbGQgdmlhIHthZGRGaWVsZElucHV0RnJvbVNjaGVtYX0gd2hlcmUgcHJvcGVydHkgc2NoZW1hIGlzIG1hbnVhbGx5IHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gYWRkIHRoZSBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gc2NoZW1hUHJvcGVydHkgLSBNYW51YWxseSBwcm92aWRlZCBzY2hlbWEgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHtGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlPE1vZGVsPn0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0ZpZWxkSW5wdXREZXNjcmlwdG9yPE1vZGVsLCBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+LCBNb2RlbFtQcm9wZXJ0eV0sIFBhcmVudD59IFRoZSBhZGRlZCBmaWVsZCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGcm9tU2NoZW1hPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgRmllbGRzTW9kZWw+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eSxcbiAgICAgICAgb3B0cz86IEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8RmllbGRzTW9kZWw+XG4gICAgKTogRmllbGRJbnB1dERlc2NyaXB0b3I8RmllbGRzTW9kZWwsIE5vbk51bGxhYmxlPEZpZWxkc01vZGVsW1Byb3BlcnR5XT4sIEZpZWxkc01vZGVsW1Byb3BlcnR5XSwgUGFyZW50PiB7XG4gICAgICAgIHJldHVybiBhZGRGaWVsZElucHV0RnJvbVNjaGVtYShcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcixcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgc2NoZW1hUHJvcGVydHksXG4gICAgICAgICAgICB0aGlzLm1lcmdlRmllbGRJbnB1dE9wdHMocHJvcGVydHksIG9wdHMpIGFzIEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8RmllbGRzTW9kZWwsIGFueT4gfCB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYW4gZW51bSBsb29rdXAgZmllbGQgdmlhIHthZGRGaWVsZEVudW1Mb29rdXBGcm9tU2NoZW1hfS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGFkZCB0aGUgZW51bSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7U2NoZW1hRW51bTxFbnVtPiB8IEVudW1EZXNjcmlwdG9yPEVudW0+fSBbZW51bU9wdF0gLSBUaGUgZW51bSBzY2hlbWEgb3IgdGhlIGVudW0gbW9kZWwgZGVzY3JpcHRvci4gSWYgbm9uIHByb3ZpZGVkLCBidWlsZGVyIG9wdHMgd2lsbCBiZSBjaGVja2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0ZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RW51bSwgTW9kZWwsIFBhcmVudD59IC0gVGhlIGFkZGVkIGZpZWxkIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtDb21tb25zSW50ZXJuYWxFcnJvcn0gLSBJZiBubyBlbnVtIG1ldGFkYXRhIGlzIGZvdW5kIGZvciB0aGUgcHJvcGVydHkgZWl0aGVyIGZyb20gcGFyYW1ldGVyIG9yIGZyb20gYnVpbGRlcidzIG9wdHMuXG4gICAgICovXG4gICAgcHVibGljIGFkZEVudW08UHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIEZpZWxkc01vZGVsLCBrZXlvZiBTY2hNb2RlbD4sIEVudW0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIGVudW1PcHQ/OiBTY2hlbWFFbnVtPEVudW0+IHwgRW51bURlc2NyaXB0b3I8RW51bT5cbiAgICApOiBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVudW0sIEZpZWxkc01vZGVsLCBQYXJlbnQ+IHtcbiAgICAgICAgaWYgKCFlbnVtT3B0KSB7XG4gICAgICAgICAgICBlbnVtT3B0ID0gdGhpcy5vcHRzPy5lbnVtTW9kZWxzPy5bcHJvcGVydHldID8/IHRoaXMub3B0cz8uZW51bVNjaGVtYXM/Lltwcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnVtT3B0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEVudW0gbG9va3VwIGZpZWxkIGZvciBwcm9wZXJ0eSAke3Byb3BlcnR5IGFzIHN0cmluZ30gY2Fubm90IGJlIGFkZGVkIGJlY2F1c2UgZW51bSBtZXRhZGF0YSB3YXMgbm90IHByb3ZpZGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZEVudW1Mb29rdXBGcm9tU2NoZW1hKHRoaXMuZGVzY3JpcHRvciwgcHJvcGVydHksIGVudW1PcHQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYW4gZW51bSBsb29rdXAgZmllbGQgdmlhIHthZGRGaWVsZEVudW1Mb29rdXBGcm9tU2NoZW1hfSB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBhZGQgdGhlIGVudW0gbG9va3VwIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYUVudW08RW51bT4gfCBFbnVtRGVzY3JpcHRvcjxFbnVtPn0gW2VudW1PcHRdIC0gVGhlIGVudW0gc2NoZW1hIG9yIHRoZSBlbnVtIG1vZGVsIGRlc2NyaXB0b3IuIElmIG5vbiBwcm92aWRlZCwgYnVpbGRlciBvcHRzIHdpbGwgYmUgY2hlY2tlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVudW0sIE1vZGVsLCBQYXJlbnQ+fSAtIFRoZSBhZGRlZCBmaWVsZCBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IC0gSWYgbm8gZW51bSBtZXRhZGF0YSBpcyBmb3VuZCBmb3IgdGhlIHByb3BlcnR5IGVpdGhlciBmcm9tIHBhcmFtZXRlciBvciBmcm9tIGJ1aWxkZXIncyBvcHRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRFbnVtRnJvbVNjaGVtYTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEZpZWxkc01vZGVsLCBFbnVtPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBlbnVtT3B0OiBTY2hlbWFFbnVtPEVudW0+IHwgRW51bURlc2NyaXB0b3I8RW51bT4gfCB1bmRlZmluZWQsXG4gICAgICAgIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eVxuICAgICk6IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RW51bSwgRmllbGRzTW9kZWwsIFBhcmVudD4ge1xuICAgICAgICBpZiAoIWVudW1PcHQpIHtcbiAgICAgICAgICAgIGVudW1PcHQgPSB0aGlzLm9wdHM/LmVudW1Nb2RlbHM/Lltwcm9wZXJ0eV0gPz8gdGhpcy5vcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVudW1PcHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgRW51bSBsb29rdXAgZmllbGQgZm9yIHByb3BlcnR5ICR7cHJvcGVydHkgYXMgc3RyaW5nfSBjYW5ub3QgYmUgYWRkZWQgYmVjYXVzZSBlbnVtIG1ldGFkYXRhIHdhcyBub3QgcHJvdmlkZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkRW51bUxvb2t1cEZyb21TY2hlbWEodGhpcy5kZXNjcmlwdG9yLCBwcm9wZXJ0eSwgZW51bU9wdCwgc2NoZW1hUHJvcGVydHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cH0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7RmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIERhdGEgcHJvdmlkZXIgZm9yIHRoZSBsb29rdXAgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGxvb2t1cCBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTG9va3VwPFxuICAgICAgICBQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgRmllbGRzTW9kZWwsIGtleW9mIFNjaE1vZGVsPixcbiAgICAgICAgU2VydmljZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgTG9va3VwTW9kZWwgZXh0ZW5kcyBOb25OdWxsYWJsZTxGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+ID0gTm9uTnVsbGFibGU8RmllbGRzTW9kZWxbUHJvcGVydHldPlxuICAgID4ocHJvcGVydHk6IFByb3BlcnR5LCBwcm92aWRlcj86IEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPikge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cDxQcm9wZXJ0eSwgU2VydmljZSwgTG9va3VwTW9kZWw+KHByb3BlcnR5LCB7c2VydmljZVByb3ZpZGVyOiBwcm92aWRlcn0pO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZCB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRMb29rdXB9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbG9va3VwIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPiB8IHVuZGVmaW5lZH0gcHJvdmlkZXIgLSBEYXRhIHByb3ZpZGVyIGZvciB0aGUgbG9va3VwIGZpZWxkLlxuICAgICAqIEBwYXJhbSB7U2NoZW1hUHJvcGVydHl9IHNjaGVtYVByb3BlcnR5IC0gTWFudWFsbHkgcHJvdmlkZWQgc2NoZW1hIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb29rdXAgZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGFkZExvb2t1cEZyb21TY2hlbWE8XG4gICAgICAgIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgRmllbGRzTW9kZWwsXG4gICAgICAgIFNlcnZpY2UgPSB1bmRlZmluZWQsXG4gICAgICAgIExvb2t1cE1vZGVsIGV4dGVuZHMgTm9uTnVsbGFibGU8RmllbGRzTW9kZWxbUHJvcGVydHldPiA9IE5vbk51bGxhYmxlPEZpZWxkc01vZGVsW1Byb3BlcnR5XT5cbiAgICA+KHByb3BlcnR5OiBQcm9wZXJ0eSwgcHJvdmlkZXI6IEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPiB8IHVuZGVmaW5lZCwgc2NoZW1hUHJvcGVydHk6IFNjaGVtYVByb3BlcnR5KSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5kZXNjcmlwdG9yLmFkZEZpZWxkTG9va3VwPFByb3BlcnR5LCBTZXJ2aWNlLCBMb29rdXBNb2RlbD4ocHJvcGVydHksIHtzZXJ2aWNlUHJvdmlkZXI6IHByb3ZpZGVyfSk7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgc2NoZW1hUHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgb25lLXRvLW1hbnkgZWRpdG9yIGZpZWxkLlxuICAgICAqIHtFZGl0b3JEZXNjcmlwdG9ySW50LmFkZEZpZWxkTWFueUVkaXRvcn0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBtYW55IGVkaXRvciBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsLCBhbnksIGFueSwgRmllbGRzTW9kZWw+fSB0YWJsZXZpZXdEZXNjcmlwdG9yIC0gVGFibGV2aWV3IGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIG9uZS10by1tYW55IGVkaXRvciBmaWVsZC5cbiAgICAgKi9cbiAgICBhZGRNYW55RWRpdG9yPFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBGaWVsZHNNb2RlbCwga2V5b2YgU2NoTW9kZWw+LCBGaWVsZE1vZGVsID0gQXJyYXlJdGVtVHlwZTxGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gRmllbGRzTW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsLCBhbnksIGFueSwgRmllbGRzTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWw+XG4gICAgKTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxGaWVsZE1vZGVsLCBGaWVsZHNNb2RlbCwgRmllbGRWYWx1ZSwgUGFyZW50PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5kZXNjcmlwdG9yLmFkZEZpZWxkTWFueUVkaXRvcjxQcm9wZXJ0eSwgRmllbGRNb2RlbCwgRmllbGRWYWx1ZT4ocHJvcGVydHksIHRhYmxldmlld0Rlc2NyaXB0b3IpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhbiBvbmUtdG8tbWFueSBlZGl0b3IgZmllbGQgd2hlcmUgcHJvcGVydHkgc2NoZW1hIGlzIG1hbnVhbGx5IHByb3ZpZGVkLlxuICAgICAqIHtFZGl0b3JEZXNjcmlwdG9ySW50LmFkZEZpZWxkTWFueUVkaXRvcn0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBtYW55IGVkaXRvciBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtUYWJsZXZpZXdEZXNjcmlwdG9yVHlwZTxGaWVsZE1vZGVsLCBhbnksIGFueSwgRmllbGRzTW9kZWw+fSB0YWJsZXZpZXdEZXNjcmlwdG9yIC0gVGFibGV2aWV3IGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gc2NoZW1hUHJvcGVydHkgLSBNYW51YWxseSBwcm92aWRlZCBzY2hlbWEgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIG9uZS10by1tYW55IGVkaXRvciBmaWVsZC5cbiAgICAgKi9cbiAgICBhZGRNYW55RWRpdG9yRnJvbVNjaGVtYTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEZpZWxkc01vZGVsLCBGaWVsZE1vZGVsID0gQXJyYXlJdGVtVHlwZTxGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gRmllbGRzTW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsLCBhbnksIGFueSwgRmllbGRzTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWw+LFxuICAgICAgICBzY2hlbWFQcm9wZXJ0eTogU2NoZW1hUHJvcGVydHlcbiAgICApOiBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yPEZpZWxkTW9kZWwsIEZpZWxkc01vZGVsLCBGaWVsZFZhbHVlLCBQYXJlbnQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRNYW55RWRpdG9yPFByb3BlcnR5LCBGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgdGFibGV2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgc2NoZW1hUHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgbWFueS10by1tYW55IGVkaXRvciBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZE1hbnlUb01hbnlFZGl0b3J9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbWFueSBlZGl0b3IgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7VGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPn0gbWFpblRhYmxlRGVzY3JpcHRvciAtIE1haW4gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0ge1RhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD59IGxvb2t1cFRhYmxlRGVzY3JpcHRvciAtIExvb2t1cCB0YWJsZSBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSB7SVRhYmxlRGF0YVByb3ZpZGVyPEZpZWxkTW9kZWwsIFNlcnZpY2VUeXBlPn0gbG9va3VwRGF0YVByb3ZpZGVyIC0gTG9va3VwIGRhdGEgcHJvdmlkZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIG1hbnktdG8tbWFueSBlZGl0b3IgZmllbGQuXG4gICAgICovXG4gICAgYWRkTWFueVRvTWFueUVkaXRvcjxcbiAgICAgICAgUHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIEZpZWxkc01vZGVsLCBrZXlvZiBTY2hNb2RlbD4sXG4gICAgICAgIFNlcnZpY2VUeXBlLFxuICAgICAgICBGaWVsZE1vZGVsID0gQXJyYXlJdGVtVHlwZTxGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+LFxuICAgICAgICBGaWVsZFZhbHVlID0gRmllbGRzTW9kZWxbUHJvcGVydHldXG4gICAgPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBtYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWw+LFxuICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cERhdGFQcm92aWRlcjogSVRhYmxlRGF0YVByb3ZpZGVyPEZpZWxkTW9kZWwsIFNlcnZpY2VUeXBlPlxuICAgICk6IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3I8RmllbGRNb2RlbCwgRmllbGRzTW9kZWwsIFNlcnZpY2VUeXBlLCBGaWVsZFZhbHVlLCBQYXJlbnQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRNYW55VG9NYW55RWRpdG9yPFByb3BlcnR5LCBTZXJ2aWNlVHlwZSwgRmllbGRNb2RlbCwgRmllbGRWYWx1ZT4oXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3IsXG4gICAgICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3IsXG4gICAgICAgICAgICBsb29rdXBEYXRhUHJvdmlkZXJcbiAgICAgICAgKTtcbiAgICAgICAgc2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hKGZpZWxkLCB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBtYW55LXRvLW1hbnkgZWRpdG9yIGZpZWxkIHdoZXJlIHByb3BlcnR5IHNjaGVtYSBpcyBtYW51YWxseSBwcm92aWRlZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZE1hbnlUb01hbnlFZGl0b3J9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbWFueSBlZGl0b3IgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7VGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPn0gbWFpblRhYmxlRGVzY3JpcHRvciAtIE1haW4gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0ge1RhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD59IGxvb2t1cFRhYmxlRGVzY3JpcHRvciAtIExvb2t1cCB0YWJsZSBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSB7SVRhYmxlRGF0YVByb3ZpZGVyPEZpZWxkTW9kZWwsIFNlcnZpY2VUeXBlPn0gbG9va3VwRGF0YVByb3ZpZGVyIC0gTG9va3VwIGRhdGEgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gc2NoZW1hUHJvcGVydHkgLSBNYW51YWxseSBwcm92aWRlZCBzY2hlbWEgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIG1hbnktdG8tbWFueSBlZGl0b3IgZmllbGQuXG4gICAgICovXG4gICAgYWRkTWFueVRvTWFueUVkaXRvckZyb21TY2hlbWE8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBGaWVsZHNNb2RlbCwgU2VydmljZVR5cGUsIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPEZpZWxkc01vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPixcbiAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyOiBJVGFibGVEYXRhUHJvdmlkZXI8RmllbGRNb2RlbCwgU2VydmljZVR5cGU+LFxuICAgICAgICBzY2hlbWFQcm9wZXJ0eTogU2NoZW1hUHJvcGVydHlcbiAgICApOiBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yPEZpZWxkTW9kZWwsIEZpZWxkc01vZGVsLCBTZXJ2aWNlVHlwZSwgRmllbGRWYWx1ZSwgUGFyZW50PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5kZXNjcmlwdG9yLmFkZEZpZWxkTWFueVRvTWFueUVkaXRvcjxQcm9wZXJ0eSwgU2VydmljZVR5cGUsIEZpZWxkTW9kZWwsIEZpZWxkVmFsdWU+KFxuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICBtYWluVGFibGVEZXNjcmlwdG9yLFxuICAgICAgICAgICAgbG9va3VwVGFibGVEZXNjcmlwdG9yLFxuICAgICAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyXG4gICAgICAgICk7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgc2NoZW1hUHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG4vKipcbiAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQ3JlYXRlcyBidWlsZGVyIGZvciBhZGRpbmcgZmllbGRzIHRvIGRlc2NyaXB0b3IgYmFzZWQgb24gcHJvdmlkZWQgbW9kZWwgc2NoZW1hLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqXG4gKiBAcGFyYW0ge1RhYmxldmlld0Rlc2NyaXB0b3JJbnN0PE1vZGVsLCBhbnksIGFueSwgUGFyZW50LCBhbnksIEFkZE1vZGVsLCBFZGl0TW9kZWwsIEZpZWxkc01vZGVsPiB8IEVkaXRvckRlc2NyaXB0b3JJbnN0PE1vZGVsLCBQYXJlbnQ+fSBkZXNjcmlwdG9yIC0gRGVzY3JpcHRvciB0byBhZGQgZmllbGRzIHRvLlxuICogQHBhcmFtIHtTY2hlbWFNb2RlbDxTY2hNb2RlbD59IHNjaGVtYSAtIFRoZSBzY2hlbWEgd2l0aCBtZXRhZGF0YSBhYm91dCBwcm9wZXJ0aWVzIGZvciBmaWVsZHMuXG4gKiBAcGFyYW0ge0ZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZTxTY2hNb2RlbD59IFtvcHRzXSAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIHtTY2hlbWFGaWVsZHNCdWlsZGVyPE1vZGVsLCBQYXJlbnQsIEFkZE1vZGVsLCBFZGl0TW9kZWwgLCBGaWVsZHNNb2RlbCwgU2NoTW9kZWw+fSAtIFRoZSBTY2hlbWFGaWVsZHNCdWlsZGVyIG9iamVjdCBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgZmllbGRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmllbGRzRnJvbVNjaGVtYTxcbiAgICBNb2RlbCxcbiAgICBQYXJlbnQgPSB1bmRlZmluZWQsXG4gICAgQWRkTW9kZWwgPSBNb2RlbCxcbiAgICBFZGl0TW9kZWwgPSBNb2RlbCxcbiAgICBGaWVsZHNNb2RlbCA9IFRhYmxldmlld0Rlc2NyaXB0b3JGaWVsZHNNYW5hZ2VNdWx0aVR5cGU8TW9kZWwsIEFkZE1vZGVsLCBFZGl0TW9kZWw+LFxuICAgIFNjaE1vZGVsID0gTW9kZWxcbj4oXG4gICAgZGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8TW9kZWwsIGFueSwgYW55LCBQYXJlbnQsIGFueSwgQWRkTW9kZWwsIEVkaXRNb2RlbCwgRmllbGRzTW9kZWw+IHwgRWRpdG9yRGVzY3JpcHRvckluc3Q8RmllbGRzTW9kZWwsIFBhcmVudD4sXG4gICAgc2NoZW1hOiBTY2hlbWFNb2RlbDxTY2hNb2RlbD4sXG4gICAgb3B0cz86IEZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZTxTY2hNb2RlbD5cbik6IFNjaGVtYUZpZWxkc0J1aWxkZXI8TW9kZWwsIFBhcmVudCwgQWRkTW9kZWwsIEVkaXRNb2RlbCwgRmllbGRzTW9kZWwsIFNjaE1vZGVsPiB7XG4gICAgcmV0dXJuIG5ldyBTY2hlbWFGaWVsZHNCdWlsZGVyPE1vZGVsLCBQYXJlbnQsIEFkZE1vZGVsLCBFZGl0TW9kZWwsIEZpZWxkc01vZGVsLCBTY2hNb2RlbD4oZGVzY3JpcHRvciwgc2NoZW1hLCBvcHRzKTtcbn1cblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBmaWVsZCBpbnB1dCB0byBlZGl0b3IgZGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2NoZW1hIHByb3BlcnR5IGFuZCBvcHRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqXG4gKiBAcGFyYW0ge1RhYmxldmlld0Rlc2NyaXB0b3JJbnN0IHwgRWRpdG9yRGVzY3JpcHRvckluc3R9IGRlc2NyaXB0b3IgLSBEZXNjcmlwdG9yIHRvIGFkZCBmaWVsZCB0by5cbiAqIEBwYXJhbSB7a2V5b2YgTW9kZWx9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG9mIHRoZSBtb2RlbC5cbiAqIEBwYXJhbSB7U2NoZW1hUHJvcGVydHl9IHByb3BlcnR5U2NoZW1hIC0gVGhlIHByb3BlcnR5J3Mgc2NoZW1hIGZvciB0aGUgZmllbGQuXG4gKiBAcGFyYW0ge0ZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWw+fSBbb3B0c10gLSBBZGRpdGlvbmFsIG9wdGlvbnMuXG4gKlxuICogQHJldHVybiB7RmllbGRJbnB1dERlc2NyaXB0b3I8TW9kZWwsIE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIE1vZGVsW1Byb3BlcnR5XSwgUGFyZW50Pn0gLSBUaGUgZ2VuZXJhdGVkIGZpZWxkIGlucHV0IGRlc2NyaXB0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRGaWVsZElucHV0RnJvbVNjaGVtYTxcbiAgICBQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEZpZWxkc01vZGVsLFxuICAgIE1vZGVsLFxuICAgIFBhcmVudCA9IHVua25vd24sXG4gICAgQWRkTW9kZWwgPSBNb2RlbCxcbiAgICBFZGl0TW9kZWwgPSBNb2RlbCxcbiAgICBGaWVsZHNNb2RlbCA9IFRhYmxldmlld0Rlc2NyaXB0b3JGaWVsZHNNYW5hZ2VNdWx0aVR5cGU8TW9kZWwsIEFkZE1vZGVsLCBFZGl0TW9kZWw+XG4+KFxuICAgIGRlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PE1vZGVsLCBhbnksIGFueSwgUGFyZW50LCBhbnksIEFkZE1vZGVsLCBFZGl0TW9kZWwsIEZpZWxkc01vZGVsPiB8IEVkaXRvckRlc2NyaXB0b3JJbnN0PEZpZWxkc01vZGVsLCBQYXJlbnQ+LFxuICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICBwcm9wZXJ0eVNjaGVtYTogU2NoZW1hUHJvcGVydHksXG4gICAgb3B0cz86IEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8RmllbGRzTW9kZWw+XG4pOiBGaWVsZElucHV0RGVzY3JpcHRvcjxGaWVsZHNNb2RlbCwgTm9uTnVsbGFibGU8RmllbGRzTW9kZWxbUHJvcGVydHldPiwgRmllbGRzTW9kZWxbUHJvcGVydHldLCBQYXJlbnQ+IHtcbiAgICBjb25zdCBwcm9wZXJ0eVR5cGUgPSBvcHRzPy5maWVsZFR5cGUgPz8gcHJvcGVydHlTY2hlbWEudHlwZTtcblxuICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkSW5wdXREZXNjcmlwdG9yPEZpZWxkc01vZGVsLCBOb25OdWxsYWJsZTxGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZHNNb2RlbFtQcm9wZXJ0eV0sIFBhcmVudD4ocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0KSB7XG4gICAgICAgIGRlc2NyaXB0b3IuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkZXNjcmlwdG9yLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBwcm9wZXJ0eSB0eXBlc1xuICAgIHN3aXRjaCAocHJvcGVydHlUeXBlIGFzIEZpZWxkSW5wdXRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICBmaWVsZC5hc051bWJlcigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2N1cnJlbmN5JzpcbiAgICAgICAgICAgIGZpZWxkLmFzQ3VycmVuY3koe1xuICAgICAgICAgICAgICAgIGN1cnJlbmN5OiBvcHRzPy5jdXJyZW5jeSxcbiAgICAgICAgICAgICAgICBjdXJyZW5jeURpc3BsYXk6IG9wdHM/LmN1cnJlbmN5RGlzcGxheSxcbiAgICAgICAgICAgICAgICBjdXJyZW5jeVByb3BlcnR5OiBvcHRzPy5jdXJyZW5jeVByb3BlcnR5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgIGZpZWxkLmFzU3dpdGNoKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICBmaWVsZC5hc1RleHQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAgICAgICBmaWVsZC5hc1RleHRhcmVhKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICBmaWVsZC5hc0RhdGVQaWNrZXIoe2Zvcm1hdDogb3B0cz8uZGF0ZUZvcm1hdCA/IGZyb21Bbmd1bGFyRGF0ZUZvcm1hdFRvUHJpbWUob3B0cy5kYXRlRm9ybWF0KSA6IHVuZGVmaW5lZH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGUtdGltZSc6XG4gICAgICAgICAgICBmaWVsZC5hc0RhdGVQaWNrZXIoe3Nob3dUaW1lOiB0cnVlLCBmb3JtYXQ6IG9wdHM/LmRhdGVUaW1lRm9ybWF0ID8gZnJvbUFuZ3VsYXJEYXRlRm9ybWF0VG9QcmltZShvcHRzLmRhdGVUaW1lRm9ybWF0KSA6IHVuZGVmaW5lZH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2VudW0nOlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNhc2UtZGVjbGFyYXRpb25zXG4gICAgICAgICAgICBjb25zdCBlbnVtTW9kZWwgPSBvcHRzPy5lbnVtU2NoZW1hID8gZW51bU1vZGVsRnJvbVNjaGVtYShvcHRzLmVudW1TY2hlbWEpIDogb3B0cz8uZW51bU1vZGVsO1xuICAgICAgICAgICAgaWYgKGVudW1Nb2RlbCkge1xuICAgICAgICAgICAgICAgIGZpZWxkLmFzUmFkaW9Gcm9tRW51bShlbnVtTW9kZWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5hc1RleHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdoaWRkZW4nOlxuICAgICAgICAgICAgZmllbGQuYXNIaWRkZW4oKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgcHJvcGVydHkgdmFsaWRhdGlvbnNcbiAgICBpZiAocHJvcGVydHlUeXBlID09PSAnbnVtYmVyJyB8fCBwcm9wZXJ0eVR5cGUgPT09ICdjdXJyZW5jeScpIHtcbiAgICAgICAgZmllbGQud2l0aE51bWJlclZhbGlkYXRpb24oe1xuICAgICAgICAgICAgbWluOiBwcm9wZXJ0eVNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICYmIHByb3BlcnR5U2NoZW1hLm1pbmltdW0gIT0gdW5kZWZpbmVkID8gcHJvcGVydHlTY2hlbWEubWluaW11bSArIChwcm9wZXJ0eVNjaGVtYS5pc0ludGVnZXIgPyAxIDogMC4wMDAxKSA6IHByb3BlcnR5U2NoZW1hLm1pbmltdW0sXG4gICAgICAgICAgICBtYXg6IHByb3BlcnR5U2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gJiYgcHJvcGVydHlTY2hlbWEubWF4aW11bSAhPSB1bmRlZmluZWQgPyBwcm9wZXJ0eVNjaGVtYS5tYXhpbXVtIC0gKHByb3BlcnR5U2NoZW1hLmlzSW50ZWdlciA/IDEgOiAwLjAwMDEpIDogcHJvcGVydHlTY2hlbWEubWF4aW11bSxcbiAgICAgICAgICAgIHN0ZXA6IG9wdHM/Lm51bWJlclN0ZXBcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvcHRzPy5udW1iZXJVc2VHcm91cGluZykge1xuICAgICAgICAgICAgZmllbGQud2l0aE51bWJlckdyb3VwaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHM/Lm51bWJlck1pbkZyYWN0aW9uRGlnaXRzICE9IG51bGwgfHwgb3B0cz8ubnVtYmVyTWF4RnJhY3Rpb25EaWdpdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZmllbGQud2l0aE51bWJlckZyYWN0aW9ucyh7XG4gICAgICAgICAgICAgICAgbWluRnJhY3Rpb25EaWdpdHM6IG9wdHM/Lm51bWJlck1pbkZyYWN0aW9uRGlnaXRzLFxuICAgICAgICAgICAgICAgIG1heEZyYWN0aW9uRGlnaXRzOiBvcHRzPy5udW1iZXJNYXhGcmFjdGlvbkRpZ2l0c1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJvcGVydHlUeXBlID09PSAnc3RyaW5nJyB8fCBwcm9wZXJ0eVR5cGUgPT09ICd0ZXh0YXJlYScgfHwgcHJvcGVydHlUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgZmllbGQud2l0aFRleHRWYWxpZGF0aW9uKHtcbiAgICAgICAgICAgIG1pbkxlbmd0aDogcHJvcGVydHlTY2hlbWEubWluTGVuZ3RoLFxuICAgICAgICAgICAgbWF4TGVuZ3RoOiBwcm9wZXJ0eVNjaGVtYS5tYXhMZW5ndGgsXG4gICAgICAgICAgICBwYXR0ZXJuOiBwcm9wZXJ0eVNjaGVtYS5wYXR0ZXJuID8gbmV3IFJlZ0V4cChwcm9wZXJ0eVNjaGVtYS5wYXR0ZXJuLnNsaWNlKDEsIC0xKSkgOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5VHlwZSA9PT0gJ3RleHRhcmVhJyAmJiBvcHRzPy50ZXh0YXJlYVJvd3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgZmllbGQud2l0aFRleHRhcmVhUm93cyhvcHRzLnRleHRhcmVhUm93cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5VHlwZSAhPT0gJ3RleHRhcmVhJyAmJiBwcm9wZXJ0eVNjaGVtYS5pc0VtYWlsKSB7XG4gICAgICAgICAgICBmaWVsZC53aXRoVGV4dFZhbGlkYXRpb25FbWFpbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hKGZpZWxkLCBwcm9wZXJ0eVNjaGVtYSk7XG5cbiAgICByZXR1cm4gZmllbGQ7XG59XG5cbi8qKlxuICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgZmllbGQgZW51bSBsb29rdXAgdG8gZWRpdG9yIGRlc2NyaXB0b3IgYmFzZWQgb24gdGhlIGdpdmVuIHNjaGVtYSBwcm9wZXJ0eSBhbmQgb3B0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKlxuICogQHBhcmFtIHtUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNb2RlbCwgYW55LCBhbnksIFBhcmVudD4gfCBFZGl0b3JEZXNjcmlwdG9ySW5zdDxNb2RlbCwgUGFyZW50Pn0gZGVzY3JpcHRvciAtIERlc2NyaXB0b3IgdG8gYWRkIGZpZWxkIHRvLlxuICogQHBhcmFtIHtrZXlvZiBNb2RlbH0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb2YgdGhlIG1vZGVsLlxuICogQHBhcmFtIHtTY2hlbWFFbnVtPEVudW0+IHwgRW51bURlc2NyaXB0b3I8RW51bT59IGVudW1PcHQgLSBUaGUgZW51bSBzY2hlbWEgb3IgZW51bSBtb2RlbCBkZXNjcmlwdG9yLlxuICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gcHJvcGVydHlTY2hlbWEgLSBUaGUgcHJvcGVydHkncyBzY2hlbWEgZm9yIHRoZSBmaWVsZC5cbiAqXG4gKiBAcmV0dXJucyB7RmllbGRMb29rdXBFbnVtPEVudW0+fSAtIFRoZSBmaWVsZCB3aXRoIGVudW1lcmF0aW9uIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEZpZWxkRW51bUxvb2t1cEZyb21TY2hlbWE8XG4gICAgTW9kZWwsXG4gICAgUGFyZW50ID0gdW5rbm93bixcbiAgICBBZGRNb2RlbCA9IE1vZGVsLFxuICAgIEVkaXRNb2RlbCA9IE1vZGVsLFxuICAgIEZpZWxkc01vZGVsID0gVGFibGV2aWV3RGVzY3JpcHRvckZpZWxkc01hbmFnZU11bHRpVHlwZTxNb2RlbCwgQWRkTW9kZWwsIEVkaXRNb2RlbD4sXG4gICAgRW51bSA9IGFueVxuPihcbiAgICBkZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNb2RlbCwgYW55LCBhbnksIFBhcmVudCwgYW55LCBBZGRNb2RlbCwgRWRpdE1vZGVsLCBGaWVsZHNNb2RlbD4gfCBFZGl0b3JEZXNjcmlwdG9ySW5zdDxGaWVsZHNNb2RlbCwgUGFyZW50PixcbiAgICBwcm9wZXJ0eToga2V5b2YgRmllbGRzTW9kZWwsXG4gICAgZW51bU9wdDogU2NoZW1hRW51bTxFbnVtPiB8IEVudW1EZXNjcmlwdG9yPEVudW0+LFxuICAgIHByb3BlcnR5U2NoZW1hOiBTY2hlbWFQcm9wZXJ0eVxuKSB7XG4gICAgY29uc3QgZW51bURlc2NyaXB0b3IgPSBlbnVtT3B0IGluc3RhbmNlb2YgRW51bURlc2NyaXB0b3IgPyBlbnVtT3B0IDogZW51bU1vZGVsRnJvbVNjaGVtYShlbnVtT3B0KTtcbiAgICBjb25zdCBmaWVsZCA9IGRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXBFbnVtVW5zYWZlPEVudW0+KHByb3BlcnR5IGFzIHN0cmluZywgZW51bURlc2NyaXB0b3IpO1xuICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgcHJvcGVydHlTY2hlbWEpO1xuICAgIHJldHVybiBmaWVsZDtcbn1cblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IFNldHMgYmFzaWMgb3B0aW9ucyBmb3IgYSBmaWVsZCBiYXNlZCBvbiBhIGdpdmVuIHByb3BlcnR5IHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0ge0FGaWVsZERlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPn0gZmllbGQgLSBUaGUgZmllbGQgdG8gc2V0IG9wdGlvbnMgZm9yLlxuICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gcHJvcGVydHlTY2hlbWEgLSBUaGUgcHJvcGVydHkgc2NoZW1hIHRvIGJhc2UgdGhlIG9wdGlvbnMgb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWE8RmllbGRNb2RlbCA9IGFueSwgRWRpdG9yTW9kZWwgPSBhbnksIEZpZWxkVmFsdWUgPSBGaWVsZE1vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbCA9IHVuZGVmaW5lZD4oXG4gICAgZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPixcbiAgICBwcm9wZXJ0eVNjaGVtYTogU2NoZW1hUHJvcGVydHlcbik6IHZvaWQge1xuICAgIGlmIChwcm9wZXJ0eVNjaGVtYS5yZXF1aXJlZCkgZmllbGQud2l0aFJlcXVpcmVkKCk7XG4gICAgaWYgKHByb3BlcnR5U2NoZW1hLmlzUmVhZE9ubHkpIGZpZWxkLndpdGhEaXNhYmxlZCgpO1xufVxuIl19
@@ -1,7 +0,0 @@
1
- export function fromSchemaFilterNonArrayProperties(propertySchemas) {
2
- return Object.keys(propertySchemas).filter(key => {
3
- const propertySchema = propertySchemas[key];
4
- return ['number', 'string', 'boolean', 'date', 'date-time', 'enum', 'object'].includes(propertySchema.type);
5
- });
6
- }
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLWZyb20tc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9zY2hlbWEvaW50ZXJuYWwvY29tbW9uLWZyb20tc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxrQ0FBa0MsQ0FBUSxlQUF5QztJQUMvRixPQUFRLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFxQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNsRSxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEgsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGZyb21TY2hlbWFGaWx0ZXJOb25BcnJheVByb3BlcnRpZXM8TW9kZWw+KHByb3BlcnR5U2NoZW1hczogUmVjb3JkPGtleW9mIE1vZGVsLCBhbnk+KTogKGtleW9mIE1vZGVsKVtdIHtcbiAgICByZXR1cm4gKE9iamVjdC5rZXlzKHByb3BlcnR5U2NoZW1hcykgYXMgKGtleW9mIE1vZGVsKVtdKS5maWx0ZXIoa2V5ID0+IHtcbiAgICAgICAgY29uc3QgcHJvcGVydHlTY2hlbWEgPSBwcm9wZXJ0eVNjaGVtYXNba2V5XTtcbiAgICAgICAgcmV0dXJuIFsnbnVtYmVyJywgJ3N0cmluZycsICdib29sZWFuJywgJ2RhdGUnLCAnZGF0ZS10aW1lJywgJ2VudW0nLCAnb2JqZWN0J10uaW5jbHVkZXMocHJvcGVydHlTY2hlbWEudHlwZSk7XG4gICAgfSk7XG59XG4iXX0=