obsidian-dev-utils 24.0.2-beta.1 → 24.1.0

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.
Files changed (32) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/lib/cjs/Library.cjs +1 -1
  3. package/dist/lib/cjs/obsidian/App.cjs +6 -1
  4. package/dist/lib/cjs/obsidian/App.d.cts +5 -0
  5. package/dist/lib/cjs/obsidian/Components/CheckboxComponent.cjs +11 -1
  6. package/dist/lib/cjs/obsidian/Components/CheckboxComponent.d.cts +10 -0
  7. package/dist/lib/cjs/obsidian/Components/TriStateCheckboxComponent.cjs +11 -1
  8. package/dist/lib/cjs/obsidian/Components/TriStateCheckboxComponent.d.cts +10 -0
  9. package/dist/lib/cjs/obsidian/Modals/ModalBase.cjs +8 -1
  10. package/dist/lib/cjs/obsidian/Modals/ModalBase.d.cts +7 -0
  11. package/dist/lib/cjs/obsidian/Plugin/PluginBase.cjs +23 -5
  12. package/dist/lib/cjs/obsidian/Plugin/PluginBase.d.cts +20 -2
  13. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.cjs +113 -15
  14. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.d.cts +102 -8
  15. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.cjs +39 -2
  16. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.d.cts +23 -0
  17. package/dist/lib/esm/Library.mjs +1 -1
  18. package/dist/lib/esm/obsidian/App.d.mts +5 -0
  19. package/dist/lib/esm/obsidian/App.mjs +6 -1
  20. package/dist/lib/esm/obsidian/Components/CheckboxComponent.d.mts +10 -0
  21. package/dist/lib/esm/obsidian/Components/CheckboxComponent.mjs +11 -1
  22. package/dist/lib/esm/obsidian/Components/TriStateCheckboxComponent.d.mts +10 -0
  23. package/dist/lib/esm/obsidian/Components/TriStateCheckboxComponent.mjs +11 -1
  24. package/dist/lib/esm/obsidian/Modals/ModalBase.d.mts +7 -0
  25. package/dist/lib/esm/obsidian/Modals/ModalBase.mjs +8 -1
  26. package/dist/lib/esm/obsidian/Plugin/PluginBase.d.mts +20 -2
  27. package/dist/lib/esm/obsidian/Plugin/PluginBase.mjs +23 -5
  28. package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.d.mts +102 -8
  29. package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.mjs +113 -15
  30. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.d.mts +23 -0
  31. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.mjs +39 -2
  32. package/package.json +1 -1
@@ -48,7 +48,7 @@ class EditableSettingsProxyHandler extends ProxyHandlerBase {
48
48
  return true;
49
49
  }
50
50
  property.setValue(value);
51
- this.validationPromise = this.validationPromise.then(() => property.setValueAndValidate(value));
51
+ this.validationPromise = this.validationPromise.then(() => property.validate());
52
52
  return true;
53
53
  }
54
54
  getPropertyValue(property) {
@@ -73,16 +73,26 @@ class SafeSettingsProxyHandler extends ProxyHandlerBase {
73
73
  }
74
74
  }
75
75
  class PluginSettingsManagerBase {
76
+ /**
77
+ * Creates a new plugin settings manager.
78
+ *
79
+ * @param plugin - The plugin.
80
+ */
76
81
  constructor(plugin) {
77
82
  this.plugin = plugin;
78
83
  this.app = plugin.app;
79
84
  this.currentSettings = this.createDefaultSettings();
80
85
  this.registerValidators();
81
86
  this.properties = new PropertiesMap();
87
+ const record = this.currentSettings;
82
88
  for (const propertyName of getAllKeys(this.currentSettings)) {
89
+ let propertySetter2 = function(value) {
90
+ record[propertyName] = value;
91
+ };
92
+ var propertySetter = propertySetter2;
83
93
  this.properties.set(
84
94
  propertyName,
85
- new PluginSettingsProperty(propertyName, this.currentSettings[propertyName], this.validators.get(propertyName) ?? noop)
95
+ new PluginSettingsProperty(propertyName, this.currentSettings[propertyName], this.validators.get(propertyName) ?? noop, propertySetter2)
86
96
  );
87
97
  }
88
98
  this.validators.clear();
@@ -94,16 +104,35 @@ class PluginSettingsManagerBase {
94
104
  properties;
95
105
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
96
106
  validators = /* @__PURE__ */ new Map();
97
- async editAndSave(editor) {
107
+ /**
108
+ * Edits the plugin settings and saves them.
109
+ *
110
+ * @param editor - The editor.
111
+ * @param context - The context.
112
+ * @returns A {@link Promise} that resolves when the settings are saved.
113
+ */
114
+ async editAndSave(editor, context) {
98
115
  const editableSettings = new Proxy(this.currentSettings, new EditableSettingsProxyHandler(this.properties));
99
116
  await editor(editableSettings);
100
117
  await editableSettings.validationPromise;
101
- await this.saveToFile();
118
+ await this.saveToFile(context);
102
119
  }
120
+ /**
121
+ * Gets a property of the plugin settings.
122
+ *
123
+ * @param propertyName - The name of the property.
124
+ * @returns The property.
125
+ */
103
126
  getProperty(propertyName) {
104
127
  return this.properties.getTyped(propertyName);
105
128
  }
106
- async loadFromFile() {
129
+ /**
130
+ * Loads the plugin settings from the file.
131
+ *
132
+ * @param isInitialLoad - Whether the settings are being loaded for the first time.
133
+ * @returns A {@link Promise} that resolves when the settings are loaded.
134
+ */
135
+ async loadFromFile(isInitialLoad) {
107
136
  for (const property of this.properties.values()) {
108
137
  property.reset();
109
138
  }
@@ -141,21 +170,22 @@ class PluginSettingsManagerBase {
141
170
  propertiesToSave.push(property);
142
171
  }
143
172
  for (const property of propertiesToSave) {
144
- await property.setValueAndValidate(property.currentValue);
173
+ await property.validate();
145
174
  property.save();
146
175
  }
147
176
  const newJson = JSON.stringify(await this.prepareRecordToSave());
148
177
  if (newJson !== originalJson) {
149
178
  await this.saveToFileImpl();
150
179
  }
151
- await this.plugin.onLoadSettings(this.getSavedSettings());
180
+ await this.plugin.onLoadSettings(this.getSavedSettings(), isInitialLoad);
152
181
  }
153
182
  /**
154
183
  * Saves the new plugin settings.
155
184
  *
185
+ * @param context - The context of the save to file operation.
156
186
  * @returns A {@link Promise} that resolves when the settings are saved.
157
187
  */
158
- async saveToFile() {
188
+ async saveToFile(context) {
159
189
  const oldSettings = this.getSavedSettings();
160
190
  let hasChanges = false;
161
191
  for (const property of this.properties.values()) {
@@ -165,8 +195,13 @@ class PluginSettingsManagerBase {
165
195
  return;
166
196
  }
167
197
  await this.saveToFileImpl();
168
- await this.plugin.onSaveSettings(this.getSavedSettings(), oldSettings);
198
+ await this.plugin.onSaveSettings(this.getSavedSettings(), oldSettings, context);
169
199
  }
200
+ /**
201
+ * Gets the transformer.
202
+ *
203
+ * @returns The transformer.
204
+ */
170
205
  getTransformer() {
171
206
  return defaultTransformer;
172
207
  }
@@ -186,9 +221,20 @@ class PluginSettingsManagerBase {
186
221
  async onSavingRecord(_record) {
187
222
  await noopAsync();
188
223
  }
224
+ /**
225
+ * Registers a validator for a property.
226
+ *
227
+ * @param propertyName - The name of the property.
228
+ * @param validator - The validator.
229
+ */
189
230
  registerValidator(propertyName, validator) {
190
231
  this.validators.set(propertyName, validator);
191
232
  }
233
+ /**
234
+ * Registers the validators.
235
+ *
236
+ * This method can be overridden by subclasses to register validators for properties.
237
+ */
192
238
  registerValidators() {
193
239
  noop();
194
240
  }
@@ -214,32 +260,69 @@ class PluginSettingsManagerBase {
214
260
  }
215
261
  }
216
262
  class PluginSettingsProperty {
217
- constructor(propertyName, defaultValue, validator) {
263
+ /**
264
+ * Creates a new plugin settings property.
265
+ *
266
+ * @param propertyName - The name of the property.
267
+ * @param defaultValue - The default value of the property.
268
+ * @param validator - The validator of the property.
269
+ * @param propertySetter - The property setter of the property.
270
+ */
271
+ constructor(propertyName, defaultValue, validator, propertySetter) {
218
272
  this.propertyName = propertyName;
219
273
  this.defaultValue = defaultValue;
220
274
  this.validator = validator;
275
+ this.propertySetter = propertySetter;
221
276
  this._lastSavedValue = defaultValue;
222
277
  this._currentValue = defaultValue;
223
278
  }
279
+ /**
280
+ * The current value of the property.
281
+ *
282
+ * @returns The current value.
283
+ */
224
284
  get currentValue() {
225
285
  return this._currentValue;
226
286
  }
287
+ /**
288
+ * The last saved value of the property.
289
+ *
290
+ * @returns The last saved value.
291
+ */
227
292
  get lastSavedValue() {
228
293
  return this._lastSavedValue;
229
294
  }
295
+ /**
296
+ * The safe value of the property.
297
+ *
298
+ * @returns The safe value.
299
+ */
230
300
  get safeValue() {
231
301
  return this._validationMessage ? this.defaultValue : this._currentValue;
232
302
  }
303
+ /**
304
+ * The validation message of the property.
305
+ *
306
+ * @returns The validation message.
307
+ */
233
308
  get validationMessage() {
234
309
  return this._validationMessage;
235
310
  }
236
311
  _currentValue;
237
312
  _lastSavedValue;
238
313
  _validationMessage = "";
314
+ /**
315
+ * Resets the current value of the property to the default value.
316
+ */
239
317
  reset() {
240
318
  this._currentValue = this.defaultValue;
241
319
  this._validationMessage = "";
242
320
  }
321
+ /**
322
+ * Saves the current value of the property.
323
+ *
324
+ * @returns `true` if the value was changed, `false` otherwise.
325
+ */
243
326
  save() {
244
327
  if (this._lastSavedValue === this._currentValue) {
245
328
  return false;
@@ -247,25 +330,40 @@ class PluginSettingsProperty {
247
330
  this._lastSavedValue = this._currentValue;
248
331
  return true;
249
332
  }
333
+ /**
334
+ * Sets the validation message of the property.
335
+ *
336
+ * @param validationMessage - The validation message.
337
+ */
250
338
  setValidationMessage(validationMessage) {
251
339
  this._validationMessage = validationMessage;
252
340
  this.showWarning();
253
341
  }
342
+ /**
343
+ * Sets the current value of the property.
344
+ *
345
+ * @param value - The value to set.
346
+ */
254
347
  setValue(value) {
255
348
  this._currentValue = value;
349
+ this.propertySetter(value);
256
350
  }
257
- async setValueAndValidate(value) {
258
- this.setValue(value);
351
+ /**
352
+ * Validates the current value of the property.
353
+ *
354
+ * @returns A {@link Promise} that resolves when the validation is complete.
355
+ */
356
+ async validate() {
259
357
  try {
260
358
  this._validationMessage = await this.validator(this._currentValue) ?? "";
261
359
  } catch (error) {
262
360
  console.error("Validation failed", {
263
361
  propertyName: this.propertyName,
264
- value
362
+ value: this._currentValue
265
363
  }, error);
266
364
  this._validationMessage = "Validation failed";
267
365
  }
268
- this.showWarning(value);
366
+ this.showWarning(this._currentValue);
269
367
  }
270
368
  showWarning(value) {
271
369
  if (!this._validationMessage) {
@@ -283,4 +381,4 @@ export {
283
381
  PluginSettingsManagerBase,
284
382
  PluginSettingsProperty
285
383
  };
286
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFBsdWdpbiBzZXR0aW5ncyBtYW5hZ2VyIGJhc2UgY2xhc3MuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7XG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL1RyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgTWF5YmVSZXR1cm4sXG4gIFN0cmluZ0tleXNcbn0gZnJvbSAnLi4vLi4vVHlwZS50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEV4dHJhY3RQbHVnaW4sXG4gIEV4dHJhY3RQbHVnaW5TZXR0aW5ncyxcbiAgUGx1Z2luVHlwZXNCYXNlXG59IGZyb20gJy4vUGx1Z2luVHlwZXNCYXNlLnRzJztcblxuaW1wb3J0IHtcbiAgbm9vcCxcbiAgbm9vcEFzeW5jXG59IGZyb20gJy4uLy4uL0Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldEFsbEtleXMgfSBmcm9tICcuLi8uLi9PYmplY3QudHMnO1xuaW1wb3J0IHsgRGF0ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0RhdGVUcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBEdXJhdGlvblRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0R1cmF0aW9uVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgR3JvdXBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9Hcm91cFRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9Ta2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIudHMnO1xuXG5jb25zdCBkZWZhdWx0VHJhbnNmb3JtZXIgPSBuZXcgR3JvdXBUcmFuc2Zvcm1lcihbXG4gIG5ldyBTa2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIoKSxcbiAgbmV3IERhdGVUcmFuc2Zvcm1lcigpLFxuICBuZXcgRHVyYXRpb25UcmFuc2Zvcm1lcigpXG5dKTtcblxudHlwZSBWYWxpZGF0b3I8VD4gPSAodmFsdWU6IFQpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbmFic3RyYWN0IGNsYXNzIFByb3h5SGFuZGxlckJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGltcGxlbWVudHMgUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncz4pIHt9XG5cbiAgcHVibGljIGdldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgICBjb25zdCByZWNvcmQgPSB0YXJnZXQgYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93bjtcbn1cblxuY2xhc3MgRWRpdGFibGVTZXR0aW5nc1Byb3h5SGFuZGxlcjxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBQcm94eUhhbmRsZXJCYXNlPFBsdWdpblNldHRpbmdzPiB7XG4gIHByaXZhdGUgdmFsaWRhdGlvblByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHVibGljIHNldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVjb3JkID0gdGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuICAgIHJlY29yZFtwcm9wXSA9IHZhbHVlO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnByb3BlcnRpZXMuZ2V0KHByb3ApO1xuICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLnZhbGlkYXRpb25Qcm9taXNlID0gdGhpcy52YWxpZGF0aW9uUHJvbWlzZS50aGVuKCgpID0+IHByb3BlcnR5LnNldFZhbHVlQW5kVmFsaWRhdGUodmFsdWUpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93biB7XG4gICAgcmV0dXJuIHByb3BlcnR5LmN1cnJlbnRWYWx1ZTtcbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY2xhc3MgUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBNYXA8c3RyaW5nLCBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PGFueT4+IHtcbiAgcHVibGljIGdldFR5cGVkPFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+Pihwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT4ge1xuICAgIGNvbnN0IHByb3BlcnR5ID0gc3VwZXIuZ2V0KHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSAke1N0cmluZyhwcm9wZXJ0eU5hbWUpfSBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcGVydHkgYXMgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRUeXBlZDxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsdWU6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT5cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyLnNldChwcm9wZXJ0eU5hbWUsIHZhbHVlKTtcbiAgfVxufVxuXG5jbGFzcyBTYWZlU2V0dGluZ3NQcm94eUhhbmRsZXI8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgUHJveHlIYW5kbGVyQmFzZTxQbHVnaW5TZXR0aW5ncz4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTx1bmtub3duPik6IHVua25vd24ge1xuICAgIHJldHVybiBwcm9wZXJ0eS5zYWZlVmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBtYW5hZ2luZyBwbHVnaW4gc2V0dGluZ3MuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5UeXBlcyAtIFBsdWdpbi1zcGVjaWZpYyB0eXBlcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzTWFuYWdlckJhc2U8UGx1Z2luVHlwZXMgZXh0ZW5kcyBQbHVnaW5UeXBlc0Jhc2U+IHtcbiAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwdWJsaWMgcmVhZG9ubHkgc2FmZVNldHRpbmdzOiBSZWFkb25seURlZXA8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPj47XG5cbiAgcHJpdmF0ZSBjdXJyZW50U2V0dGluZ3M6IEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz47XG4gIHByaXZhdGUgcHJvcGVydGllczogUHJvcGVydGllc01hcDxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+PjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSB2YWxpZGF0b3JzOiBNYXA8c3RyaW5nLCBWYWxpZGF0b3I8YW55Pj4gPSBuZXcgTWFwPHN0cmluZywgVmFsaWRhdG9yPGFueT4+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbHVnaW46IEV4dHJhY3RQbHVnaW48UGx1Z2luVHlwZXM+KSB7XG4gICAgdGhpcy5hcHAgPSBwbHVnaW4uYXBwO1xuICAgIHRoaXMuY3VycmVudFNldHRpbmdzID0gdGhpcy5jcmVhdGVEZWZhdWx0U2V0dGluZ3MoKTtcblxuICAgIHRoaXMucmVnaXN0ZXJWYWxpZGF0b3JzKCk7XG5cbiAgICB0aGlzLnByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc01hcDxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+PigpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgZ2V0QWxsS2V5cyh0aGlzLmN1cnJlbnRTZXR0aW5ncykpIHtcbiAgICAgIHRoaXMucHJvcGVydGllcy5zZXQoXG4gICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgbmV3IFBsdWdpblNldHRpbmdzUHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmN1cnJlbnRTZXR0aW5nc1twcm9wZXJ0eU5hbWVdLCB0aGlzLnZhbGlkYXRvcnMuZ2V0KHByb3BlcnR5TmFtZSkgPz8gbm9vcClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0b3JzLmNsZWFyKCk7XG5cbiAgICB0aGlzLnNhZmVTZXR0aW5ncyA9IG5ldyBQcm94eSh0aGlzLmN1cnJlbnRTZXR0aW5ncywgbmV3IFNhZmVTZXR0aW5nc1Byb3h5SGFuZGxlcjxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+Pih0aGlzLnByb3BlcnRpZXMpKSBhcyBSZWFkb25seURlZXA8XG4gICAgICBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+XG4gICAgPjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlZGl0QW5kU2F2ZShlZGl0b3I6IChzZXR0aW5nczogRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPikgPT4gUHJvbWlzYWJsZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVkaXRhYmxlU2V0dGluZ3MgPSBuZXcgUHJveHkodGhpcy5jdXJyZW50U2V0dGluZ3MsIG5ldyBFZGl0YWJsZVNldHRpbmdzUHJveHlIYW5kbGVyPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz4+KHRoaXMucHJvcGVydGllcykpIGFzIHtcbiAgICAgIHZhbGlkYXRpb25Qcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAgIH0gJiBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+O1xuICAgIGF3YWl0IGVkaXRvcihlZGl0YWJsZVNldHRpbmdzKTtcbiAgICBhd2FpdCBlZGl0YWJsZVNldHRpbmdzLnZhbGlkYXRpb25Qcm9taXNlO1xuICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldFByb3BlcnR5PFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPj4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lXG4gICk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPltQcm9wZXJ0eU5hbWVdPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXRUeXBlZChwcm9wZXJ0eU5hbWUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWRGcm9tRmlsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHRoaXMucHJvcGVydGllcy52YWx1ZXMoKSkge1xuICAgICAgcHJvcGVydHkucmVzZXQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5wbHVnaW4ubG9hZERhdGEoKSBhcyB1bmtub3duO1xuXG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBjb25zdCB0eXBlID0gQXJyYXkuaXNBcnJheShkYXRhKSA/ICdBcnJheScgOiB0eXBlb2YgZGF0YTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgZGF0YSB0eXBlLiBFeHBlY3RlZCBPYmplY3QsIGdvdDogJHt0eXBlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZWNvcmQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG9yaWdpbmFsSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJlY29yZCk7XG4gICAgcmVjb3JkID0gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHJlY29yZCk7XG4gICAgYXdhaXQgdGhpcy5vbkxvYWRSZWNvcmQocmVjb3JkKTtcblxuICAgIGNvbnN0IHByb3BlcnRpZXNUb1NhdmU6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8dW5rbm93bj5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnByb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZSk7XG4gICAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biBwcm9wZXJ0eTogJHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSB0eXBlb2YgcHJvcGVydHkuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnUG9zc2libGUgaW52YWxpZCB2YWx1ZSB0eXBlIHJlYWQgZnJvbSBjb25maWcgZmlsZS4gSXQgbWlnaHQgbGVhZCB0byBhbiB1bmV4cGVjdGVkIGJlaGF2aW9yIG9mIHRoZSBwbHVnaW4uIFRoZXJlIGlzIGFsc28gYSBjaGFuY2UgaXQgaXMgYSBmYWxzZS1uZWdhdGl2ZSB3YXJuaW5nLCBhcyB3ZSBhcmUgdW5hYmxlIHRvIGRldGVybWluZSB0aGUgZXhhY3QgdHlwZSBvZiB0aGUgdmFsdWUgaW4gcnVudGltZS4nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogcHJvcGVydHkuZGVmYXVsdFZhbHVlIGFzIHVua25vd24sXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcHJvcGVydHkuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgcHJvcGVydGllc1RvU2F2ZS5wdXNoKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXNUb1NhdmUpIHtcbiAgICAgIGF3YWl0IHByb3BlcnR5LnNldFZhbHVlQW5kVmFsaWRhdGUocHJvcGVydHkuY3VycmVudFZhbHVlKTtcbiAgICAgIHByb3BlcnR5LnNhdmUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdKc29uID0gSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGhpcy5wcmVwYXJlUmVjb3JkVG9TYXZlKCkpO1xuXG4gICAgaWYgKG5ld0pzb24gIT09IG9yaWdpbmFsSnNvbikge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlSW1wbCgpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucGx1Z2luLm9uTG9hZFNldHRpbmdzKHRoaXMuZ2V0U2F2ZWRTZXR0aW5ncygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgbmV3IHBsdWdpbiBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgc2F2ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZVRvRmlsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHRoaXMuZ2V0U2F2ZWRTZXR0aW5ncygpO1xuXG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdGhpcy5wcm9wZXJ0aWVzLnZhbHVlcygpKSB7XG4gICAgICBoYXNDaGFuZ2VzIHx8PSBwcm9wZXJ0eS5zYXZlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNDaGFuZ2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlSW1wbCgpO1xuICAgIGF3YWl0IHRoaXMucGx1Z2luLm9uU2F2ZVNldHRpbmdzKHRoaXMuZ2V0U2F2ZWRTZXR0aW5ncygpLCBvbGRTZXR0aW5ncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlRGVmYXVsdFNldHRpbmdzKCk6IEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz47XG5cbiAgcHJvdGVjdGVkIGdldFRyYW5zZm9ybWVyKCk6IFRyYW5zZm9ybWVyIHtcbiAgICByZXR1cm4gZGVmYXVsdFRyYW5zZm9ybWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlIGxvYWRlZC5cbiAgICpcbiAgICogQHBhcmFtIF9yZWNvcmQgLSBUaGUgcmVjb3JkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uTG9hZFJlY29yZChfcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlIHNhdmluZy5cbiAgICpcbiAgICogQHBhcmFtIF9yZWNvcmQgLSBUaGUgcmVjb3JkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uU2F2aW5nUmVjb3JkKF9yZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJWYWxpZGF0b3I8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+Pj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsaWRhdG9yOiBWYWxpZGF0b3I8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPltQcm9wZXJ0eU5hbWVdPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRvcnMuc2V0KHByb3BlcnR5TmFtZSwgdmFsaWRhdG9yKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlclZhbGlkYXRvcnMoKTogdm9pZCB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTYXZlZFNldHRpbmdzKCk6IEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz4ge1xuICAgIGNvbnN0IHNhdmVkU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCBwcm9wZXJ0eV0gb2YgdGhpcy5wcm9wZXJ0aWVzLmVudHJpZXMoKSkge1xuICAgICAgc2F2ZWRTZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHkubGFzdFNhdmVkVmFsdWUgYXNcbiAgICAgICAgfCBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+W1N0cmluZ0tleXM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPj5dXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzLmN1cnJlbnRTZXR0aW5ncykgYXMgb2JqZWN0O1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihzYXZlZFNldHRpbmdzLCBwcm90byk7XG5cbiAgICByZXR1cm4gc2F2ZWRTZXR0aW5ncyBhcyBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlUmVjb3JkVG9TYXZlKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICBjb25zdCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHByb3BlcnR5XSBvZiB0aGlzLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG4gICAgICBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHkuY3VycmVudFZhbHVlIGFzIHVua25vd247XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5vblNhdmluZ1JlY29yZChzZXR0aW5ncyk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHNldHRpbmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVRvRmlsZUltcGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEoYXdhaXQgdGhpcy5wcmVwYXJlUmVjb3JkVG9TYXZlKCkpO1xuICB9XG59XG5cbi8qKlxuICogQSBwcm9wZXJ0eSBvZiBhIHBsdWdpbiBzZXR0aW5ncy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFQ+IHtcbiAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGFzdFNhdmVkVmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX2xhc3RTYXZlZFZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzYWZlVmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB0aGlzLl9jdXJyZW50VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbGlkYXRpb25NZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3VycmVudFZhbHVlOiBUO1xuXG4gIHByaXZhdGUgX2xhc3RTYXZlZFZhbHVlOiBUO1xuXG4gIHByaXZhdGUgX3ZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VmFsdWU6IFQsIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdG9yOiBWYWxpZGF0b3I8VD4pIHtcbiAgICB0aGlzLl9sYXN0U2F2ZWRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudFZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWU7XG4gICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UgPSAnJztcbiAgfVxuXG4gIHB1YmxpYyBzYXZlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9sYXN0U2F2ZWRWYWx1ZSA9PT0gdGhpcy5fY3VycmVudFZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFNhdmVkVmFsdWUgPSB0aGlzLl9jdXJyZW50VmFsdWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFsaWRhdGlvbk1lc3NhZ2UodmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID0gdmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgdGhpcy5zaG93V2FybmluZygpO1xuICB9XG5cbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudFZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0VmFsdWVBbmRWYWxpZGF0ZSh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSA9IChhd2FpdCB0aGlzLnZhbGlkYXRvcih0aGlzLl9jdXJyZW50VmFsdWUpIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gJyc7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1ZhbGlkYXRpb24gZmFpbGVkJywge1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHRoaXMucHJvcGVydHlOYW1lLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSwgZXJyb3IpO1xuICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UgPSAnVmFsaWRhdGlvbiBmYWlsZWQnO1xuICAgIH1cbiAgICB0aGlzLnNob3dXYXJuaW5nKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd1dhcm5pbmcodmFsdWU/OiBUKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IHNldCBwbHVnaW4gc2V0dGluZzogJHt0aGlzLnByb3BlcnR5TmFtZX0uIFVzaW5nIGRlZmF1bHQgdmFsdWUgaW5zdGVhZC5gLCB7XG4gICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuZGVmYXVsdFZhbHVlLFxuICAgICAgcHJvcGVydHlOYW1lOiB0aGlzLnByb3BlcnR5TmFtZSxcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlOiB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7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
384
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFBsdWdpbiBzZXR0aW5ncyBtYW5hZ2VyIGJhc2UgY2xhc3MuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7XG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL1RyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgTWF5YmVSZXR1cm4sXG4gIFN0cmluZ0tleXNcbn0gZnJvbSAnLi4vLi4vVHlwZS50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEV4dHJhY3RQbHVnaW4sXG4gIEV4dHJhY3RQbHVnaW5TZXR0aW5ncyxcbiAgUGx1Z2luVHlwZXNCYXNlXG59IGZyb20gJy4vUGx1Z2luVHlwZXNCYXNlLnRzJztcblxuaW1wb3J0IHtcbiAgbm9vcCxcbiAgbm9vcEFzeW5jXG59IGZyb20gJy4uLy4uL0Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldEFsbEtleXMgfSBmcm9tICcuLi8uLi9PYmplY3QudHMnO1xuaW1wb3J0IHsgRGF0ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0RhdGVUcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBEdXJhdGlvblRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0R1cmF0aW9uVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgR3JvdXBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9Hcm91cFRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9Ta2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIudHMnO1xuXG5jb25zdCBkZWZhdWx0VHJhbnNmb3JtZXIgPSBuZXcgR3JvdXBUcmFuc2Zvcm1lcihbXG4gIG5ldyBTa2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIoKSxcbiAgbmV3IERhdGVUcmFuc2Zvcm1lcigpLFxuICBuZXcgRHVyYXRpb25UcmFuc2Zvcm1lcigpXG5dKTtcblxudHlwZSBQcm9wZXJ0eVNldHRlciA9ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZDtcblxudHlwZSBWYWxpZGF0b3I8VD4gPSAodmFsdWU6IFQpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbmFic3RyYWN0IGNsYXNzIFByb3h5SGFuZGxlckJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGltcGxlbWVudHMgUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncz4pIHt9XG5cbiAgcHVibGljIGdldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgICBjb25zdCByZWNvcmQgPSB0YXJnZXQgYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93bjtcbn1cblxuY2xhc3MgRWRpdGFibGVTZXR0aW5nc1Byb3h5SGFuZGxlcjxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBQcm94eUhhbmRsZXJCYXNlPFBsdWdpblNldHRpbmdzPiB7XG4gIHByaXZhdGUgdmFsaWRhdGlvblByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHVibGljIHNldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVjb3JkID0gdGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuICAgIHJlY29yZFtwcm9wXSA9IHZhbHVlO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnByb3BlcnRpZXMuZ2V0KHByb3ApO1xuICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLnZhbGlkYXRpb25Qcm9taXNlID0gdGhpcy52YWxpZGF0aW9uUHJvbWlzZS50aGVuKCgpID0+IHByb3BlcnR5LnZhbGlkYXRlKCkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldFByb3BlcnR5VmFsdWUocHJvcGVydHk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8dW5rbm93bj4pOiB1bmtub3duIHtcbiAgICByZXR1cm4gcHJvcGVydHkuY3VycmVudFZhbHVlO1xuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jbGFzcyBQcm9wZXJ0aWVzTWFwPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIE1hcDxzdHJpbmcsIFBsdWdpblNldHRpbmdzUHJvcGVydHk8YW55Pj4ge1xuICBwdWJsaWMgZ2V0VHlwZWQ8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lKTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPiB7XG4gICAgY29uc3QgcHJvcGVydHkgPSBzdXBlci5nZXQocHJvcGVydHlOYW1lKTtcbiAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5ICR7U3RyaW5nKHByb3BlcnR5TmFtZSl9IG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9wZXJ0eSBhcyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+O1xuICB9XG5cbiAgcHVibGljIHNldFR5cGVkPFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+PihcbiAgICBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSxcbiAgICB2YWx1ZTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPlxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXIuc2V0KHByb3BlcnR5TmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbmNsYXNzIFNhZmVTZXR0aW5nc1Byb3h5SGFuZGxlcjxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBQcm94eUhhbmRsZXJCYXNlPFBsdWdpblNldHRpbmdzPiB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93biB7XG4gICAgcmV0dXJuIHByb3BlcnR5LnNhZmVWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIG1hbmFnaW5nIHBsdWdpbiBzZXR0aW5ncy5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblR5cGVzIC0gUGx1Z2luLXNwZWNpZmljIHR5cGVzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUGx1Z2luU2V0dGluZ3NNYW5hZ2VyQmFzZTxQbHVnaW5UeXBlcyBleHRlbmRzIFBsdWdpblR5cGVzQmFzZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHB1YmxpYyByZWFkb25seSBzYWZlU2V0dGluZ3M6IFJlYWRvbmx5RGVlcDxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRTZXR0aW5nczogRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPjtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzTWFwPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz4+O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcnM6IE1hcDxzdHJpbmcsIFZhbGlkYXRvcjxhbnk+PiA9IG5ldyBNYXA8c3RyaW5nLCBWYWxpZGF0b3I8YW55Pj4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gc2V0dGluZ3MgbWFuYWdlci5cbiAgICpcbiAgICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHBsdWdpbjogRXh0cmFjdFBsdWdpbjxQbHVnaW5UeXBlcz4pIHtcbiAgICB0aGlzLmFwcCA9IHBsdWdpbi5hcHA7XG4gICAgdGhpcy5jdXJyZW50U2V0dGluZ3MgPSB0aGlzLmNyZWF0ZURlZmF1bHRTZXR0aW5ncygpO1xuXG4gICAgdGhpcy5yZWdpc3RlclZhbGlkYXRvcnMoKTtcblxuICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzTWFwPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz4+KCk7XG5cbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLmN1cnJlbnRTZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIGdldEFsbEtleXModGhpcy5jdXJyZW50U2V0dGluZ3MpKSB7XG4gICAgICBmdW5jdGlvbiBwcm9wZXJ0eVNldHRlcih2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICByZWNvcmRbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByb3BlcnRpZXMuc2V0KFxuICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIG5ldyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgdGhpcy5jdXJyZW50U2V0dGluZ3NbcHJvcGVydHlOYW1lXSwgdGhpcy52YWxpZGF0b3JzLmdldChwcm9wZXJ0eU5hbWUpID8/IG5vb3AsIHByb3BlcnR5U2V0dGVyKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRvcnMuY2xlYXIoKTtcblxuICAgIHRoaXMuc2FmZVNldHRpbmdzID0gbmV3IFByb3h5KHRoaXMuY3VycmVudFNldHRpbmdzLCBuZXcgU2FmZVNldHRpbmdzUHJveHlIYW5kbGVyPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz4+KHRoaXMucHJvcGVydGllcykpIGFzIFJlYWRvbmx5RGVlcDxcbiAgICAgIEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz5cbiAgICA+O1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBwbHVnaW4gc2V0dGluZ3MgYW5kIHNhdmVzIHRoZW0uXG4gICAqXG4gICAqIEBwYXJhbSBlZGl0b3IgLSBUaGUgZWRpdG9yLlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSBjb250ZXh0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlZGl0QW5kU2F2ZShlZGl0b3I6IChzZXR0aW5nczogRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPikgPT4gUHJvbWlzYWJsZTx2b2lkPiwgY29udGV4dD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBlZGl0YWJsZVNldHRpbmdzID0gbmV3IFByb3h5KHRoaXMuY3VycmVudFNldHRpbmdzLCBuZXcgRWRpdGFibGVTZXR0aW5nc1Byb3h5SGFuZGxlcjxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+Pih0aGlzLnByb3BlcnRpZXMpKSBhcyB7XG4gICAgICB2YWxpZGF0aW9uUHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgICB9ICYgRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPjtcbiAgICBhd2FpdCBlZGl0b3IoZWRpdGFibGVTZXR0aW5ncyk7XG4gICAgYXdhaXQgZWRpdGFibGVTZXR0aW5ncy52YWxpZGF0aW9uUHJvbWlzZTtcbiAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGUoY29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHByb3BlcnR5IG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXG4gICAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBnZXRQcm9wZXJ0eTxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz4+PihcbiAgICBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZVxuICApOiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz5bUHJvcGVydHlOYW1lXT4ge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0VHlwZWQocHJvcGVydHlOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgcGx1Z2luIHNldHRpbmdzIGZyb20gdGhlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBpc0luaXRpYWxMb2FkIC0gV2hldGhlciB0aGUgc2V0dGluZ3MgYXJlIGJlaW5nIGxvYWRlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIGxvYWRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkRnJvbUZpbGUoaXNJbml0aWFsTG9hZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdGhpcy5wcm9wZXJ0aWVzLnZhbHVlcygpKSB7XG4gICAgICBwcm9wZXJ0eS5yZXNldCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnBsdWdpbi5sb2FkRGF0YSgpIGFzIHVua25vd247XG5cbiAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkIHx8IGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gJ0FycmF5JyA6IHR5cGVvZiBkYXRhO1xuICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBkYXRhIHR5cGUuIEV4cGVjdGVkIE9iamVjdCwgZ290OiAke3R5cGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJlY29yZCA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qgb3JpZ2luYWxKc29uID0gSlNPTi5zdHJpbmdpZnkocmVjb3JkKTtcbiAgICByZWNvcmQgPSB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkocmVjb3JkKTtcbiAgICBhd2FpdCB0aGlzLm9uTG9hZFJlY29yZChyZWNvcmQpO1xuXG4gICAgY29uc3QgcHJvcGVydGllc1RvU2F2ZTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTx1bmtub3duPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQpKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lKTtcbiAgICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBVbmtub3duIHByb3BlcnR5OiAke3Byb3BlcnR5TmFtZX1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IHR5cGVvZiBwcm9wZXJ0eS5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdQb3NzaWJsZSBpbnZhbGlkIHZhbHVlIHR5cGUgcmVhZCBmcm9tIGNvbmZpZyBmaWxlLiBJdCBtaWdodCBsZWFkIHRvIGFuIHVuZXhwZWN0ZWQgYmVoYXZpb3Igb2YgdGhlIHBsdWdpbi4gVGhlcmUgaXMgYWxzbyBhIGNoYW5jZSBpdCBpcyBhIGZhbHNlLW5lZ2F0aXZlIHdhcm5pbmcsIGFzIHdlIGFyZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBleGFjdCB0eXBlIG9mIHRoZSB2YWx1ZSBpbiBydW50aW1lLicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBwcm9wZXJ0eS5kZWZhdWx0VmFsdWUgYXMgdW5rbm93bixcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICBwcm9wZXJ0aWVzVG9TYXZlLnB1c2gocHJvcGVydHkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllc1RvU2F2ZSkge1xuICAgICAgYXdhaXQgcHJvcGVydHkudmFsaWRhdGUoKTtcbiAgICAgIHByb3BlcnR5LnNhdmUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdKc29uID0gSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGhpcy5wcmVwYXJlUmVjb3JkVG9TYXZlKCkpO1xuXG4gICAgaWYgKG5ld0pzb24gIT09IG9yaWdpbmFsSnNvbikge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlSW1wbCgpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucGx1Z2luLm9uTG9hZFNldHRpbmdzKHRoaXMuZ2V0U2F2ZWRTZXR0aW5ncygpLCBpc0luaXRpYWxMb2FkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgbmV3IHBsdWdpbiBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUgY29udGV4dCBvZiB0aGUgc2F2ZSB0byBmaWxlIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgc2F2ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZVRvRmlsZShjb250ZXh0PzogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0gdGhpcy5nZXRTYXZlZFNldHRpbmdzKCk7XG5cbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLnByb3BlcnRpZXMudmFsdWVzKCkpIHtcbiAgICAgIGhhc0NoYW5nZXMgfHw9IHByb3BlcnR5LnNhdmUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NoYW5nZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGVJbXBsKCk7XG4gICAgYXdhaXQgdGhpcy5wbHVnaW4ub25TYXZlU2V0dGluZ3ModGhpcy5nZXRTYXZlZFNldHRpbmdzKCksIG9sZFNldHRpbmdzLCBjb250ZXh0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVEZWZhdWx0U2V0dGluZ3MoKTogRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgdHJhbnNmb3JtZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lci5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRUcmFuc2Zvcm1lcigpOiBUcmFuc2Zvcm1lciB7XG4gICAgcmV0dXJuIGRlZmF1bHRUcmFuc2Zvcm1lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIHNldHRpbmdzIGFyZSBsb2FkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBfcmVjb3JkIC0gVGhlIHJlY29yZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkxvYWRSZWNvcmQoX3JlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIHNldHRpbmdzIGFyZSBzYXZpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBfcmVjb3JkIC0gVGhlIHJlY29yZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvblNhdmluZ1JlY29yZChfcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhbGlkYXRvciBmb3IgYSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHZhbGlkYXRvciAtIFRoZSB2YWxpZGF0b3IuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJWYWxpZGF0b3I8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+Pj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsaWRhdG9yOiBWYWxpZGF0b3I8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPltQcm9wZXJ0eU5hbWVdPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRvcnMuc2V0KHByb3BlcnR5TmFtZSwgdmFsaWRhdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIHZhbGlkYXRvcnMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gcmVnaXN0ZXIgdmFsaWRhdG9ycyBmb3IgcHJvcGVydGllcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWdpc3RlclZhbGlkYXRvcnMoKTogdm9pZCB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTYXZlZFNldHRpbmdzKCk6IEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz4ge1xuICAgIGNvbnN0IHNhdmVkU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCBwcm9wZXJ0eV0gb2YgdGhpcy5wcm9wZXJ0aWVzLmVudHJpZXMoKSkge1xuICAgICAgc2F2ZWRTZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHkubGFzdFNhdmVkVmFsdWUgYXNcbiAgICAgICAgfCBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+W1N0cmluZ0tleXM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPj5dXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzLmN1cnJlbnRTZXR0aW5ncykgYXMgb2JqZWN0O1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihzYXZlZFNldHRpbmdzLCBwcm90byk7XG5cbiAgICByZXR1cm4gc2F2ZWRTZXR0aW5ncyBhcyBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlUmVjb3JkVG9TYXZlKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICBjb25zdCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHByb3BlcnR5XSBvZiB0aGlzLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG4gICAgICBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHkuY3VycmVudFZhbHVlIGFzIHVua25vd247XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5vblNhdmluZ1JlY29yZChzZXR0aW5ncyk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHNldHRpbmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVRvRmlsZUltcGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEoYXdhaXQgdGhpcy5wcmVwYXJlUmVjb3JkVG9TYXZlKCkpO1xuICB9XG59XG5cbi8qKlxuICogQSBwcm9wZXJ0eSBvZiBhIHBsdWdpbiBzZXR0aW5ncy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRWYWx1ZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBsYXN0IHNhdmVkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxhc3Qgc2F2ZWQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxhc3RTYXZlZFZhbHVlKCk6IFQge1xuICAgIHJldHVybiB0aGlzLl9sYXN0U2F2ZWRWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2FmZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzYWZlIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldCBzYWZlVmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB0aGlzLl9jdXJyZW50VmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbGlkYXRpb24gbWVzc2FnZSBvZiB0aGUgcHJvcGVydHkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbGlkYXRpb25NZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3VycmVudFZhbHVlOiBUO1xuXG4gIHByaXZhdGUgX2xhc3RTYXZlZFZhbHVlOiBUO1xuXG4gIHByaXZhdGUgX3ZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGx1Z2luIHNldHRpbmdzIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIC0gVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gdmFsaWRhdG9yIC0gVGhlIHZhbGlkYXRvciBvZiB0aGUgcHJvcGVydHkuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eVNldHRlciAtIFRoZSBwcm9wZXJ0eSBzZXR0ZXIgb2YgdGhlIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZTogVCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcjogVmFsaWRhdG9yPFQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcGVydHlTZXR0ZXI6IFByb3BlcnR5U2V0dGVyXG4gICkge1xuICAgIHRoaXMuX2xhc3RTYXZlZFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIHRoaXMuX2N1cnJlbnRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIHRoZSBkZWZhdWx0IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2N1cnJlbnRWYWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlO1xuICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIHdhcyBjaGFuZ2VkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBzYXZlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9sYXN0U2F2ZWRWYWx1ZSA9PT0gdGhpcy5fY3VycmVudFZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFNhdmVkVmFsdWUgPSB0aGlzLl9jdXJyZW50VmFsdWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHZhbGlkYXRpb25NZXNzYWdlIC0gVGhlIHZhbGlkYXRpb24gbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyBzZXRWYWxpZGF0aW9uTWVzc2FnZSh2YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UgPSB2YWxpZGF0aW9uTWVzc2FnZTtcbiAgICB0aGlzLnNob3dXYXJuaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICBwdWJsaWMgc2V0VmFsdWUodmFsdWU6IFQpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnByb3BlcnR5U2V0dGVyKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHZhbGlkYXRpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID0gKGF3YWl0IHRoaXMudmFsaWRhdG9yKHRoaXMuX2N1cnJlbnRWYWx1ZSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyAnJztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignVmFsaWRhdGlvbiBmYWlsZWQnLCB7XG4gICAgICAgIHByb3BlcnR5TmFtZTogdGhpcy5wcm9wZXJ0eU5hbWUsXG4gICAgICAgIHZhbHVlOiB0aGlzLl9jdXJyZW50VmFsdWVcbiAgICAgIH0sIGVycm9yKTtcbiAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID0gJ1ZhbGlkYXRpb24gZmFpbGVkJztcbiAgICB9XG4gICAgdGhpcy5zaG93V2FybmluZyh0aGlzLl9jdXJyZW50VmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93V2FybmluZyh2YWx1ZT86IFQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS53YXJuKGBDb3VsZCBub3Qgc2V0IHBsdWdpbiBzZXR0aW5nOiAke3RoaXMucHJvcGVydHlOYW1lfS4gVXNpbmcgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkLmAsIHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5kZWZhdWx0VmFsdWUsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHRoaXMucHJvcGVydHlOYW1lLFxuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2U6IHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlLFxuICAgICAgdmFsdWVcbiAgICB9KTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQXVCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsc0NBQXNDO0FBRS9DLE1BQU0scUJBQXFCLElBQUksaUJBQWlCO0FBQUEsRUFDOUMsSUFBSSwrQkFBK0I7QUFBQSxFQUNuQyxJQUFJLGdCQUFnQjtBQUFBLEVBQ3BCLElBQUksb0JBQW9CO0FBQzFCLENBQUM7QUFNRCxNQUFlLGlCQUF3RjtBQUFBLEVBQzlGLFlBQStCLFlBQTJDO0FBQTNDO0FBQUEsRUFBNEM7QUFBQSxFQUUzRSxJQUFJLFFBQXdCLE1BQWdDO0FBQ2pFLFVBQU0sU0FBUztBQUNmLFFBQUksT0FBTyxTQUFTLFVBQVU7QUFDNUIsYUFBTyxPQUFPLElBQUk7QUFBQSxJQUNwQjtBQUVBLFVBQU0sV0FBVyxLQUFLLFdBQVcsSUFBSSxJQUFJO0FBQ3pDLFFBQUksQ0FBQyxVQUFVO0FBQ2IsYUFBTyxPQUFPLElBQUk7QUFBQSxJQUNwQjtBQUVBLFdBQU8sS0FBSyxpQkFBaUIsUUFBUTtBQUFBLEVBQ3ZDO0FBR0Y7QUFFQSxNQUFNLHFDQUFvRSxpQkFBaUM7QUFBQSxFQUNqRyxvQkFBb0IsUUFBUSxRQUFRO0FBQUEsRUFDckMsSUFBSSxRQUF3QixNQUF1QixPQUF5QjtBQUNqRixVQUFNLFNBQVM7QUFDZixXQUFPLElBQUksSUFBSTtBQUVmLFFBQUksT0FBTyxTQUFTLFVBQVU7QUFDNUIsYUFBTztBQUFBLElBQ1Q7QUFFQSxVQUFNLFdBQVcsS0FBSyxXQUFXLElBQUksSUFBSTtBQUN6QyxRQUFJLENBQUMsVUFBVTtBQUNiLGFB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
@@ -55,6 +55,18 @@ export interface BindOptionsExtended<PluginSettings extends object, UIValue, Pro
55
55
  */
56
56
  export declare abstract class PluginSettingsTabBase<PluginTypes extends PluginTypesBase> extends PluginSettingTab {
57
57
  plugin: ExtractPlugin<PluginTypes>;
58
+ /**
59
+ * Whether the plugin settings tab is open.
60
+ *
61
+ * @returns Whether the plugin settings tab is open.
62
+ */
63
+ get isOpen(): boolean;
64
+ private _isOpen;
65
+ /**
66
+ * Creates a new plugin settings tab.
67
+ *
68
+ * @param plugin - The plugin.
69
+ */
58
70
  constructor(plugin: ExtractPlugin<PluginTypes>);
59
71
  /**
60
72
  * Binds a value component to a plugin setting.
@@ -79,6 +91,17 @@ export declare abstract class PluginSettingsTabBase<PluginTypes extends PluginTy
79
91
  * @returns The value component.
80
92
  */
81
93
  bind<UIValue, TValueComponent, PropertyName extends StringKeys<ExtractPluginSettings<PluginTypes>>>(valueComponent: TValueComponent & ValueComponentWithChangeTracking<UIValue>, propertyName: PropertyName, options: BindOptionsExtended<ExtractPluginSettings<PluginTypes>, UIValue, PropertyName>): TValueComponent;
94
+ /**
95
+ * Renders the plugin settings tab.
96
+ */
97
+ display(): void;
98
+ /**
99
+ * Hides the plugin settings tab.
100
+ */
82
101
  hide(): void;
102
+ /**
103
+ * Shows the plugin settings tab.
104
+ */
83
105
  show(): void;
106
+ private handleQuit;
84
107
  }
@@ -17,11 +17,26 @@ import { getValidatorComponent } from "../Components/ValidatorComponent.mjs";
17
17
  import { isValidationMessageHolder } from "../ValidationMessage.mjs";
18
18
  import { getPluginId } from "./PluginId.mjs";
19
19
  class PluginSettingsTabBase extends PluginSettingTab {
20
+ /**
21
+ * Creates a new plugin settings tab.
22
+ *
23
+ * @param plugin - The plugin.
24
+ */
20
25
  constructor(plugin) {
21
26
  super(plugin.app, plugin);
22
27
  this.plugin = plugin;
23
28
  this.containerEl.addClass(CssClass.LibraryName, getPluginId(), CssClass.PluginSettingsTab);
29
+ this.plugin.registerEvent(this.app.workspace.on("quit", this.handleQuit.bind(this)));
24
30
  }
31
+ /**
32
+ * Whether the plugin settings tab is open.
33
+ *
34
+ * @returns Whether the plugin settings tab is open.
35
+ */
36
+ get isOpen() {
37
+ return this._isOpen;
38
+ }
39
+ _isOpen = false;
25
40
  /**
26
41
  * Binds a value component to a plugin setting.
27
42
  *
@@ -62,7 +77,8 @@ class PluginSettingsTabBase extends PluginSettingTab {
62
77
  if (isValidationMessageHolder(convertedValue)) {
63
78
  property.setValidationMessage(convertedValue.validationMessage);
64
79
  } else {
65
- await property.setValueAndValidate(convertedValue);
80
+ property.setValue(convertedValue);
81
+ await property.validate();
66
82
  }
67
83
  updateValidatorElement();
68
84
  const newValue = isValidationMessageHolder(convertedValue) ? void 0 : convertedValue;
@@ -88,15 +104,36 @@ class PluginSettingsTabBase extends PluginSettingTab {
88
104
  }
89
105
  }
90
106
  }
107
+ /**
108
+ * Renders the plugin settings tab.
109
+ */
110
+ display() {
111
+ this._isOpen = true;
112
+ }
113
+ /**
114
+ * Hides the plugin settings tab.
115
+ */
91
116
  hide() {
92
117
  super.hide();
118
+ this._isOpen = false;
93
119
  invokeAsyncSafely(() => this.plugin.settingsManager.saveToFile());
94
120
  }
121
+ /**
122
+ * Shows the plugin settings tab.
123
+ */
95
124
  show() {
96
125
  this.app.setting.openTab(this);
97
126
  }
127
+ handleQuit(tasks) {
128
+ tasks.add(async () => {
129
+ if (!this.isOpen) {
130
+ return;
131
+ }
132
+ await this.plugin.settingsManager.saveToFile();
133
+ });
134
+ }
98
135
  }
99
136
  export {
100
137
  PluginSettingsTabBase
101
138
  };
102
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc1RhYkJhc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5nIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBJdCBwcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kIHRvIGJpbmQgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsZSBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29uZGl0aW9uYWxLZXlzLFxuICBQcm9taXNhYmxlXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7XG4gIFBsdWdpblNldHRpbmdUYWIsXG4gIHNldFRvb2x0aXBcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFN0cmluZ0tleXMgfSBmcm9tICcuLi8uLi9UeXBlLnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmcgfSBmcm9tICcuLi9Db21wb25lbnRzL1ZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nLnRzJztcbmltcG9ydCB0eXBlIHsgVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIgfSBmcm9tICcuLi9WYWxpZGF0aW9uTWVzc2FnZS50cyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpblNldHRpbmdzUHJvcGVydHkgfSBmcm9tICcuL1BsdWdpblNldHRpbmdzTWFuYWdlckJhc2UudHMnO1xuaW1wb3J0IHR5cGUge1xuICBFeHRyYWN0UGx1Z2luLFxuICBFeHRyYWN0UGx1Z2luU2V0dGluZ3MsXG4gIFBsdWdpblR5cGVzQmFzZVxufSBmcm9tICcuL1BsdWdpblR5cGVzQmFzZS50cyc7XG5cbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnLi4vLi4vQXN5bmMudHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi8uLi9Dc3NDbGFzcy50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vLi4vRnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgZ2V0VGV4dEJhc2VkQ29tcG9uZW50VmFsdWUgfSBmcm9tICcuLi9Db21wb25lbnRzL1RleHRCYXNlZENvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBnZXRWYWxpZGF0b3JDb21wb25lbnQgfSBmcm9tICcuLi9Db21wb25lbnRzL1ZhbGlkYXRvckNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBpc1ZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIH0gZnJvbSAnLi4vVmFsaWRhdGlvbk1lc3NhZ2UudHMnO1xuaW1wb3J0IHsgZ2V0UGx1Z2luSWQgfSBmcm9tICcuL1BsdWdpbklkLnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBiaW5kaW5nIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmluZE9wdGlvbnM8VD4ge1xuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50IGNoYW5nZXMuXG4gICAqL1xuICBvbkNoYW5nZWQ/KG5ld1ZhbHVlOiBUIHwgdW5kZWZpbmVkLCBvbGRWYWx1ZTogVCk6IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVzZXQgdGhlIHNldHRpbmcgd2hlbiB0aGUgY29tcG9uZW50IHZhbHVlIGlzIGVtcHR5LiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAgICogQXBwbGljYWJsZSBvbmx5IHRvIHRleHQtYmFzZWQgY29tcG9uZW50cy5cbiAgICovXG4gIHNob3VsZFJlc2V0U2V0dGluZ1doZW5Db21wb25lbnRJc0VtcHR5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2hlbiB0aGUgY29tcG9uZW50IHZhbHVlIGlzIGludmFsaWQuIERlZmF1bHQgaXMgYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkU2hvd1ZhbGlkYXRpb25NZXNzYWdlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFeHRlbmRlZCBvcHRpb25zIGZvciBiaW5kaW5nIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmluZE9wdGlvbnNFeHRlbmRlZDxcbiAgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QsXG4gIFVJVmFsdWUsXG4gIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+XG4+IGV4dGVuZHMgQmluZE9wdGlvbnM8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT4ge1xuICAvKipcbiAgICogQ29udmVydHMgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlIGJhY2sgdG8gdGhlIHBsdWdpbiBzZXR0aW5ncyB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHVpVmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHRvIHNldCBvbiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgY29tcG9uZW50VG9QbHVnaW5TZXR0aW5nc1ZhbHVlQ29udmVydGVyOiAodWlWYWx1ZTogVUlWYWx1ZSkgPT4gUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXSB8IFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgcGx1Z2luIHNldHRpbmdzIHZhbHVlIHRvIHRoZSB2YWx1ZSB1c2VkIGJ5IHRoZSBVSSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW5TZXR0aW5nc1ZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgdG8gc2V0IG9uIHRoZSBVSSBjb21wb25lbnQuXG4gICAqL1xuICBwbHVnaW5TZXR0aW5nc1RvQ29tcG9uZW50VmFsdWVDb252ZXJ0ZXI6IChwbHVnaW5TZXR0aW5nc1ZhbHVlOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdKSA9PiBVSVZhbHVlO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5ncyB0YWJzIGluIE9ic2lkaWFuLlxuICogUHJvdmlkZXMgYSBtZXRob2QgZm9yIGJpbmRpbmcgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsaW5nIGNoYW5nZXMuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5UeXBlcyAtIFBsdWdpbi1zcGVjaWZpYyB0eXBlcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxQbHVnaW5UeXBlcyBleHRlbmRzIFBsdWdpblR5cGVzQmFzZT4gZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBvdmVycmlkZSBwbHVnaW46IEV4dHJhY3RQbHVnaW48UGx1Z2luVHlwZXM+KSB7XG4gICAgc3VwZXIocGx1Z2luLmFwcCwgcGx1Z2luKTtcbiAgICB0aGlzLmNvbnRhaW5lckVsLmFkZENsYXNzKENzc0NsYXNzLkxpYnJhcnlOYW1lLCBnZXRQbHVnaW5JZCgpLCBDc3NDbGFzcy5QbHVnaW5TZXR0aW5nc1RhYik7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgYSB2YWx1ZSBjb21wb25lbnQgdG8gYSBwbHVnaW4gc2V0dGluZy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gVFZhbHVlQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIHZhbHVlQ29tcG9uZW50IC0gVGhlIHZhbHVlIGNvbXBvbmVudCB0byBiaW5kLlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgYmluZGluZyB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGJpbmQ8XG4gICAgVUlWYWx1ZSxcbiAgICBUVmFsdWVDb21wb25lbnRcbiAgPihcbiAgICB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4sXG4gICAgcHJvcGVydHlOYW1lOiBDb25kaXRpb25hbEtleXM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPiwgVUlWYWx1ZT4sXG4gICAgb3B0aW9ucz86IEJpbmRPcHRpb25zPFVJVmFsdWU+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50LFxuICAgIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPj5cbiAgPihcbiAgICB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4sXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgb3B0aW9uczogQmluZE9wdGlvbnNFeHRlbmRlZDxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+LCBVSVZhbHVlLCBQcm9wZXJ0eU5hbWU+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50LFxuICAgIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPj5cbiAgPihcbiAgICB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4sXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgb3B0aW9ucz86IEJpbmRPcHRpb25zPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz5bUHJvcGVydHlOYW1lXT5cbiAgKTogVFZhbHVlQ29tcG9uZW50IHtcbiAgICB0eXBlIFBsdWdpblNldHRpbmdzID0gRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPjtcbiAgICB0eXBlIFByb3BlcnR5VHlwZSA9IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV07XG4gICAgY29uc3QgREVGQVVMVF9PUFRJT05TOiBSZXF1aXJlZDxCaW5kT3B0aW9uc0V4dGVuZGVkPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBQcm9wZXJ0eU5hbWU+PiA9IHtcbiAgICAgIGNvbXBvbmVudFRvUGx1Z2luU2V0dGluZ3NWYWx1ZUNvbnZlcnRlcjogKHZhbHVlOiBVSVZhbHVlKTogUHJvcGVydHlUeXBlID0+IHZhbHVlIGFzIFByb3BlcnR5VHlwZSxcbiAgICAgIG9uQ2hhbmdlZDogbm9vcCxcbiAgICAgIHBsdWdpblNldHRpbmdzVG9Db21wb25lbnRWYWx1ZUNvbnZlcnRlcjogKHZhbHVlOiBQcm9wZXJ0eVR5cGUpOiBVSVZhbHVlID0+IHZhbHVlIGFzIFVJVmFsdWUsXG4gICAgICBzaG91bGRSZXNldFNldHRpbmdXaGVuQ29tcG9uZW50SXNFbXB0eTogdHJ1ZSxcbiAgICAgIHNob3VsZFNob3dWYWxpZGF0aW9uTWVzc2FnZTogdHJ1ZVxuICAgIH07XG5cbiAgICBjb25zdCBvcHRpb25zRXh0OiBSZXF1aXJlZDxCaW5kT3B0aW9uc0V4dGVuZGVkPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBQcm9wZXJ0eU5hbWU+PiA9IHsgLi4uREVGQVVMVF9PUFRJT05TLCAuLi5vcHRpb25zIH07XG5cbiAgICBjb25zdCB2YWxpZGF0b3JFbGVtZW50ID0gZ2V0VmFsaWRhdG9yQ29tcG9uZW50KHZhbHVlQ29tcG9uZW50KT8udmFsaWRhdG9yRWw7XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucGx1Z2luLnNldHRpbmdzTWFuYWdlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIGFzIFBsdWdpblNldHRpbmdzUHJvcGVydHk8UHJvcGVydHlUeXBlPjtcblxuICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydHkuY3VycmVudFZhbHVlO1xuXG4gICAgY29uc3QgdGV4dEJhc2VkQ29tcG9uZW50ID0gZ2V0VGV4dEJhc2VkQ29tcG9uZW50VmFsdWUodmFsdWVDb21wb25lbnQpO1xuICAgIHRleHRCYXNlZENvbXBvbmVudD8uc2V0UGxhY2Vob2xkZXJWYWx1ZShvcHRpb25zRXh0LnBsdWdpblNldHRpbmdzVG9Db21wb25lbnRWYWx1ZUNvbnZlcnRlcihwcm9wZXJ0eS5kZWZhdWx0VmFsdWUpKTtcblxuICAgIGlmIChwcm9wZXJ0eS5jdXJyZW50VmFsdWUgPT09IHByb3BlcnR5LmRlZmF1bHRWYWx1ZSAmJiB0ZXh0QmFzZWRDb21wb25lbnQgJiYgb3B0aW9uc0V4dC5zaG91bGRSZXNldFNldHRpbmdXaGVuQ29tcG9uZW50SXNFbXB0eSkge1xuICAgICAgdGV4dEJhc2VkQ29tcG9uZW50LmVtcHR5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlQ29tcG9uZW50LnNldFZhbHVlKG9wdGlvbnNFeHQucGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgdmFsdWVDb21wb25lbnQub25DaGFuZ2UoYXN5bmMgKHVpVmFsdWUpID0+IHtcbiAgICAgIGlmICh0ZXh0QmFzZWRDb21wb25lbnQ/LmlzRW1wdHkoKSAmJiBvcHRpb25zRXh0LnNob3VsZFJlc2V0U2V0dGluZ1doZW5Db21wb25lbnRJc0VtcHR5KSB7XG4gICAgICAgIHByb3BlcnR5LnJlc2V0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSBwcm9wZXJ0eS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCBjb252ZXJ0ZWRWYWx1ZSA9IG9wdGlvbnNFeHQuY29tcG9uZW50VG9QbHVnaW5TZXR0aW5nc1ZhbHVlQ29udmVydGVyKHVpVmFsdWUpO1xuICAgICAgaWYgKGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIoY29udmVydGVkVmFsdWUpKSB7XG4gICAgICAgIHByb3BlcnR5LnNldFZhbGlkYXRpb25NZXNzYWdlKGNvbnZlcnRlZFZhbHVlLnZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHByb3BlcnR5LnNldFZhbHVlQW5kVmFsaWRhdGUoY29udmVydGVkVmFsdWUpO1xuICAgICAgfVxuICAgICAgdXBkYXRlVmFsaWRhdG9yRWxlbWVudCgpO1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBpc1ZhbGlkYXRpb25NZXNzYWdlSG9sZGVyKGNvbnZlcnRlZFZhbHVlKSA/IHVuZGVmaW5lZCA6IGNvbnZlcnRlZFZhbHVlO1xuICAgICAgYXdhaXQgb3B0aW9uc0V4dC5vbkNoYW5nZWQobmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICB9KTtcblxuICAgIHZhbGlkYXRvckVsZW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdXBkYXRlVmFsaWRhdG9yRWxlbWVudCk7XG4gICAgdmFsaWRhdG9yRWxlbWVudD8uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHVwZGF0ZVZhbGlkYXRvckVsZW1lbnQpO1xuXG4gICAgdXBkYXRlVmFsaWRhdG9yRWxlbWVudCgpO1xuICAgIHJldHVybiB2YWx1ZUNvbXBvbmVudDtcblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVZhbGlkYXRvckVsZW1lbnQoKTogdm9pZCB7XG4gICAgICBpZiAoIXZhbGlkYXRvckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXByb3BlcnR5LnZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIHZhbGlkYXRvckVsZW1lbnQuc2V0Q3VzdG9tVmFsaWRpdHkoJycpO1xuICAgICAgICB2YWxpZGF0b3JFbGVtZW50LmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgICAgcHJvcGVydHkuc2V0VmFsaWRhdGlvbk1lc3NhZ2UodmFsaWRhdG9yRWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIHZhbGlkYXRvckVsZW1lbnQuc2V0Q3VzdG9tVmFsaWRpdHkocHJvcGVydHkudmFsaWRhdGlvbk1lc3NhZ2UpO1xuICAgICAgc2V0VG9vbHRpcCh2YWxpZGF0b3JFbGVtZW50LCBwcm9wZXJ0eS52YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgICBpZiAodmFsaWRhdG9yRWxlbWVudC5pc0FjdGl2ZUVsZW1lbnQoKSAmJiBvcHRpb25zRXh0LnNob3VsZFNob3dWYWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgICB2YWxpZGF0b3JFbGVtZW50LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGhpZGUoKTogdm9pZCB7XG4gICAgc3VwZXIuaGlkZSgpO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IHRoaXMucGx1Z2luLnNldHRpbmdzTWFuYWdlci5zYXZlVG9GaWxlKCkpO1xuICB9XG5cbiAgcHVibGljIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuVGFiKHRoaXMpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBWUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFZUCxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLFlBQVk7QUFDckIsU0FBUyxrQ0FBa0M7QUFDM0MsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyxpQ0FBaUM7QUFDMUMsU0FBUyxtQkFBbUI7QUFzRHJCLE1BQWUsOEJBQW1FLGlCQUFpQjtBQUFBLEVBQ2pHLFlBQTRCLFFBQW9DO0FBQ3JFLFVBQU0sT0FBTyxLQUFLLE1BQU07QUFEUztBQUVqQyxTQUFLLFlBQVksU0FBUyxTQUFTLGFBQWEsWUFBWSxHQUFHLFNBQVMsaUJBQWlCO0FBQUEsRUFDM0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFtRE8sS0FLTCxnQkFDQSxjQUNBLFNBQ2lCO0FBR2pCLFVBQU0sa0JBQXdGO0FBQUEsTUFDNUYseUNBQXlDLENBQUNBLFdBQWlDQTtBQUFBLE1BQzNFLFdBQVc7QUFBQSxNQUNYLHlDQUF5QyxDQUFDQSxXQUFpQ0E7QUFBQSxNQUMzRSx3Q0FBd0M7QUFBQSxNQUN4Qyw2QkFBNkI7QUFBQSxJQUMvQjtBQUVBLFVBQU0sYUFBbUYsRUFBRSxHQUFHLGlCQUFpQixHQUFHLFFBQVE7QUFFMUgsVUFBTSxtQkFBbUIsc0JBQXNCLGNBQWMsR0FBRztBQUVoRSxVQUFNLFdBQVcsS0FBSyxPQUFPLGdCQUFnQixZQUFZLFlBQVk7QUFFckUsVUFBTSxRQUFRLFNBQVM7QUFFdkIsVUFBTSxxQkFBcUIsMkJBQTJCLGNBQWM7QUFDcEUsd0JBQW9CLG9CQUFvQixXQUFXLHdDQUF3QyxTQUFTLFlBQVksQ0FBQztBQUVqSCxRQUFJLFNBQVMsaUJBQWlCLFNBQVMsZ0JBQWdCLHNCQUFzQixXQUFXLHdDQUF3QztBQUM5SCx5QkFBbUIsTUFBTTtBQUFBLElBQzNCLE9BQU87QUFDTCxxQkFBZSxTQUFTLFdBQVcsd0NBQXdDLEtBQUssQ0FBQztBQUFBLElBQ25GO0FBRUEsbUJBQWUsU0FBUyxPQUFPLFlBQVk7QUFDekMsVUFBSSxvQkFBb0IsUUFBUSxLQUFLLFdBQVcsd0NBQXdDO0FBQ3RGLGlCQUFTLE1BQU07QUFDZjtBQUFBLE1BQ0Y7QUFFQSxZQUFNLFdBQVcsU0FBUztBQUMxQixZQUFNLGlCQUFpQixXQUFXLHdDQUF3QyxPQUFPO0FBQ2pGLFVBQUksMEJBQTBCLGNBQWMsR0FBRztBQUM3QyxpQkFBUyxxQkFBcUIsZUFBZSxpQkFBaUI7QUFBQSxNQUNoRSxPQUFPO0FBQ0wsY0FBTSxTQUFTLG9CQUFvQixjQUFjO0FBQUEsTUFDbkQ7QUFDQSw2QkFBdUI7QUFDdkIsWUFBTSxXQUFXLDBCQUEwQixjQUFjLElBQUksU0FBWTtBQUN6RSxZQUFNLFdBQVcsVUFBVSxVQUFVLFFBQVE7QUFBQSxJQUMvQyxDQUFDO0FBRUQsc0JBQWtCLGlCQUFpQixTQUFTLHNCQUFzQjtBQUNsRSxzQkFBa0IsaUJBQWlCLFFBQVEsc0JBQXNCO0FBRWpFLDJCQUF1QjtBQUN2QixXQUFPO0FBRVAsYUFBUyx5QkFBK0I7QUFDdEMsVUFBSSxDQUFDLGtCQUFrQjtBQUNyQjtBQUFBLE1BQ0Y7QUFFQSxVQUFJLENBQUMsU0FBUyxtQkFBbUI7QUFDL0IseUJBQWlCLGtCQUFrQixFQUFFO0FBQ3JDLHlCQUFpQixjQUFjO0FBQy9CLGlCQUFTLHFCQUFxQixpQkFBaUIsaUJBQWlCO0FBQUEsTUFDbEU7QUFFQSx1QkFBaUIsa0JBQWtCLFNBQVMsaUJBQWlCO0FBQzdELGlCQUFXLGtCQUFrQixTQUFTLGlCQUFpQjtBQUN2RCxVQUFJLGlCQUFpQixnQkFBZ0IsS0FBSyxXQUFXLDZCQUE2QjtBQUNoRix5QkFBaUIsZUFBZTtBQUFBLE1BQ2xDO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVnQixPQUFhO0FBQzNCLFVBQU0sS0FBSztBQUNYLHNCQUFrQixNQUFNLEtBQUssT0FBTyxnQkFBZ0IsV0FBVyxDQUFDO0FBQUEsRUFDbEU7QUFBQSxFQUVPLE9BQWE7QUFDbEIsU0FBSyxJQUFJLFFBQVEsUUFBUSxJQUFJO0FBQUEsRUFDL0I7QUFDRjsiLAogICJuYW1lcyI6IFsidmFsdWUiXQp9Cg==
139
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc1RhYkJhc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5nIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBJdCBwcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kIHRvIGJpbmQgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsZSBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgVGFza3MgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7XG4gIENvbmRpdGlvbmFsS2V5cyxcbiAgUHJvbWlzYWJsZVxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQge1xuICBQbHVnaW5TZXR0aW5nVGFiLFxuICBzZXRUb29sdGlwXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBTdHJpbmdLZXlzIH0gZnJvbSAnLi4vLi4vVHlwZS50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9WYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZy50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIH0gZnJvbSAnLi4vVmFsaWRhdGlvbk1lc3NhZ2UudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5IH0gZnJvbSAnLi9QbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgRXh0cmFjdFBsdWdpbixcbiAgRXh0cmFjdFBsdWdpblNldHRpbmdzLFxuICBQbHVnaW5UeXBlc0Jhc2Vcbn0gZnJvbSAnLi9QbHVnaW5UeXBlc0Jhc2UudHMnO1xuXG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJy4uLy4uL0FzeW5jLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vLi4vQ3NzQ2xhc3MudHMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uLy4uL0Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldFRleHRCYXNlZENvbXBvbmVudFZhbHVlIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9UZXh0QmFzZWRDb21wb25lbnQudHMnO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9WYWxpZGF0b3JDb21wb25lbnQudHMnO1xuaW1wb3J0IHsgaXNWYWxpZGF0aW9uTWVzc2FnZUhvbGRlciB9IGZyb20gJy4uL1ZhbGlkYXRpb25NZXNzYWdlLnRzJztcbmltcG9ydCB7IGdldFBsdWdpbklkIH0gZnJvbSAnLi9QbHVnaW5JZC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYmluZGluZyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRPcHRpb25zPFQ+IHtcbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBjaGFuZ2VzLlxuICAgKi9cbiAgb25DaGFuZ2VkPyhuZXdWYWx1ZTogVCB8IHVuZGVmaW5lZCwgb2xkVmFsdWU6IFQpOiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlc2V0IHRoZSBzZXR0aW5nIHdoZW4gdGhlIGNvbXBvbmVudCB2YWx1ZSBpcyBlbXB0eS4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG4gICAqIEFwcGxpY2FibGUgb25seSB0byB0ZXh0LWJhc2VkIGNvbXBvbmVudHMuXG4gICAqL1xuICBzaG91bGRSZXNldFNldHRpbmdXaGVuQ29tcG9uZW50SXNFbXB0eT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdoZW4gdGhlIGNvbXBvbmVudCB2YWx1ZSBpcyBpbnZhbGlkLiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZFNob3dWYWxpZGF0aW9uTWVzc2FnZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgb3B0aW9ucyBmb3IgYmluZGluZyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRPcHRpb25zRXh0ZW5kZWQ8XG4gIFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LFxuICBVSVZhbHVlLFxuICBQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPlxuPiBleHRlbmRzIEJpbmRPcHRpb25zPFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+IHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBVSSBjb21wb25lbnQncyB2YWx1ZSBiYWNrIHRvIHRoZSBwbHVnaW4gc2V0dGluZ3MgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB1aVZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSB0byBzZXQgb24gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIGNvbXBvbmVudFRvUGx1Z2luU2V0dGluZ3NWYWx1ZUNvbnZlcnRlcjogKHVpVmFsdWU6IFVJVmFsdWUpID0+IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0gfCBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcjtcblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIHBsdWdpbiBzZXR0aW5ncyB2YWx1ZSB0byB0aGUgdmFsdWUgdXNlZCBieSB0aGUgVUkgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luU2V0dGluZ3NWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHRvIHNldCBvbiB0aGUgVUkgY29tcG9uZW50LlxuICAgKi9cbiAgcGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyOiAocGx1Z2luU2V0dGluZ3NWYWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXSkgPT4gVUlWYWx1ZTtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjcmVhdGluZyBwbHVnaW4gc2V0dGluZ3MgdGFicyBpbiBPYnNpZGlhbi5cbiAqIFByb3ZpZGVzIGEgbWV0aG9kIGZvciBiaW5kaW5nIHZhbHVlIGNvbXBvbmVudHMgdG8gcGx1Z2luIHNldHRpbmdzIGFuZCBoYW5kbGluZyBjaGFuZ2VzLlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luVHlwZXMgLSBQbHVnaW4tc3BlY2lmaWMgdHlwZXMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQbHVnaW5TZXR0aW5nc1RhYkJhc2U8UGx1Z2luVHlwZXMgZXh0ZW5kcyBQbHVnaW5UeXBlc0Jhc2U+IGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiIGlzIG9wZW4uXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIgaXMgb3Blbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc09wZW47XG4gIH1cblxuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gc2V0dGluZ3MgdGFiLlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgb3ZlcnJpZGUgcGx1Z2luOiBFeHRyYWN0UGx1Z2luPFBsdWdpblR5cGVzPikge1xuICAgIHN1cGVyKHBsdWdpbi5hcHAsIHBsdWdpbik7XG4gICAgdGhpcy5jb250YWluZXJFbC5hZGRDbGFzcyhDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgZ2V0UGx1Z2luSWQoKSwgQ3NzQ2xhc3MuUGx1Z2luU2V0dGluZ3NUYWIpO1xuICAgIHRoaXMucGx1Z2luLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdxdWl0JywgdGhpcy5oYW5kbGVRdWl0LmJpbmQodGhpcykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFVJVmFsdWUgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBiaW5kaW5nIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgYmluZDxcbiAgICBVSVZhbHVlLFxuICAgIFRWYWx1ZUNvbXBvbmVudFxuICA+KFxuICAgIHZhbHVlQ29tcG9uZW50OiBUVmFsdWVDb21wb25lbnQgJiBWYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZzxVSVZhbHVlPixcbiAgICBwcm9wZXJ0eU5hbWU6IENvbmRpdGlvbmFsS2V5czxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+LCBVSVZhbHVlPixcbiAgICBvcHRpb25zPzogQmluZE9wdGlvbnM8VUlWYWx1ZT5cbiAgKTogVFZhbHVlQ29tcG9uZW50O1xuICAvKipcbiAgICogQmluZHMgYSB2YWx1ZSBjb21wb25lbnQgdG8gYSBwbHVnaW4gc2V0dGluZy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gVFZhbHVlQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSB2YWx1ZUNvbXBvbmVudCAtIFRoZSB2YWx1ZSBjb21wb25lbnQgdG8gYmluZC5cbiAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgYmluZGluZyB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGJpbmQ8XG4gICAgVUlWYWx1ZSxcbiAgICBUVmFsdWVDb21wb25lbnQsXG4gICAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+PlxuICA+KFxuICAgIHZhbHVlQ29tcG9uZW50OiBUVmFsdWVDb21wb25lbnQgJiBWYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZzxVSVZhbHVlPixcbiAgICBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSxcbiAgICBvcHRpb25zOiBCaW5kT3B0aW9uc0V4dGVuZGVkPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz4sIFVJVmFsdWUsIFByb3BlcnR5TmFtZT5cbiAgKTogVFZhbHVlQ29tcG9uZW50O1xuICAvKipcbiAgICogQmluZHMgYSB2YWx1ZSBjb21wb25lbnQgdG8gYSBwbHVnaW4gc2V0dGluZy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gVFZhbHVlQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSB2YWx1ZUNvbXBvbmVudCAtIFRoZSB2YWx1ZSBjb21wb25lbnQgdG8gYmluZC5cbiAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgYmluZGluZyB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGJpbmQ8XG4gICAgVUlWYWx1ZSxcbiAgICBUVmFsdWVDb21wb25lbnQsXG4gICAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+PlxuICA+KFxuICAgIHZhbHVlQ29tcG9uZW50OiBUVmFsdWVDb21wb25lbnQgJiBWYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZzxVSVZhbHVlPixcbiAgICBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSxcbiAgICBvcHRpb25zPzogQmluZE9wdGlvbnM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPltQcm9wZXJ0eU5hbWVdPlxuICApOiBUVmFsdWVDb21wb25lbnQge1xuICAgIHR5cGUgUGx1Z2luU2V0dGluZ3MgPSBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+O1xuICAgIHR5cGUgUHJvcGVydHlUeXBlID0gUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXTtcbiAgICBjb25zdCBERUZBVUxUX09QVElPTlM6IFJlcXVpcmVkPEJpbmRPcHRpb25zRXh0ZW5kZWQ8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWUsIFByb3BlcnR5TmFtZT4+ID0ge1xuICAgICAgY29tcG9uZW50VG9QbHVnaW5TZXR0aW5nc1ZhbHVlQ29udmVydGVyOiAodmFsdWU6IFVJVmFsdWUpOiBQcm9wZXJ0eVR5cGUgPT4gdmFsdWUgYXMgUHJvcGVydHlUeXBlLFxuICAgICAgb25DaGFuZ2VkOiBub29wLFxuICAgICAgcGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyOiAodmFsdWU6IFByb3BlcnR5VHlwZSk6IFVJVmFsdWUgPT4gdmFsdWUgYXMgVUlWYWx1ZSxcbiAgICAgIHNob3VsZFJlc2V0U2V0dGluZ1doZW5Db21wb25lbnRJc0VtcHR5OiB0cnVlLFxuICAgICAgc2hvdWxkU2hvd1ZhbGlkYXRpb25NZXNzYWdlOiB0cnVlXG4gICAgfTtcblxuICAgIGNvbnN0IG9wdGlvbnNFeHQ6IFJlcXVpcmVkPEJpbmRPcHRpb25zRXh0ZW5kZWQ8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWUsIFByb3BlcnR5TmFtZT4+ID0geyAuLi5ERUZBVUxUX09QVElPTlMsIC4uLm9wdGlvbnMgfTtcblxuICAgIGNvbnN0IHZhbGlkYXRvckVsZW1lbnQgPSBnZXRWYWxpZGF0b3JDb21wb25lbnQodmFsdWVDb21wb25lbnQpPy52YWxpZGF0b3JFbDtcblxuICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3NNYW5hZ2VyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkgYXMgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQcm9wZXJ0eVR5cGU+O1xuXG4gICAgY29uc3QgdmFsdWUgPSBwcm9wZXJ0eS5jdXJyZW50VmFsdWU7XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRDb21wb25lbnQgPSBnZXRUZXh0QmFzZWRDb21wb25lbnRWYWx1ZSh2YWx1ZUNvbXBvbmVudCk7XG4gICAgdGV4dEJhc2VkQ29tcG9uZW50Py5zZXRQbGFjZWhvbGRlclZhbHVlKG9wdGlvbnNFeHQucGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyKHByb3BlcnR5LmRlZmF1bHRWYWx1ZSkpO1xuXG4gICAgaWYgKHByb3BlcnR5LmN1cnJlbnRWYWx1ZSA9PT0gcHJvcGVydHkuZGVmYXVsdFZhbHVlICYmIHRleHRCYXNlZENvbXBvbmVudCAmJiBvcHRpb25zRXh0LnNob3VsZFJlc2V0U2V0dGluZ1doZW5Db21wb25lbnRJc0VtcHR5KSB7XG4gICAgICB0ZXh0QmFzZWRDb21wb25lbnQuZW1wdHkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWVDb21wb25lbnQuc2V0VmFsdWUob3B0aW9uc0V4dC5wbHVnaW5TZXR0aW5nc1RvQ29tcG9uZW50VmFsdWVDb252ZXJ0ZXIodmFsdWUpKTtcbiAgICB9XG5cbiAgICB2YWx1ZUNvbXBvbmVudC5vbkNoYW5nZShhc3luYyAodWlWYWx1ZSkgPT4ge1xuICAgICAgaWYgKHRleHRCYXNlZENvbXBvbmVudD8uaXNFbXB0eSgpICYmIG9wdGlvbnNFeHQuc2hvdWxkUmVzZXRTZXR0aW5nV2hlbkNvbXBvbmVudElzRW1wdHkpIHtcbiAgICAgICAgcHJvcGVydHkucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHByb3BlcnR5LmN1cnJlbnRWYWx1ZTtcbiAgICAgIGNvbnN0IGNvbnZlcnRlZFZhbHVlID0gb3B0aW9uc0V4dC5jb21wb25lbnRUb1BsdWdpblNldHRpbmdzVmFsdWVDb252ZXJ0ZXIodWlWYWx1ZSk7XG4gICAgICBpZiAoaXNWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcihjb252ZXJ0ZWRWYWx1ZSkpIHtcbiAgICAgICAgcHJvcGVydHkuc2V0VmFsaWRhdGlvbk1lc3NhZ2UoY29udmVydGVkVmFsdWUudmFsaWRhdGlvbk1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcGVydHkuc2V0VmFsdWUoY29udmVydGVkVmFsdWUpO1xuICAgICAgICBhd2FpdCBwcm9wZXJ0eS52YWxpZGF0ZSgpO1xuICAgICAgfVxuICAgICAgdXBkYXRlVmFsaWRhdG9yRWxlbWVudCgpO1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBpc1ZhbGlkYXRpb25NZXNzYWdlSG9sZGVyKGNvbnZlcnRlZFZhbHVlKSA/IHVuZGVmaW5lZCA6IGNvbnZlcnRlZFZhbHVlO1xuICAgICAgYXdhaXQgb3B0aW9uc0V4dC5vbkNoYW5nZWQobmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICB9KTtcblxuICAgIHZhbGlkYXRvckVsZW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdXBkYXRlVmFsaWRhdG9yRWxlbWVudCk7XG4gICAgdmFsaWRhdG9yRWxlbWVudD8uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHVwZGF0ZVZhbGlkYXRvckVsZW1lbnQpO1xuXG4gICAgdXBkYXRlVmFsaWRhdG9yRWxlbWVudCgpO1xuICAgIHJldHVybiB2YWx1ZUNvbXBvbmVudDtcblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVZhbGlkYXRvckVsZW1lbnQoKTogdm9pZCB7XG4gICAgICBpZiAoIXZhbGlkYXRvckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXByb3BlcnR5LnZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIHZhbGlkYXRvckVsZW1lbnQuc2V0Q3VzdG9tVmFsaWRpdHkoJycpO1xuICAgICAgICB2YWxpZGF0b3JFbGVtZW50LmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgICAgcHJvcGVydHkuc2V0VmFsaWRhdGlvbk1lc3NhZ2UodmFsaWRhdG9yRWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIHZhbGlkYXRvckVsZW1lbnQuc2V0Q3VzdG9tVmFsaWRpdHkocHJvcGVydHkudmFsaWRhdGlvbk1lc3NhZ2UpO1xuICAgICAgc2V0VG9vbHRpcCh2YWxpZGF0b3JFbGVtZW50LCBwcm9wZXJ0eS52YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgICBpZiAodmFsaWRhdG9yRWxlbWVudC5pc0FjdGl2ZUVsZW1lbnQoKSAmJiBvcHRpb25zRXh0LnNob3VsZFNob3dWYWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgICB2YWxpZGF0b3JFbGVtZW50LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZGlzcGxheSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGhpZGUoKTogdm9pZCB7XG4gICAgc3VwZXIuaGlkZSgpO1xuICAgIHRoaXMuX2lzT3BlbiA9IGZhbHNlO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IHRoaXMucGx1Z2luLnNldHRpbmdzTWFuYWdlci5zYXZlVG9GaWxlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiLlxuICAgKi9cbiAgcHVibGljIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuVGFiKHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVRdWl0KHRhc2tzOiBUYXNrcyk6IHZvaWQge1xuICAgIHRhc2tzLmFkZChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNldHRpbmdzTWFuYWdlci5zYXZlVG9GaWxlKCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFhQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQVlQLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsWUFBWTtBQUNyQixTQUFTLGtDQUFrQztBQUMzQyxTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLGlDQUFpQztBQUMxQyxTQUFTLG1CQUFtQjtBQXNEckIsTUFBZSw4QkFBbUUsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBaUJqRyxZQUE0QixRQUFvQztBQUNyRSxVQUFNLE9BQU8sS0FBSyxNQUFNO0FBRFM7QUFFakMsU0FBSyxZQUFZLFNBQVMsU0FBUyxhQUFhLFlBQVksR0FBRyxTQUFTLGlCQUFpQjtBQUN6RixTQUFLLE9BQU8sY0FBYyxLQUFLLElBQUksVUFBVSxHQUFHLFFBQVEsS0FBSyxXQUFXLEtBQUssSUFBSSxDQUFDLENBQUM7QUFBQSxFQUNyRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWZBLElBQVcsU0FBa0I7QUFDM0IsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBLEVBRVEsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQThEWCxLQUtMLGdCQUNBLGNBQ0EsU0FDaUI7QUFHakIsVUFBTSxrQkFBd0Y7QUFBQSxNQUM1Rix5Q0FBeUMsQ0FBQ0EsV0FBaUNBO0FBQUEsTUFDM0UsV0FBVztBQUFBLE1BQ1gseUNBQXlDLENBQUNBLFdBQWlDQTtBQUFBLE1BQzNFLHdD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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "24.0.2-beta.1",
3
+ "version": "24.1.0",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development",
5
5
  "keywords": [
6
6
  "obsidian"