obsidian-dev-utils 3.21.0 → 3.23.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.
@@ -30,11 +30,11 @@ __export(RenameDeleteHandler_exports, {
30
30
  module.exports = __toCommonJS(RenameDeleteHandler_exports);
31
31
  var import_obsidian = require('obsidian');
32
32
  var import_implementations = require('obsidian-typings/implementations');
33
- var import_Async = require('../Async.cjs');
34
33
  var import_Object = require('../Object.cjs');
35
34
  var import_Path = require('../Path.cjs');
36
35
  var import_App = require('./App.cjs');
37
36
  var import_AttachmentPath = require('./AttachmentPath.cjs');
37
+ var import_ChainedPromise = require('./ChainedPromise.cjs');
38
38
  var import_Link = require('./Link.cjs');
39
39
  var import_MetadataCache = require('./MetadataCache.cjs');
40
40
  var import_TAbstractFile = require('./TAbstractFile.cjs');
@@ -60,13 +60,12 @@ function registerRenameDeleteHandlers(plugin, settingsBuilder) {
60
60
  logPluginSettingsOrder(plugin.app);
61
61
  });
62
62
  const app = plugin.app;
63
- const renameDeleteHandler = new RenameDeleteHandler(app);
64
63
  plugin.registerEvent(
65
64
  app.vault.on("delete", (file) => {
66
65
  if (!shouldInvokeHandler(app, pluginId, "Delete")) {
67
66
  return;
68
67
  }
69
- (0, import_Async.invokeAsyncSafely)(renameDeleteHandler.handleDelete(file));
68
+ (0, import_ChainedPromise.chainAsyncFn)(app, () => handleDelete(app, file));
70
69
  })
71
70
  );
72
71
  plugin.registerEvent(
@@ -74,7 +73,7 @@ function registerRenameDeleteHandlers(plugin, settingsBuilder) {
74
73
  if (!shouldInvokeHandler(app, pluginId, "Rename")) {
75
74
  return;
76
75
  }
77
- (0, import_Async.invokeAsyncSafely)(renameDeleteHandler.handleRename(file, oldPath));
76
+ (0, import_ChainedPromise.chainAsyncFn)(app, () => handleRename(app, file, oldPath));
78
77
  })
79
78
  );
80
79
  }
@@ -87,275 +86,239 @@ function shouldInvokeHandler(app, pluginId, handlerType) {
87
86
  }
88
87
  return true;
89
88
  }
90
- class RenameDeleteHandler {
91
- constructor(app) {
92
- this.app = app;
89
+ function getRenameDeleteHandlersMap(app) {
90
+ return (0, import_App.getObsidianDevUtilsState)(app, "renameDeleteHandlersMap", /* @__PURE__ */ new Map()).value;
91
+ }
92
+ function logPluginSettingsOrder(app) {
93
+ const renameDeleteHandlersMap = getRenameDeleteHandlersMap(app);
94
+ console.debug(`Rename/delete handlers will use plugin settings in the following order: ${Array.from(renameDeleteHandlersMap.keys()).join(", ")}`);
95
+ }
96
+ const specialRenames = [];
97
+ async function handleRename(app, file, oldPath) {
98
+ console.debug(`Handle Rename ${oldPath} -> ${file.path}`);
99
+ if (!(file instanceof import_obsidian.TFile)) {
100
+ return;
93
101
  }
94
- renamingPaths = /* @__PURE__ */ new Set();
95
- specialRenames = [];
96
- async handleRename(file, oldPath) {
97
- console.debug(`Handle Rename ${oldPath} -> ${file.path}`);
98
- if (this.renamingPaths.has(oldPath)) {
99
- return;
100
- }
101
- if (!(file instanceof import_obsidian.TFile)) {
102
- return;
103
- }
104
- const specialRename = this.specialRenames.find((x) => x.oldPath === file.path);
105
- if (specialRename) {
106
- await this.app.vault.rename(file, specialRename.tempPath);
107
- return;
108
- }
109
- if (this.app.vault.adapter.insensitive && oldPath.toLowerCase() === file.path.toLowerCase() && (0, import_Path.dirname)(oldPath) === (0, import_Path.dirname)(file.path)) {
110
- this.specialRenames.push({
111
- oldPath,
112
- newPath: file.path,
113
- tempPath: (0, import_Path.join)(file.parent?.path ?? "", "__temp__" + file.name)
114
- });
115
- await this.app.vault.rename(file, oldPath);
116
- return;
117
- }
118
- const updateAllLinks = this.app.fileManager.updateAllLinks;
119
- try {
120
- this.app.fileManager.updateAllLinks = async () => {
121
- };
122
- const renameMap = /* @__PURE__ */ new Map();
123
- await this.fillRenameMap(file, oldPath, renameMap);
124
- renameMap.set(oldPath, file.path);
125
- for (const oldPath2 of renameMap.keys()) {
126
- this.renamingPaths.add(oldPath2);
127
- }
128
- for (const [oldPath2, newPath2] of renameMap.entries()) {
129
- await this.processRename(oldPath2, newPath2, renameMap);
130
- }
131
- } finally {
132
- this.renamingPaths.delete(oldPath);
133
- this.app.fileManager.updateAllLinks = updateAllLinks;
134
- const specialRename2 = this.specialRenames.find((x) => x.tempPath === file.path);
135
- if (specialRename2) {
136
- await this.app.vault.rename(file, specialRename2.newPath);
137
- this.specialRenames.remove(specialRename2);
138
- }
139
- }
102
+ const specialRename = specialRenames.find((x) => x.oldPath === file.path);
103
+ if (specialRename) {
104
+ await app.vault.rename(file, specialRename.tempPath);
105
+ return;
140
106
  }
141
- async handleDelete(file) {
142
- console.debug(`Handle Delete ${file.path}`);
143
- if (!(0, import_TAbstractFile.isNote)(file)) {
144
- return;
145
- }
146
- if (this.renamingPaths.has(file.path)) {
147
- return;
148
- }
149
- const attachmentFolderPath = await (0, import_AttachmentPath.getAttachmentFolderPath)(this.app, file.path);
150
- const attachmentFolder = this.app.vault.getFolderByPath(attachmentFolderPath);
151
- if (!attachmentFolder) {
152
- return;
153
- }
154
- const settings = this.getSettings();
155
- if (settings.shouldDeleteOrphanAttachments) {
156
- await (0, import_Vault.deleteSafe)(this.app, attachmentFolder, file.path, false, settings.shouldDeleteEmptyFolders);
157
- }
107
+ if (app.vault.adapter.insensitive && oldPath.toLowerCase() === file.path.toLowerCase() && (0, import_Path.dirname)(oldPath) === (0, import_Path.dirname)(file.path)) {
108
+ specialRenames.push({
109
+ oldPath,
110
+ newPath: file.path,
111
+ tempPath: (0, import_Path.join)(file.parent?.path ?? "", "__temp__" + file.name)
112
+ });
113
+ await app.vault.rename(file, oldPath);
114
+ return;
158
115
  }
159
- async fillRenameMap(file, oldPath, renameMap) {
160
- if (!(0, import_TAbstractFile.isNote)(file)) {
161
- return;
116
+ const updateAllLinks = app.fileManager.updateAllLinks;
117
+ try {
118
+ app.fileManager.updateAllLinks = async () => {
119
+ };
120
+ const renameMap = /* @__PURE__ */ new Map();
121
+ await fillRenameMap(app, file, oldPath, renameMap);
122
+ renameMap.set(oldPath, file.path);
123
+ for (const [oldPath2, newPath2] of renameMap.entries()) {
124
+ await processRename(app, oldPath2, newPath2, renameMap);
162
125
  }
163
- const settings = this.getSettings();
164
- const oldAttachmentFolderPath = await (0, import_AttachmentPath.getAttachmentFolderPath)(this.app, oldPath);
165
- const newAttachmentFolderPath = settings.shouldRenameAttachmentFolder ? await (0, import_AttachmentPath.getAttachmentFolderPath)(this.app, file.path) : oldAttachmentFolderPath;
166
- const dummyOldAttachmentFolderPath = await (0, import_AttachmentPath.getAttachmentFolderPath)(this.app, (0, import_Path.join)((0, import_Path.dirname)(oldPath), "DUMMY_FILE.md"));
167
- const oldAttachmentFolder = this.app.vault.getFolderByPath(oldAttachmentFolderPath);
168
- if (!oldAttachmentFolder) {
169
- return;
126
+ } finally {
127
+ app.fileManager.updateAllLinks = updateAllLinks;
128
+ const specialRename2 = specialRenames.find((x) => x.tempPath === file.path);
129
+ if (specialRename2) {
130
+ await app.vault.rename(file, specialRename2.newPath);
131
+ specialRenames.remove(specialRename2);
170
132
  }
171
- if (oldAttachmentFolderPath === newAttachmentFolderPath && !settings.shouldRenameAttachmentFiles) {
133
+ }
134
+ }
135
+ async function handleDelete(app, file) {
136
+ console.debug(`Handle Delete ${file.path}`);
137
+ if (!(0, import_TAbstractFile.isNote)(file)) {
138
+ return;
139
+ }
140
+ const attachmentFolderPath = await (0, import_AttachmentPath.getAttachmentFolderPath)(app, file.path);
141
+ const attachmentFolder = app.vault.getFolderByPath(attachmentFolderPath);
142
+ if (!attachmentFolder) {
143
+ return;
144
+ }
145
+ const settings = getSettings(app);
146
+ if (settings.shouldDeleteOrphanAttachments) {
147
+ await (0, import_Vault.deleteSafe)(app, attachmentFolder, file.path, false, settings.shouldDeleteEmptyFolders);
148
+ }
149
+ }
150
+ async function fillRenameMap(app, file, oldPath, renameMap) {
151
+ if (!(0, import_TAbstractFile.isNote)(file)) {
152
+ return;
153
+ }
154
+ const settings = getSettings(app);
155
+ const oldAttachmentFolderPath = await (0, import_AttachmentPath.getAttachmentFolderPath)(app, oldPath);
156
+ const newAttachmentFolderPath = settings.shouldRenameAttachmentFolder ? await (0, import_AttachmentPath.getAttachmentFolderPath)(app, file.path) : oldAttachmentFolderPath;
157
+ const dummyOldAttachmentFolderPath = await (0, import_AttachmentPath.getAttachmentFolderPath)(app, (0, import_Path.join)((0, import_Path.dirname)(oldPath), "DUMMY_FILE.md"));
158
+ const oldAttachmentFolder = app.vault.getFolderByPath(oldAttachmentFolderPath);
159
+ if (!oldAttachmentFolder) {
160
+ return;
161
+ }
162
+ if (oldAttachmentFolderPath === newAttachmentFolderPath && !settings.shouldRenameAttachmentFiles) {
163
+ return;
164
+ }
165
+ const children = [];
166
+ if (oldAttachmentFolderPath === dummyOldAttachmentFolderPath) {
167
+ const cache = await (0, import_MetadataCache.getCacheSafe)(app, file);
168
+ if (!cache) {
172
169
  return;
173
170
  }
174
- const children = [];
175
- if (oldAttachmentFolderPath === dummyOldAttachmentFolderPath) {
176
- const cache = await (0, import_MetadataCache.getCacheSafe)(this.app, file);
177
- if (!cache) {
178
- return;
171
+ for (const link of (0, import_MetadataCache.getAllLinks)(cache)) {
172
+ const attachmentFile = (0, import_Link.extractLinkFile)(app, link, oldPath);
173
+ if (!attachmentFile) {
174
+ continue;
179
175
  }
180
- for (const link of (0, import_MetadataCache.getAllLinks)(cache)) {
181
- const attachmentFile = (0, import_Link.extractLinkFile)(this.app, link, oldPath);
182
- if (!attachmentFile) {
183
- continue;
184
- }
185
- if (attachmentFile.path.startsWith(oldAttachmentFolderPath)) {
186
- const backlinks = await (0, import_MetadataCache.getBacklinksForFileSafe)(this.app, attachmentFile);
187
- if (backlinks.keys().length === 1) {
188
- children.push(attachmentFile);
189
- }
176
+ if (attachmentFile.path.startsWith(oldAttachmentFolderPath)) {
177
+ const backlinks = await (0, import_MetadataCache.getBacklinksForFileSafe)(app, attachmentFile);
178
+ if (backlinks.keys().length === 1) {
179
+ children.push(attachmentFile);
190
180
  }
191
181
  }
192
- } else {
193
- import_obsidian.Vault.recurseChildren(oldAttachmentFolder, (child) => {
194
- if (child instanceof import_obsidian.TFile) {
195
- children.push(child);
196
- }
197
- });
198
182
  }
199
- const oldNoteBaseName = (0, import_Path.basename)(oldPath, (0, import_Path.extname)(oldPath));
200
- for (const child of children) {
201
- if ((0, import_TAbstractFile.isNote)(child)) {
202
- continue;
183
+ } else {
184
+ import_obsidian.Vault.recurseChildren(oldAttachmentFolder, (child) => {
185
+ if (child instanceof import_obsidian.TFile) {
186
+ children.push(child);
203
187
  }
204
- const relativePath = (0, import_Path.relative)(oldAttachmentFolderPath, child.path);
205
- const newDir = (0, import_Path.join)(newAttachmentFolderPath, (0, import_Path.dirname)(relativePath));
206
- const newChildBasename = settings.shouldRenameAttachmentFiles ? child.basename.replaceAll(oldNoteBaseName, file.basename) : child.basename;
207
- let newChildPath = (0, import_Path.join)(newDir, (0, import_Path.makeFileName)(newChildBasename, child.extension));
208
- if (child.path !== newChildPath) {
209
- if (settings.shouldDeleteConflictingAttachments) {
210
- const newChildFile = this.app.vault.getFileByPath(newChildPath);
211
- if (newChildFile) {
212
- await this.app.fileManager.trashFile(newChildFile);
213
- }
214
- } else {
215
- newChildPath = this.app.vault.getAvailablePath((0, import_Path.join)(newDir, newChildBasename), child.extension);
188
+ });
189
+ }
190
+ const oldNoteBaseName = (0, import_Path.basename)(oldPath, (0, import_Path.extname)(oldPath));
191
+ for (const child of children) {
192
+ if ((0, import_TAbstractFile.isNote)(child)) {
193
+ continue;
194
+ }
195
+ const relativePath = (0, import_Path.relative)(oldAttachmentFolderPath, child.path);
196
+ const newDir = (0, import_Path.join)(newAttachmentFolderPath, (0, import_Path.dirname)(relativePath));
197
+ const newChildBasename = settings.shouldRenameAttachmentFiles ? child.basename.replaceAll(oldNoteBaseName, file.basename) : child.basename;
198
+ let newChildPath = (0, import_Path.join)(newDir, (0, import_Path.makeFileName)(newChildBasename, child.extension));
199
+ if (child.path !== newChildPath) {
200
+ if (settings.shouldDeleteConflictingAttachments) {
201
+ const newChildFile = app.vault.getFileByPath(newChildPath);
202
+ if (newChildFile) {
203
+ await app.fileManager.trashFile(newChildFile);
216
204
  }
217
- renameMap.set(child.path, newChildPath);
205
+ } else {
206
+ newChildPath = app.vault.getAvailablePath((0, import_Path.join)(newDir, newChildBasename), child.extension);
218
207
  }
208
+ renameMap.set(child.path, newChildPath);
219
209
  }
220
210
  }
221
- async processRename(oldPath, newPath, renameMap) {
211
+ }
212
+ async function processRename(app, oldPath, newPath, renameMap) {
213
+ const settings = getSettings(app);
214
+ let oldFile = app.vault.getFileByPath(oldPath);
215
+ let newFile = app.vault.getFileByPath(newPath);
216
+ if (oldFile) {
217
+ await (0, import_Vault.createFolderSafe)(app, (0, import_Path.dirname)(newPath));
218
+ const oldFolder = oldFile.parent;
222
219
  try {
223
- const settings = this.getSettings();
224
- let oldFile = this.app.vault.getFileByPath(oldPath);
225
- let newFile = this.app.vault.getFileByPath(newPath);
226
- if (oldFile) {
227
- await (0, import_Vault.createFolderSafe)(this.app, (0, import_Path.dirname)(newPath));
228
- const oldFolder = oldFile.parent;
220
+ if (newFile) {
229
221
  try {
230
- if (newFile) {
231
- try {
232
- await this.app.fileManager.trashFile(newFile);
233
- } catch (e) {
234
- if (this.app.vault.getAbstractFileByPath(newPath)) {
235
- throw e;
236
- }
237
- }
238
- }
239
- await this.app.vault.rename(oldFile, newPath);
222
+ await app.fileManager.trashFile(newFile);
240
223
  } catch (e) {
241
- if (!this.app.vault.getAbstractFileByPath(newPath) || this.app.vault.getAbstractFileByPath(oldPath)) {
224
+ if (app.vault.getAbstractFileByPath(newPath)) {
242
225
  throw e;
243
226
  }
244
227
  }
245
- if (settings.shouldDeleteEmptyFolders) {
246
- await (0, import_Vault.deleteEmptyFolderHierarchy)(this.app, oldFolder);
247
- }
248
228
  }
249
- oldFile = (0, import_implementations.createTFileInstance)(this.app.vault, oldPath);
250
- newFile = this.app.vault.getFileByPath(newPath);
251
- if (!oldFile.deleted || !newFile) {
252
- throw new Error(`Could not rename ${oldPath} to ${newPath}`);
253
- }
254
- if (!settings.shouldUpdateLinks) {
255
- return;
229
+ await app.vault.rename(oldFile, newPath);
230
+ } catch (e) {
231
+ if (!app.vault.getAbstractFileByPath(newPath) || app.vault.getAbstractFileByPath(oldPath)) {
232
+ throw e;
256
233
  }
257
- const backlinks = await this.getBacklinks(oldFile, newFile);
258
- for (const parentNotePath of backlinks.keys()) {
259
- let parentNote = this.app.vault.getFileByPath(parentNotePath);
260
- if (!parentNote) {
261
- const newParentNotePath = renameMap.get(parentNotePath);
262
- if (newParentNotePath) {
263
- parentNote = this.app.vault.getFileByPath(newParentNotePath);
264
- }
265
- }
266
- if (!parentNote) {
267
- console.warn(`Parent note not found: ${parentNotePath}`);
268
- continue;
269
- }
270
- await (0, import_Vault.applyFileChanges)(this.app, parentNote, async () => {
271
- const links = (await this.getBacklinks(oldFile, newFile)).get(parentNotePath) ?? [];
272
- const changes = [];
273
- for (const link of links) {
274
- changes.push({
275
- startIndex: link.position.start.offset,
276
- endIndex: link.position.end.offset,
277
- oldContent: link.original,
278
- newContent: (0, import_Link.updateLink)({
279
- app: this.app,
280
- link,
281
- pathOrFile: newFile,
282
- oldPathOrFile: oldPath,
283
- sourcePathOrFile: parentNote,
284
- renameMap,
285
- shouldUpdateFilenameAlias: settings.shouldUpdateFilenameAliases
286
- })
287
- });
288
- }
289
- return changes;
290
- });
291
- }
292
- if ((0, import_TAbstractFile.isCanvasFile)(newFile)) {
293
- await (0, import_Vault.processWithRetry)(this.app, newFile, (content) => {
294
- const canvasData = JSON.parse(content);
295
- for (const node of canvasData.nodes) {
296
- if (node.type !== "file") {
297
- continue;
298
- }
299
- const newPath2 = renameMap.get(node.file);
300
- if (!newPath2) {
301
- continue;
302
- }
303
- node.file = newPath2;
304
- }
305
- return (0, import_Object.toJson)(canvasData);
306
- });
307
- } else if ((0, import_TAbstractFile.isMarkdownFile)(newFile)) {
308
- await (0, import_Link.updateLinksInFile)({
309
- app: this.app,
310
- pathOrFile: newFile,
311
- oldPathOrFile: oldPath,
312
- renameMap,
313
- shouldUpdateFilenameAlias: settings.shouldUpdateFilenameAliases
314
- });
315
- }
316
- } finally {
317
- this.renamingPaths.delete(oldPath);
318
234
  }
319
- }
320
- async getBacklinks(oldFile, newFile) {
321
- const backlinks = /* @__PURE__ */ new Map();
322
- const oldLinks = await (0, import_MetadataCache.getBacklinksForFileSafe)(this.app, oldFile);
323
- for (const path of oldLinks.keys()) {
324
- backlinks.set(path, oldLinks.get(path) ?? []);
235
+ if (settings.shouldDeleteEmptyFolders) {
236
+ await (0, import_Vault.deleteEmptyFolderHierarchy)(app, oldFolder);
325
237
  }
326
- if (!newFile) {
327
- return backlinks;
238
+ }
239
+ oldFile = (0, import_implementations.createTFileInstance)(app.vault, oldPath);
240
+ newFile = app.vault.getFileByPath(newPath);
241
+ if (!oldFile.deleted || !newFile) {
242
+ throw new Error(`Could not rename ${oldPath} to ${newPath}`);
243
+ }
244
+ if (!settings.shouldUpdateLinks) {
245
+ return;
246
+ }
247
+ const backlinks = await (0, import_MetadataCache.getBacklinksMap)(app, [oldFile, newFile]);
248
+ for (const parentNotePath of backlinks.keys()) {
249
+ let parentNote = app.vault.getFileByPath(parentNotePath);
250
+ if (!parentNote) {
251
+ const newParentNotePath = renameMap.get(parentNotePath);
252
+ if (newParentNotePath) {
253
+ parentNote = app.vault.getFileByPath(newParentNotePath);
254
+ }
328
255
  }
329
- const newLinks = await (0, import_MetadataCache.getBacklinksForFileSafe)(this.app, newFile);
330
- for (const path of newLinks.keys()) {
331
- const links = backlinks.get(path) ?? [];
332
- links.push(...newLinks.get(path) ?? []);
333
- backlinks.set(path, links);
256
+ if (!parentNote) {
257
+ console.warn(`Parent note not found: ${parentNotePath}`);
258
+ continue;
334
259
  }
335
- return backlinks;
260
+ await (0, import_Vault.applyFileChanges)(app, parentNote, async () => {
261
+ const backlinks2 = await (0, import_MetadataCache.getBacklinksMap)(app, [oldFile, newFile]);
262
+ const links = backlinks2.get(parentNotePath) ?? [];
263
+ const changes = [];
264
+ for (const link of links) {
265
+ changes.push({
266
+ startIndex: link.position.start.offset,
267
+ endIndex: link.position.end.offset,
268
+ oldContent: link.original,
269
+ newContent: (0, import_Link.updateLink)({
270
+ app,
271
+ link,
272
+ pathOrFile: newFile,
273
+ oldPathOrFile: oldPath,
274
+ sourcePathOrFile: parentNote,
275
+ renameMap,
276
+ shouldUpdateFilenameAlias: settings.shouldUpdateFilenameAliases
277
+ })
278
+ });
279
+ }
280
+ return changes;
281
+ });
336
282
  }
337
- getSettings() {
338
- const renameDeleteHandlersMap = getRenameDeleteHandlersMap(this.app);
339
- const settingsBuilders = Array.from(renameDeleteHandlersMap.values()).reverse();
340
- const settings = {};
341
- for (const settingsBuilder of settingsBuilders) {
342
- const newSettings = settingsBuilder();
343
- for (const [key, value] of Object.entries(newSettings)) {
344
- settings[key] ||= value;
283
+ if ((0, import_TAbstractFile.isCanvasFile)(newFile)) {
284
+ await (0, import_Vault.processWithRetry)(app, newFile, (content) => {
285
+ const canvasData = JSON.parse(content);
286
+ for (const node of canvasData.nodes) {
287
+ if (node.type !== "file") {
288
+ continue;
289
+ }
290
+ const newPath2 = renameMap.get(node.file);
291
+ if (!newPath2) {
292
+ continue;
293
+ }
294
+ node.file = newPath2;
345
295
  }
346
- }
347
- return settings;
296
+ return (0, import_Object.toJson)(canvasData);
297
+ });
298
+ } else if ((0, import_TAbstractFile.isMarkdownFile)(newFile)) {
299
+ await (0, import_Link.updateLinksInFile)({
300
+ app,
301
+ pathOrFile: newFile,
302
+ oldPathOrFile: oldPath,
303
+ renameMap,
304
+ shouldUpdateFilenameAlias: settings.shouldUpdateFilenameAliases
305
+ });
348
306
  }
349
307
  }
350
- function getRenameDeleteHandlersMap(app) {
351
- return (0, import_App.getObsidianDevUtilsState)(app, "renameDeleteHandlersMap", /* @__PURE__ */ new Map()).value;
352
- }
353
- function logPluginSettingsOrder(app) {
308
+ function getSettings(app) {
354
309
  const renameDeleteHandlersMap = getRenameDeleteHandlersMap(app);
355
- console.debug(`Rename/delete handlers will use plugin settings in the following order: ${Array.from(renameDeleteHandlersMap.keys()).join(", ")}`);
310
+ const settingsBuilders = Array.from(renameDeleteHandlersMap.values()).reverse();
311
+ const settings = {};
312
+ for (const settingsBuilder of settingsBuilders) {
313
+ const newSettings = settingsBuilder();
314
+ for (const [key, value] of Object.entries(newSettings)) {
315
+ settings[key] ||= value;
316
+ }
317
+ }
318
+ return settings;
356
319
  }
357
320
  // Annotate the CommonJS export names for ESM import in node:
358
321
  0 && (module.exports = {
359
322
  registerRenameDeleteHandlers
360
323
  });
361
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuL1JlbmFtZURlbGV0ZUhhbmRsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbInZhciBfX2ltcG9ydF9tZXRhX3VybCA9IGdsb2JhbFRoaXNbJ2ltcG9ydC5tZXRhLnVybCddID8/ICgoKT0+e2lmKHR5cGVvZiBfX2ZpbGVuYW1lIT09XCJzdHJpbmdcIil7cmV0dXJuIG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpfXJldHVybiByZXF1aXJlKFwibm9kZTp1cmxcIikucGF0aFRvRmlsZVVSTChfX2ZpbGVuYW1lKX0pKCk7XG52YXIgX19wcm9jZXNzID0gZ2xvYmFsVGhpc1sncHJvY2VzcyddID8/IHtcbiAgXCJjd2RcIjogKCk9PlwiL1wiLFxuICBcImVudlwiOiB7fSxcbiAgXCJwbGF0Zm9ybVwiOiBcImFuZHJvaWRcIlxufTtcbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luLFxuICBSZWZlcmVuY2VDYWNoZSxcbiAgVEFic3RyYWN0RmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge1xuICBBcHAsXG4gIFRGaWxlLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IENhbnZhc0RhdGEgfSBmcm9tICdvYnNpZGlhbi9jYW52YXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlVEZpbGVJbnN0YW5jZSB9IGZyb20gJ29ic2lkaWFuLXR5cGluZ3MvaW1wbGVtZW50YXRpb25zJztcblxuaW1wb3J0IHsgaW52b2tlQXN5bmNTYWZlbHkgfSBmcm9tICcuLi9Bc3luYy50cyc7XG5pbXBvcnQgeyB0b0pzb24gfSBmcm9tICcuLi9PYmplY3QudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIG1ha2VGaWxlTmFtZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL0FwcC50cyc7XG5pbXBvcnQgeyBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCB9IGZyb20gJy4vQXR0YWNobWVudFBhdGgudHMnO1xuaW1wb3J0IHtcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuL0xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRDYWNoZVNhZmVcbn0gZnJvbSAnLi9NZXRhZGF0YUNhY2hlLnRzJztcbmltcG9ydCB7XG4gIGlzQ2FudmFzRmlsZSxcbiAgaXNNYXJrZG93bkZpbGUsXG4gIGlzTm90ZVxufSBmcm9tICcuL1RBYnN0cmFjdEZpbGUudHMnO1xuaW1wb3J0IHtcbiAgYXBwbHlGaWxlQ2hhbmdlcyxcbiAgY3JlYXRlRm9sZGVyU2FmZSxcbiAgZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHksXG4gIGRlbGV0ZVNhZmUsXG4gIHByb2Nlc3NXaXRoUmV0cnlcbn0gZnJvbSAnLi9WYXVsdC50cyc7XG5cbmludGVyZmFjZSBTcGVjaWFsUmVuYW1lIHtcbiAgb2xkUGF0aDogc3RyaW5nO1xuICBuZXdQYXRoOiBzdHJpbmc7XG4gIHRlbXBQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogU2V0dGluZ3MgZm9yIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZXRlIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnRzLlxuICAgKi9cbiAgc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50czogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgZW1wdHkgZm9sZGVycy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgb3JwaGFuIGF0dGFjaG1lbnRzIGFmdGVyIGEgZGVsZXRlLlxuICAgKi9cbiAgc2hvdWxkRGVsZXRlT3JwaGFuQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZmlsZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZm9sZGVyIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZW5hbWUgYWxpYXNlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBsaW5rcyB3aGVuIGEgbm90ZSBvciBhdHRhY2htZW50IGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRVcGRhdGVMaW5rczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlcnMuXG4gKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBzZXR0aW5nc0J1aWxkZXIgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgc2V0dGluZ3MgZm9yIHRoZSByZW5hbWUgZGVsZXRlIGhhbmRsZXIuXG4gKiBAcmV0dXJucyB2b2lkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclJlbmFtZURlbGV0ZUhhbmRsZXJzKHBsdWdpbjogUGx1Z2luLCBzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPik6IHZvaWQge1xuICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKHBsdWdpbi5hcHApO1xuICBjb25zdCBwbHVnaW5JZCA9IHBsdWdpbi5tYW5pZmVzdC5pZDtcblxuICByZW5hbWVEZWxldGVIYW5kbGVyc01hcC5zZXQocGx1Z2luSWQsIHNldHRpbmdzQnVpbGRlcik7XG4gIGxvZ1BsdWdpblNldHRpbmdzT3JkZXIocGx1Z2luLmFwcCk7XG5cbiAgcGx1Z2luLnJlZ2lzdGVyKCgpID0+IHtcbiAgICByZW5hbWVEZWxldGVIYW5kbGVyc01hcC5kZWxldGUocGx1Z2luSWQpO1xuICAgIGxvZ1BsdWdpblNldHRpbmdzT3JkZXIocGx1Z2luLmFwcCk7XG4gIH0pO1xuXG4gIGNvbnN0IGFwcCA9IHBsdWdpbi5hcHA7XG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXIgPSBuZXcgUmVuYW1lRGVsZXRlSGFuZGxlcihhcHApO1xuICBwbHVnaW4ucmVnaXN0ZXJFdmVudChcbiAgICBhcHAudmF1bHQub24oJ2RlbGV0ZScsIChmaWxlKSA9PiB7XG4gICAgICBpZiAoIXNob3VsZEludm9rZUhhbmRsZXIoYXBwLCBwbHVnaW5JZCwgJ0RlbGV0ZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGludm9rZUFzeW5jU2FmZWx5KHJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlRGVsZXRlKGZpbGUpKTtcbiAgICB9KVxuICApO1xuXG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpID0+IHtcbiAgICAgIGlmICghc2hvdWxkSW52b2tlSGFuZGxlcihhcHAsIHBsdWdpbklkLCAnUmVuYW1lJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaW52b2tlQXN5bmNTYWZlbHkocmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVSZW5hbWUoZmlsZSwgb2xkUGF0aCkpO1xuICAgIH0pXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEludm9rZUhhbmRsZXIoYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcsIGhhbmRsZXJUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlclBsdWdpbklkcyA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcCk7XG4gIGNvbnN0IG1haW5QbHVnaW5JZCA9IEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlclBsdWdpbklkcy5rZXlzKCkpWzBdO1xuICBpZiAobWFpblBsdWdpbklkICE9PSBwbHVnaW5JZCkge1xuICAgIGNvbnNvbGUuZGVidWcoYCR7aGFuZGxlclR5cGV9IGhhbmRsZXIgZm9yIHBsdWdpbiAke3BsdWdpbklkfSBpcyBza2lwcGVkLCBiZWNhdXNlIGl0IGlzIGhhbmRsZWQgYnkgcGx1Z2luICR7bWFpblBsdWdpbklkID8/ICcobm9uZSknfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY2xhc3MgUmVuYW1lRGVsZXRlSGFuZGxlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcDogQXBwKSB7IH1cblxuICBwcml2YXRlIHJlbmFtaW5nUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzcGVjaWFsUmVuYW1lczogU3BlY2lhbFJlbmFtZVtdID0gW107XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZVJlbmFtZShmaWxlOiBUQWJzdHJhY3RGaWxlLCBvbGRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmRlYnVnKGBIYW5kbGUgUmVuYW1lICR7b2xkUGF0aH0gLT4gJHtmaWxlLnBhdGh9YCk7XG5cbiAgICBpZiAodGhpcy5yZW5hbWluZ1BhdGhzLmhhcyhvbGRQYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzcGVjaWFsUmVuYW1lID0gdGhpcy5zcGVjaWFsUmVuYW1lcy5maW5kKCh4KSA9PiB4Lm9sZFBhdGggPT09IGZpbGUucGF0aCk7XG4gICAgaWYgKHNwZWNpYWxSZW5hbWUpIHtcbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlbmFtZShmaWxlLCBzcGVjaWFsUmVuYW1lLnRlbXBQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hcHAudmF1bHQuYWRhcHRlci5pbnNlbnNpdGl2ZSAmJiBvbGRQYXRoLnRvTG93ZXJDYXNlKCkgPT09IGZpbGUucGF0aC50b0xvd2VyQ2FzZSgpICYmIGRpcm5hbWUob2xkUGF0aCkgPT09IGRpcm5hbWUoZmlsZS5wYXRoKSkge1xuICAgICAgdGhpcy5zcGVjaWFsUmVuYW1lcy5wdXNoKHtcbiAgICAgICAgb2xkUGF0aCxcbiAgICAgICAgbmV3UGF0aDogZmlsZS5wYXRoLFxuICAgICAgICB0ZW1wUGF0aDogam9pbihmaWxlLnBhcmVudD8ucGF0aCA/PyAnJywgJ19fdGVtcF9fJyArIGZpbGUubmFtZSlcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5yZW5hbWUoZmlsZSwgb2xkUGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgIGNvbnN0IHVwZGF0ZUFsbExpbmtzID0gdGhpcy5hcHAuZmlsZU1hbmFnZXIudXBkYXRlQWxsTGlua3M7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXBwLmZpbGVNYW5hZ2VyLnVwZGF0ZUFsbExpbmtzID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZW5hbWVNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgYXdhaXQgdGhpcy5maWxsUmVuYW1lTWFwKGZpbGUsIG9sZFBhdGgsIHJlbmFtZU1hcCk7XG4gICAgICByZW5hbWVNYXAuc2V0KG9sZFBhdGgsIGZpbGUucGF0aCk7XG4gICAgICBmb3IgKGNvbnN0IG9sZFBhdGggb2YgcmVuYW1lTWFwLmtleXMoKSkge1xuICAgICAgICB0aGlzLnJlbmFtaW5nUGF0aHMuYWRkKG9sZFBhdGgpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtvbGRQYXRoMiwgbmV3UGF0aDJdIG9mIHJlbmFtZU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzUmVuYW1lKG9sZFBhdGgyLCBuZXdQYXRoMiwgcmVuYW1lTWFwKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5yZW5hbWluZ1BhdGhzLmRlbGV0ZShvbGRQYXRoKTtcbiAgICAgIHRoaXMuYXBwLmZpbGVNYW5hZ2VyLnVwZGF0ZUFsbExpbmtzID0gdXBkYXRlQWxsTGlua3M7XG5cbiAgICAgIGNvbnN0IHNwZWNpYWxSZW5hbWUgPSB0aGlzLnNwZWNpYWxSZW5hbWVzLmZpbmQoKHgpID0+IHgudGVtcFBhdGggPT09IGZpbGUucGF0aCk7XG4gICAgICBpZiAoc3BlY2lhbFJlbmFtZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5yZW5hbWUoZmlsZSwgc3BlY2lhbFJlbmFtZS5uZXdQYXRoKTtcbiAgICAgICAgdGhpcy5zcGVjaWFsUmVuYW1lcy5yZW1vdmUoc3BlY2lhbFJlbmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZURlbGV0ZShmaWxlOiBUQWJzdHJhY3RGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5kZWJ1ZyhgSGFuZGxlIERlbGV0ZSAke2ZpbGUucGF0aH1gKTtcbiAgICBpZiAoIWlzTm90ZShmaWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlbmFtaW5nUGF0aHMuaGFzKGZpbGUucGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHRoaXMuYXBwLCBmaWxlLnBhdGgpO1xuICAgIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXIgPSB0aGlzLmFwcC52YXVsdC5nZXRGb2xkZXJCeVBhdGgoYXR0YWNobWVudEZvbGRlclBhdGgpO1xuXG4gICAgaWYgKCFhdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKCk7XG4gICAgaWYgKHNldHRpbmdzLnNob3VsZERlbGV0ZU9ycGhhbkF0dGFjaG1lbnRzKSB7XG4gICAgICBhd2FpdCBkZWxldGVTYWZlKHRoaXMuYXBwLCBhdHRhY2htZW50Rm9sZGVyLCBmaWxlLnBhdGgsIGZhbHNlLCBzZXR0aW5ncy5zaG91bGREZWxldGVFbXB0eUZvbGRlcnMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmlsbFJlbmFtZU1hcChmaWxlOiBURmlsZSwgb2xkUGF0aDogc3RyaW5nLCByZW5hbWVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWlzTm90ZShmaWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncygpO1xuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh0aGlzLmFwcCwgb2xkUGF0aCk7XG4gICAgY29uc3QgbmV3QXR0YWNobWVudEZvbGRlclBhdGggPSBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyXG4gICAgICA/IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHRoaXMuYXBwLCBmaWxlLnBhdGgpXG4gICAgICA6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoO1xuICAgIGNvbnN0IGR1bW15T2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh0aGlzLmFwcCwgam9pbihkaXJuYW1lKG9sZFBhdGgpLCAnRFVNTVlfRklMRS5tZCcpKTtcblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXIgPSB0aGlzLmFwcC52YXVsdC5nZXRGb2xkZXJCeVBhdGgob2xkQXR0YWNobWVudEZvbGRlclBhdGgpO1xuXG4gICAgaWYgKCFvbGRBdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRyZW46IFRGaWxlW10gPSBbXTtcblxuICAgIGlmIChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gZHVtbXlPbGRBdHRhY2htZW50Rm9sZGVyUGF0aCkge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUodGhpcy5hcHAsIGZpbGUpO1xuICAgICAgaWYgKCFjYWNoZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgZ2V0QWxsTGlua3MoY2FjaGUpKSB7XG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHRoaXMuYXBwLCBsaW5rLCBvbGRQYXRoKTtcbiAgICAgICAgaWYgKCFhdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF0dGFjaG1lbnRGaWxlLnBhdGguc3RhcnRzV2l0aChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh0aGlzLmFwcCwgYXR0YWNobWVudEZpbGUpO1xuICAgICAgICAgIGlmIChiYWNrbGlua3Mua2V5cygpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChhdHRhY2htZW50RmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihvbGRBdHRhY2htZW50Rm9sZGVyLCAoY2hpbGQpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkTm90ZUJhc2VOYW1lID0gYmFzZW5hbWUob2xkUGF0aCwgZXh0bmFtZShvbGRQYXRoKSk7XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoaXNOb3RlKGNoaWxkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoLCBjaGlsZC5wYXRoKTtcbiAgICAgIGNvbnN0IG5ld0RpciA9IGpvaW4obmV3QXR0YWNobWVudEZvbGRlclBhdGgsIGRpcm5hbWUocmVsYXRpdmVQYXRoKSk7XG4gICAgICBjb25zdCBuZXdDaGlsZEJhc2VuYW1lID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzXG4gICAgICAgID8gY2hpbGQuYmFzZW5hbWUucmVwbGFjZUFsbChvbGROb3RlQmFzZU5hbWUsIGZpbGUuYmFzZW5hbWUpXG4gICAgICAgIDogY2hpbGQuYmFzZW5hbWU7XG4gICAgICBsZXQgbmV3Q2hpbGRQYXRoID0gam9pbihuZXdEaXIsIG1ha2VGaWxlTmFtZShuZXdDaGlsZEJhc2VuYW1lLCBjaGlsZC5leHRlbnNpb24pKTtcbiAgICAgIGlmIChjaGlsZC5wYXRoICE9PSBuZXdDaGlsZFBhdGgpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMpIHtcbiAgICAgICAgICBjb25zdCBuZXdDaGlsZEZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRGaWxlQnlQYXRoKG5ld0NoaWxkUGF0aCk7XG4gICAgICAgICAgaWYgKG5ld0NoaWxkRmlsZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIudHJhc2hGaWxlKG5ld0NoaWxkRmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0NoaWxkUGF0aCA9IHRoaXMuYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihuZXdEaXIsIG5ld0NoaWxkQmFzZW5hbWUpLCBjaGlsZC5leHRlbnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmFtZU1hcC5zZXQoY2hpbGQucGF0aCwgbmV3Q2hpbGRQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NSZW5hbWUob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcsIHJlbmFtZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICAgIGxldCBvbGRGaWxlID0gdGhpcy5hcHAudmF1bHQuZ2V0RmlsZUJ5UGF0aChvbGRQYXRoKTtcbiAgICAgIGxldCBuZXdGaWxlID0gdGhpcy5hcHAudmF1bHQuZ2V0RmlsZUJ5UGF0aChuZXdQYXRoKTtcblxuICAgICAgaWYgKG9sZEZpbGUpIHtcbiAgICAgICAgYXdhaXQgY3JlYXRlRm9sZGVyU2FmZSh0aGlzLmFwcCwgZGlybmFtZShuZXdQYXRoKSk7XG4gICAgICAgIGNvbnN0IG9sZEZvbGRlciA9IG9sZEZpbGUucGFyZW50O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChuZXdGaWxlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci50cmFzaEZpbGUobmV3RmlsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgobmV3UGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlbmFtZShvbGRGaWxlLCBuZXdQYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmICghdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG5ld1BhdGgpIHx8IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvbGRQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmdzLnNob3VsZERlbGV0ZUVtcHR5Rm9sZGVycykge1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUVtcHR5Rm9sZGVySGllcmFyY2h5KHRoaXMuYXBwLCBvbGRGb2xkZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9sZEZpbGUgPSBjcmVhdGVURmlsZUluc3RhbmNlKHRoaXMuYXBwLnZhdWx0LCBvbGRQYXRoKTtcbiAgICAgIG5ld0ZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRGaWxlQnlQYXRoKG5ld1BhdGgpO1xuXG4gICAgICBpZiAoIW9sZEZpbGUuZGVsZXRlZCB8fCAhbmV3RmlsZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZW5hbWUgJHtvbGRQYXRofSB0byAke25ld1BhdGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc2V0dGluZ3Muc2hvdWxkVXBkYXRlTGlua3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCB0aGlzLmdldEJhY2tsaW5rcyhvbGRGaWxlLCBuZXdGaWxlKTtcblxuICAgICAgZm9yIChjb25zdCBwYXJlbnROb3RlUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgICAgIGxldCBwYXJlbnROb3RlID0gdGhpcy5hcHAudmF1bHQuZ2V0RmlsZUJ5UGF0aChwYXJlbnROb3RlUGF0aCk7XG4gICAgICAgIGlmICghcGFyZW50Tm90ZSkge1xuICAgICAgICAgIGNvbnN0IG5ld1BhcmVudE5vdGVQYXRoID0gcmVuYW1lTWFwLmdldChwYXJlbnROb3RlUGF0aCk7XG4gICAgICAgICAgaWYgKG5ld1BhcmVudE5vdGVQYXRoKSB7XG4gICAgICAgICAgICBwYXJlbnROb3RlID0gdGhpcy5hcHAudmF1bHQuZ2V0RmlsZUJ5UGF0aChuZXdQYXJlbnROb3RlUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXJlbnROb3RlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBQYXJlbnQgbm90ZSBub3QgZm91bmQ6ICR7cGFyZW50Tm90ZVBhdGh9YCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBhcHBseUZpbGVDaGFuZ2VzKHRoaXMuYXBwLCBwYXJlbnROb3RlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbGlua3NcbiAgICAgICAgICAgID0gKGF3YWl0IHRoaXMuZ2V0QmFja2xpbmtzKG9sZEZpbGUsIG5ld0ZpbGUpKS5nZXQocGFyZW50Tm90ZVBhdGgpID8/IFtdO1xuICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSBbXTtcblxuICAgICAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgc3RhcnRJbmRleDogbGluay5wb3NpdGlvbi5zdGFydC5vZmZzZXQsXG4gICAgICAgICAgICAgIGVuZEluZGV4OiBsaW5rLnBvc2l0aW9uLmVuZC5vZmZzZXQsXG4gICAgICAgICAgICAgIG9sZENvbnRlbnQ6IGxpbmsub3JpZ2luYWwsXG4gICAgICAgICAgICAgIG5ld0NvbnRlbnQ6IHVwZGF0ZUxpbmsoe1xuICAgICAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICAgICAgbGluayxcbiAgICAgICAgICAgICAgICBwYXRoT3JGaWxlOiBuZXdGaWxlLFxuICAgICAgICAgICAgICAgIG9sZFBhdGhPckZpbGU6IG9sZFBhdGgsXG4gICAgICAgICAgICAgICAgc291cmNlUGF0aE9yRmlsZTogcGFyZW50Tm90ZSxcbiAgICAgICAgICAgICAgICByZW5hbWVNYXAsXG4gICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY2hhbmdlcztcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0NhbnZhc0ZpbGUobmV3RmlsZSkpIHtcbiAgICAgICAgYXdhaXQgcHJvY2Vzc1dpdGhSZXRyeSh0aGlzLmFwcCwgbmV3RmlsZSwgKGNvbnRlbnQpID0+IHtcbiAgICAgICAgICBjb25zdCBjYW52YXNEYXRhID0gSlNPTi5wYXJzZShjb250ZW50KSBhcyBDYW52YXNEYXRhO1xuICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjYW52YXNEYXRhLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlICE9PSAnZmlsZScpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gcmVuYW1lTWFwLmdldChub2RlLmZpbGUpO1xuICAgICAgICAgICAgaWYgKCFuZXdQYXRoKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZS5maWxlID0gbmV3UGF0aDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRvSnNvbihjYW52YXNEYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTWFya2Rvd25GaWxlKG5ld0ZpbGUpKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZUxpbmtzSW5GaWxlKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIHBhdGhPckZpbGU6IG5ld0ZpbGUsXG4gICAgICAgICAgb2xkUGF0aE9yRmlsZTogb2xkUGF0aCxcbiAgICAgICAgICByZW5hbWVNYXAsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnJlbmFtaW5nUGF0aHMuZGVsZXRlKG9sZFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0QmFja2xpbmtzKG9sZEZpbGU6IFRGaWxlLCBuZXdGaWxlOiBURmlsZSB8IG51bGwpOiBQcm9taXNlPE1hcDxzdHJpbmcsIFJlZmVyZW5jZUNhY2hlW10+PiB7XG4gICAgY29uc3QgYmFja2xpbmtzID0gbmV3IE1hcDxzdHJpbmcsIFJlZmVyZW5jZUNhY2hlW10+KCk7XG4gICAgY29uc3Qgb2xkTGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh0aGlzLmFwcCwgb2xkRmlsZSk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIG9sZExpbmtzLmtleXMoKSkge1xuICAgICAgYmFja2xpbmtzLnNldChwYXRoLCBvbGRMaW5rcy5nZXQocGF0aCkgPz8gW10pO1xuICAgIH1cblxuICAgIGlmICghbmV3RmlsZSkge1xuICAgICAgcmV0dXJuIGJhY2tsaW5rcztcbiAgICB9XG5cbiAgICBjb25zdCBuZXdMaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHRoaXMuYXBwLCBuZXdGaWxlKTtcblxuICAgIGZvciAoY29uc3QgcGF0aCBvZiBuZXdMaW5rcy5rZXlzKCkpIHtcbiAgICAgIGNvbnN0IGxpbmtzID0gYmFja2xpbmtzLmdldChwYXRoKSA/PyBbXTtcbiAgICAgIGxpbmtzLnB1c2goLi4ubmV3TGlua3MuZ2V0KHBhdGgpID8/IFtdKTtcbiAgICAgIGJhY2tsaW5rcy5zZXQocGF0aCwgbGlua3MpO1xuICAgIH1cblxuICAgIHJldHVybiBiYWNrbGlua3M7XG4gIH1cblxuICBwcml2YXRlIGdldFNldHRpbmdzKCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gICAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcCh0aGlzLmFwcCk7XG4gICAgY29uc3Qgc2V0dGluZ3NCdWlsZGVycyA9IEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAudmFsdWVzKCkpLnJldmVyc2UoKTtcblxuICAgIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHNldHRpbmdzQnVpbGRlciBvZiBzZXR0aW5nc0J1aWxkZXJzKSB7XG4gICAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHNldHRpbmdzQnVpbGRlcigpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobmV3U2V0dGluZ3MpIGFzIFtrZXlvZiBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3MsIGJvb2xlYW5dW10pIHtcbiAgICAgICAgc2V0dGluZ3Nba2V5XSB8fD0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcDogQXBwKTogTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PiB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoYXBwLCAncmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAnLCBuZXcgTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PigpKS52YWx1ZTtcbn1cblxuZnVuY3Rpb24gbG9nUGx1Z2luU2V0dGluZ3NPcmRlcihhcHA6IEFwcCk6IHZvaWQge1xuICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcCk7XG4gIGNvbnNvbGUuZGVidWcoYFJlbmFtZS9kZWxldGUgaGFuZGxlcnMgd2lsbCB1c2UgcGx1Z2luIHNldHRpbmdzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6ICR7QXJyYXkuZnJvbShyZW5hbWVEZWxldGVIYW5kbGVyc01hcC5rZXlzKCkpLmpvaW4oJywgJyl9YCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVdBLHNCQUlPO0FBRVAsNkJBQW9DO0FBRXBDLG1CQUFrQztBQUNsQyxvQkFBdUI7QUFDdkIsa0JB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QUFBLEVBRVEsY0FBb0Q7QUFDMUQsVUFBTSwwQkFBMEIsMkJBQTJCLEtBQUssR0FBRztBQUNuRSxVQUFNLG1CQUFtQixNQUFNLEtBQUssd0JBQXdCLE9BQU8sQ0FBQyxFQUFFLFFBQVE7QUFFOUUsVUFBTSxXQUFpRCxDQUFDO0FBQ3hELGVBQVcsbUJBQW1CLGtCQUFrQjtBQUM5QyxZQUFNLGNBQWMsZ0JBQWdCO0FBQ3BDLGlCQUFXLENBQUMsS0FBSyxLQUFLLEtBQUssT0FBTyxRQUFRLFdBQVcsR0FBcUQ7QUFDeEcsaUJBQVMsR0FBRyxNQUFNO0FBQUEsTUFDcEI7QUFBQSxJQUNGO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLFNBQVMsMkJBQTJCLEtBQW1FO0FBQ3JHLGFBQU8scUNBQXlCLEtBQUssMkJBQTJCLG9CQUFJLElBQXdELENBQUMsRUFBRTtBQUNqSTtBQUVBLFNBQVMsdUJBQXVCLEtBQWdCO0FBQzlDLFFBQU0sMEJBQTBCLDJCQUEyQixHQUFHO0FBQzlELFVBQVEsTUFBTSwyRUFBMkUsTUFBTSxLQUFLLHdCQUF3QixLQUFLLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQ2xKOyIsCiAgIm5hbWVzIjogWyJvbGRQYXRoIiwgInNwZWNpYWxSZW5hbWUiLCAibmV3UGF0aCJdCn0K
324
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuL1JlbmFtZURlbGV0ZUhhbmRsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbInZhciBfX2ltcG9ydF9tZXRhX3VybCA9IGdsb2JhbFRoaXNbJ2ltcG9ydC5tZXRhLnVybCddID8/ICgoKT0+e2lmKHR5cGVvZiBfX2ZpbGVuYW1lIT09XCJzdHJpbmdcIil7cmV0dXJuIG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpfXJldHVybiByZXF1aXJlKFwibm9kZTp1cmxcIikucGF0aFRvRmlsZVVSTChfX2ZpbGVuYW1lKX0pKCk7XG52YXIgX19wcm9jZXNzID0gZ2xvYmFsVGhpc1sncHJvY2VzcyddID8/IHtcbiAgXCJjd2RcIjogKCk9PlwiL1wiLFxuICBcImVudlwiOiB7fSxcbiAgXCJwbGF0Zm9ybVwiOiBcImFuZHJvaWRcIlxufTtcbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7XG4gIEFwcCxcbiAgVEZpbGUsXG4gIFZhdWx0XG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgQ2FudmFzRGF0YSB9IGZyb20gJ29ic2lkaWFuL2NhbnZhcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVURmlsZUluc3RhbmNlIH0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncy9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgeyB0b0pzb24gfSBmcm9tICcuLi9PYmplY3QudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIG1ha2VGaWxlTmFtZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL0FwcC50cyc7XG5pbXBvcnQgeyBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCB9IGZyb20gJy4vQXR0YWNobWVudFBhdGgudHMnO1xuaW1wb3J0IHsgY2hhaW5Bc3luY0ZuIH0gZnJvbSAnLi9DaGFpbmVkUHJvbWlzZS50cyc7XG5pbXBvcnQge1xuICBleHRyYWN0TGlua0ZpbGUsXG4gIHVwZGF0ZUxpbmssXG4gIHVwZGF0ZUxpbmtzSW5GaWxlXG59IGZyb20gJy4vTGluay50cyc7XG5pbXBvcnQge1xuICBnZXRBbGxMaW5rcyxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldEJhY2tsaW5rc01hcCxcbiAgZ2V0Q2FjaGVTYWZlXG59IGZyb20gJy4vTWV0YWRhdGFDYWNoZS50cyc7XG5pbXBvcnQge1xuICBpc0NhbnZhc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi9UQWJzdHJhY3RGaWxlLnRzJztcbmltcG9ydCB7XG4gIGFwcGx5RmlsZUNoYW5nZXMsXG4gIGNyZWF0ZUZvbGRlclNhZmUsXG4gIGRlbGV0ZUVtcHR5Rm9sZGVySGllcmFyY2h5LFxuICBkZWxldGVTYWZlLFxuICBwcm9jZXNzV2l0aFJldHJ5XG59IGZyb20gJy4vVmF1bHQudHMnO1xuXG5pbnRlcmZhY2UgU3BlY2lhbFJlbmFtZSB7XG4gIG9sZFBhdGg6IHN0cmluZztcbiAgbmV3UGF0aDogc3RyaW5nO1xuICB0ZW1wUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGZvciB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZXRlIGVtcHR5IGZvbGRlcnMuXG4gICAqL1xuICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZXRlIG9ycGhhbiBhdHRhY2htZW50cyBhZnRlciBhIGRlbGV0ZS5cbiAgICovXG4gIHNob3VsZERlbGV0ZU9ycGhhbkF0dGFjaG1lbnRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZpbGVzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZvbGRlciB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGVuYW1lIGFsaWFzZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgbGlua3Mgd2hlbiBhIG5vdGUgb3IgYXR0YWNobWVudCBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlTGlua3M6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXJzLlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gc2V0dGluZ3NCdWlsZGVyIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHNldHRpbmdzIGZvciB0aGUgcmVuYW1lIGRlbGV0ZSBoYW5kbGVyLlxuICogQHJldHVybnMgdm9pZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSZW5hbWVEZWxldGVIYW5kbGVycyhwbHVnaW46IFBsdWdpbiwgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4pOiB2b2lkIHtcbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChwbHVnaW4uYXBwKTtcbiAgY29uc3QgcGx1Z2luSWQgPSBwbHVnaW4ubWFuaWZlc3QuaWQ7XG5cbiAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuc2V0KHBsdWdpbklkLCBzZXR0aW5nc0J1aWxkZXIpO1xuICBsb2dQbHVnaW5TZXR0aW5nc09yZGVyKHBsdWdpbi5hcHApO1xuXG4gIHBsdWdpbi5yZWdpc3RlcigoKSA9PiB7XG4gICAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuZGVsZXRlKHBsdWdpbklkKTtcbiAgICBsb2dQbHVnaW5TZXR0aW5nc09yZGVyKHBsdWdpbi5hcHApO1xuICB9KTtcblxuICBjb25zdCBhcHAgPSBwbHVnaW4uYXBwO1xuICBwbHVnaW4ucmVnaXN0ZXJFdmVudChcbiAgICBhcHAudmF1bHQub24oJ2RlbGV0ZScsIChmaWxlKSA9PiB7XG4gICAgICBpZiAoIXNob3VsZEludm9rZUhhbmRsZXIoYXBwLCBwbHVnaW5JZCwgJ0RlbGV0ZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoYWluQXN5bmNGbihhcHAsICgpID0+IGhhbmRsZURlbGV0ZShhcHAsIGZpbGUpKTtcbiAgICB9KVxuICApO1xuXG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpID0+IHtcbiAgICAgIGlmICghc2hvdWxkSW52b2tlSGFuZGxlcihhcHAsIHBsdWdpbklkLCAnUmVuYW1lJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2hhaW5Bc3luY0ZuKGFwcCwgKCkgPT4gaGFuZGxlUmVuYW1lKGFwcCwgZmlsZSwgb2xkUGF0aCkpO1xuICAgIH0pXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEludm9rZUhhbmRsZXIoYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcsIGhhbmRsZXJUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlclBsdWdpbklkcyA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcCk7XG4gIGNvbnN0IG1haW5QbHVnaW5JZCA9IEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlclBsdWdpbklkcy5rZXlzKCkpWzBdO1xuICBpZiAobWFpblBsdWdpbklkICE9PSBwbHVnaW5JZCkge1xuICAgIGNvbnNvbGUuZGVidWcoYCR7aGFuZGxlclR5cGV9IGhhbmRsZXIgZm9yIHBsdWdpbiAke3BsdWdpbklkfSBpcyBza2lwcGVkLCBiZWNhdXNlIGl0IGlzIGhhbmRsZWQgYnkgcGx1Z2luICR7bWFpblBsdWdpbklkID8/ICcobm9uZSknfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAoYXBwOiBBcHApOiBNYXA8c3RyaW5nLCAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4+IHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZShhcHAsICdyZW5hbWVEZWxldGVIYW5kbGVyc01hcCcsIG5ldyBNYXA8c3RyaW5nLCAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4+KCkpLnZhbHVlO1xufVxuXG5mdW5jdGlvbiBsb2dQbHVnaW5TZXR0aW5nc09yZGVyKGFwcDogQXBwKTogdm9pZCB7XG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAoYXBwKTtcbiAgY29uc29sZS5kZWJ1ZyhgUmVuYW1lL2RlbGV0ZSBoYW5kbGVycyB3aWxsIHVzZSBwbHVnaW4gc2V0dGluZ3MgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogJHtBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmtleXMoKSkuam9pbignLCAnKX1gKTtcbn1cblxuY29uc3Qgc3BlY2lhbFJlbmFtZXM6IFNwZWNpYWxSZW5hbWVbXSA9IFtdO1xuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVSZW5hbWUoYXBwOiBBcHAsIGZpbGU6IFRBYnN0cmFjdEZpbGUsIG9sZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zb2xlLmRlYnVnKGBIYW5kbGUgUmVuYW1lICR7b2xkUGF0aH0gLT4gJHtmaWxlLnBhdGh9YCk7XG5cbiAgaWYgKCEoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNwZWNpYWxSZW5hbWUgPSBzcGVjaWFsUmVuYW1lcy5maW5kKCh4KSA9PiB4Lm9sZFBhdGggPT09IGZpbGUucGF0aCk7XG4gIGlmIChzcGVjaWFsUmVuYW1lKSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LnJlbmFtZShmaWxlLCBzcGVjaWFsUmVuYW1lLnRlbXBQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYXBwLnZhdWx0LmFkYXB0ZXIuaW5zZW5zaXRpdmUgJiYgb2xkUGF0aC50b0xvd2VyQ2FzZSgpID09PSBmaWxlLnBhdGgudG9Mb3dlckNhc2UoKSAmJiBkaXJuYW1lKG9sZFBhdGgpID09PSBkaXJuYW1lKGZpbGUucGF0aCkpIHtcbiAgICBzcGVjaWFsUmVuYW1lcy5wdXNoKHtcbiAgICAgIG9sZFBhdGgsXG4gICAgICBuZXdQYXRoOiBmaWxlLnBhdGgsXG4gICAgICB0ZW1wUGF0aDogam9pbihmaWxlLnBhcmVudD8ucGF0aCA/PyAnJywgJ19fdGVtcF9fJyArIGZpbGUubmFtZSlcbiAgICB9KTtcblxuICAgIGF3YWl0IGFwcC52YXVsdC5yZW5hbWUoZmlsZSwgb2xkUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICBjb25zdCB1cGRhdGVBbGxMaW5rcyA9IGFwcC5maWxlTWFuYWdlci51cGRhdGVBbGxMaW5rcztcbiAgdHJ5IHtcbiAgICBhcHAuZmlsZU1hbmFnZXIudXBkYXRlQWxsTGlua3MgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfTtcblxuICAgIGNvbnN0IHJlbmFtZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgYXdhaXQgZmlsbFJlbmFtZU1hcChhcHAsIGZpbGUsIG9sZFBhdGgsIHJlbmFtZU1hcCk7XG4gICAgcmVuYW1lTWFwLnNldChvbGRQYXRoLCBmaWxlLnBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbb2xkUGF0aDIsIG5ld1BhdGgyXSBvZiByZW5hbWVNYXAuZW50cmllcygpKSB7XG4gICAgICBhd2FpdCBwcm9jZXNzUmVuYW1lKGFwcCwgb2xkUGF0aDIsIG5ld1BhdGgyLCByZW5hbWVNYXApO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhcHAuZmlsZU1hbmFnZXIudXBkYXRlQWxsTGlua3MgPSB1cGRhdGVBbGxMaW5rcztcblxuICAgIGNvbnN0IHNwZWNpYWxSZW5hbWUgPSBzcGVjaWFsUmVuYW1lcy5maW5kKCh4KSA9PiB4LnRlbXBQYXRoID09PSBmaWxlLnBhdGgpO1xuICAgIGlmIChzcGVjaWFsUmVuYW1lKSB7XG4gICAgICBhd2FpdCBhcHAudmF1bHQucmVuYW1lKGZpbGUsIHNwZWNpYWxSZW5hbWUubmV3UGF0aCk7XG4gICAgICBzcGVjaWFsUmVuYW1lcy5yZW1vdmUoc3BlY2lhbFJlbmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZURlbGV0ZShhcHA6IEFwcCwgZmlsZTogVEFic3RyYWN0RmlsZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zb2xlLmRlYnVnKGBIYW5kbGUgRGVsZXRlICR7ZmlsZS5wYXRofWApO1xuICBpZiAoIWlzTm90ZShmaWxlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwLCBmaWxlLnBhdGgpO1xuICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gYXBwLnZhdWx0LmdldEZvbGRlckJ5UGF0aChhdHRhY2htZW50Rm9sZGVyUGF0aCk7XG5cbiAgaWYgKCFhdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlT3JwaGFuQXR0YWNobWVudHMpIHtcbiAgICBhd2FpdCBkZWxldGVTYWZlKGFwcCwgYXR0YWNobWVudEZvbGRlciwgZmlsZS5wYXRoLCBmYWxzZSwgc2V0dGluZ3Muc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaWxsUmVuYW1lTWFwKGFwcDogQXBwLCBmaWxlOiBURmlsZSwgb2xkUGF0aDogc3RyaW5nLCByZW5hbWVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc05vdGUoZmlsZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKGFwcCk7XG5cbiAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHAsIG9sZFBhdGgpO1xuICBjb25zdCBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCA9IHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXJcbiAgICA/IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKGFwcCwgZmlsZS5wYXRoKVxuICAgIDogb2xkQXR0YWNobWVudEZvbGRlclBhdGg7XG4gIGNvbnN0IGR1bW15T2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHAsIGpvaW4oZGlybmFtZShvbGRQYXRoKSwgJ0RVTU1ZX0ZJTEUubWQnKSk7XG5cbiAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlciA9IGFwcC52YXVsdC5nZXRGb2xkZXJCeVBhdGgob2xkQXR0YWNobWVudEZvbGRlclBhdGgpO1xuXG4gIGlmICghb2xkQXR0YWNobWVudEZvbGRlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gbmV3QXR0YWNobWVudEZvbGRlclBhdGggJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNoaWxkcmVuOiBURmlsZVtdID0gW107XG5cbiAgaWYgKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSBkdW1teU9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKSB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBmaWxlKTtcbiAgICBpZiAoIWNhY2hlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgbGluayBvZiBnZXRBbGxMaW5rcyhjYWNoZSkpIHtcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKGFwcCwgbGluaywgb2xkUGF0aCk7XG4gICAgICBpZiAoIWF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXR0YWNobWVudEZpbGUucGF0aC5zdGFydHNXaXRoKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKSkge1xuICAgICAgICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShhcHAsIGF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgaWYgKGJhY2tsaW5rcy5rZXlzKCkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgY2hpbGRyZW4ucHVzaChhdHRhY2htZW50RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKG9sZEF0dGFjaG1lbnRGb2xkZXIsIChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBvbGROb3RlQmFzZU5hbWUgPSBiYXNlbmFtZShvbGRQYXRoLCBleHRuYW1lKG9sZFBhdGgpKTtcblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgaWYgKGlzTm90ZShjaGlsZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCwgY2hpbGQucGF0aCk7XG4gICAgY29uc3QgbmV3RGlyID0gam9pbihuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCwgZGlybmFtZShyZWxhdGl2ZVBhdGgpKTtcbiAgICBjb25zdCBuZXdDaGlsZEJhc2VuYW1lID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzXG4gICAgICA/IGNoaWxkLmJhc2VuYW1lLnJlcGxhY2VBbGwob2xkTm90ZUJhc2VOYW1lLCBmaWxlLmJhc2VuYW1lKVxuICAgICAgOiBjaGlsZC5iYXNlbmFtZTtcbiAgICBsZXQgbmV3Q2hpbGRQYXRoID0gam9pbihuZXdEaXIsIG1ha2VGaWxlTmFtZShuZXdDaGlsZEJhc2VuYW1lLCBjaGlsZC5leHRlbnNpb24pKTtcbiAgICBpZiAoY2hpbGQucGF0aCAhPT0gbmV3Q2hpbGRQYXRoKSB7XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgICBjb25zdCBuZXdDaGlsZEZpbGUgPSBhcHAudmF1bHQuZ2V0RmlsZUJ5UGF0aChuZXdDaGlsZFBhdGgpO1xuICAgICAgICBpZiAobmV3Q2hpbGRGaWxlKSB7XG4gICAgICAgICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnRyYXNoRmlsZShuZXdDaGlsZEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdDaGlsZFBhdGggPSBhcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChqb2luKG5ld0RpciwgbmV3Q2hpbGRCYXNlbmFtZSksIGNoaWxkLmV4dGVuc2lvbik7XG4gICAgICB9XG4gICAgICByZW5hbWVNYXAuc2V0KGNoaWxkLnBhdGgsIG5ld0NoaWxkUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NSZW5hbWUoYXBwOiBBcHAsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nLCByZW5hbWVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBsZXQgb2xkRmlsZSA9IGFwcC52YXVsdC5nZXRGaWxlQnlQYXRoKG9sZFBhdGgpO1xuICBsZXQgbmV3RmlsZSA9IGFwcC52YXVsdC5nZXRGaWxlQnlQYXRoKG5ld1BhdGgpO1xuXG4gIGlmIChvbGRGaWxlKSB7XG4gICAgYXdhaXQgY3JlYXRlRm9sZGVyU2FmZShhcHAsIGRpcm5hbWUobmV3UGF0aCkpO1xuICAgIGNvbnN0IG9sZEZvbGRlciA9IG9sZEZpbGUucGFyZW50O1xuICAgIHRyeSB7XG4gICAgICBpZiAobmV3RmlsZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGFwcC5maWxlTWFuYWdlci50cmFzaEZpbGUobmV3RmlsZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChuZXdQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IGFwcC52YXVsdC5yZW5hbWUob2xkRmlsZSwgbmV3UGF0aCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCFhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG5ld1BhdGgpIHx8IGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgob2xkUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnNob3VsZERlbGV0ZUVtcHR5Rm9sZGVycykge1xuICAgICAgYXdhaXQgZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHkoYXBwLCBvbGRGb2xkZXIpO1xuICAgIH1cbiAgfVxuXG4gIG9sZEZpbGUgPSBjcmVhdGVURmlsZUluc3RhbmNlKGFwcC52YXVsdCwgb2xkUGF0aCk7XG4gIG5ld0ZpbGUgPSBhcHAudmF1bHQuZ2V0RmlsZUJ5UGF0aChuZXdQYXRoKTtcblxuICBpZiAoIW9sZEZpbGUuZGVsZXRlZCB8fCAhbmV3RmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHJlbmFtZSAke29sZFBhdGh9IHRvICR7bmV3UGF0aH1gKTtcbiAgfVxuXG4gIGlmICghc2V0dGluZ3Muc2hvdWxkVXBkYXRlTGlua3MpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NNYXAoYXBwLCBbb2xkRmlsZSwgbmV3RmlsZV0pO1xuXG4gIGZvciAoY29uc3QgcGFyZW50Tm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgIGxldCBwYXJlbnROb3RlID0gYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgocGFyZW50Tm90ZVBhdGgpO1xuICAgIGlmICghcGFyZW50Tm90ZSkge1xuICAgICAgY29uc3QgbmV3UGFyZW50Tm90ZVBhdGggPSByZW5hbWVNYXAuZ2V0KHBhcmVudE5vdGVQYXRoKTtcbiAgICAgIGlmIChuZXdQYXJlbnROb3RlUGF0aCkge1xuICAgICAgICBwYXJlbnROb3RlID0gYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgobmV3UGFyZW50Tm90ZVBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGFyZW50Tm90ZSkge1xuICAgICAgY29uc29sZS53YXJuKGBQYXJlbnQgbm90ZSBub3QgZm91bmQ6ICR7cGFyZW50Tm90ZVBhdGh9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBhd2FpdCBhcHBseUZpbGVDaGFuZ2VzKGFwcCwgcGFyZW50Tm90ZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzTWFwKGFwcCwgW29sZEZpbGUsIG5ld0ZpbGVdKTtcbiAgICAgIGNvbnN0IGxpbmtzID0gYmFja2xpbmtzLmdldChwYXJlbnROb3RlUGF0aCkgPz8gW107XG4gICAgICBjb25zdCBjaGFuZ2VzID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0SW5kZXg6IGxpbmsucG9zaXRpb24uc3RhcnQub2Zmc2V0LFxuICAgICAgICAgIGVuZEluZGV4OiBsaW5rLnBvc2l0aW9uLmVuZC5vZmZzZXQsXG4gICAgICAgICAgb2xkQ29udGVudDogbGluay5vcmlnaW5hbCxcbiAgICAgICAgICBuZXdDb250ZW50OiB1cGRhdGVMaW5rKHtcbiAgICAgICAgICAgIGFwcDogYXBwLFxuICAgICAgICAgICAgbGluayxcbiAgICAgICAgICAgIHBhdGhPckZpbGU6IG5ld0ZpbGUsXG4gICAgICAgICAgICBvbGRQYXRoT3JGaWxlOiBvbGRQYXRoLFxuICAgICAgICAgICAgc291cmNlUGF0aE9yRmlsZTogcGFyZW50Tm90ZSxcbiAgICAgICAgICAgIHJlbmFtZU1hcCxcbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlc1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2hhbmdlcztcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3RmlsZSkpIHtcbiAgICBhd2FpdCBwcm9jZXNzV2l0aFJldHJ5KGFwcCwgbmV3RmlsZSwgKGNvbnRlbnQpID0+IHtcbiAgICAgIGNvbnN0IGNhbnZhc0RhdGEgPSBKU09OLnBhcnNlKGNvbnRlbnQpIGFzIENhbnZhc0RhdGE7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgY2FudmFzRGF0YS5ub2Rlcykge1xuICAgICAgICBpZiAobm9kZS50eXBlICE9PSAnZmlsZScpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdQYXRoID0gcmVuYW1lTWFwLmdldChub2RlLmZpbGUpO1xuICAgICAgICBpZiAoIW5ld1BhdGgpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLmZpbGUgPSBuZXdQYXRoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvSnNvbihjYW52YXNEYXRhKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc01hcmtkb3duRmlsZShuZXdGaWxlKSkge1xuICAgIGF3YWl0IHVwZGF0ZUxpbmtzSW5GaWxlKHtcbiAgICAgIGFwcDogYXBwLFxuICAgICAgcGF0aE9yRmlsZTogbmV3RmlsZSxcbiAgICAgIG9sZFBhdGhPckZpbGU6IG9sZFBhdGgsXG4gICAgICByZW5hbWVNYXAsXG4gICAgICBzaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzZXNcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTZXR0aW5ncyhhcHA6IEFwcCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAoYXBwKTtcbiAgY29uc3Qgc2V0dGluZ3NCdWlsZGVycyA9IEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAudmFsdWVzKCkpLnJldmVyc2UoKTtcblxuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+ID0ge307XG4gIGZvciAoY29uc3Qgc2V0dGluZ3NCdWlsZGVyIG9mIHNldHRpbmdzQnVpbGRlcnMpIHtcbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHNldHRpbmdzQnVpbGRlcigpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG5ld1NldHRpbmdzKSBhcyBba2V5b2YgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLCBib29sZWFuXVtdKSB7XG4gICAgICBzZXR0aW5nc1trZXldIHx8PSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2V0dGluZ3M7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBLHNCQUlPO0FBRVAsNkJBQW9DO0FBRXBDLG9CQUF1QjtBQUN2QixrQkFPTztBQUNQLGlCQUF5QztBQUN6Qyw0QkFBd0M7QUFDeEMsNEJBQTZCO0FBQzdCLGtCQUlPO0FBQ1AsMkJBS087QUFDUCwyQkFJTztBQUNQLG1CQU1PO0FBcERQLElBQUksb0JBQW9CLFdBQVcsaUJBQWlCLE1BQU0sTUFBSTtBQUFDLE1BQUcsT0FBTyxlQUFhLFVBQVM7QUFBQyxXQUFPLElBQUksSUFBSSxPQUFPLFNBQVMsSUFBSTtBQUFBLEVBQUM7QUFBQyxTQUFPLFFBQVEsVUFBVSxFQUFFLGNBQWMsVUFBVTtBQUFDLEdB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QUFBQSxVQUNYLFlBQVksS0FBSyxTQUFTLE1BQU07QUFBQSxVQUNoQyxVQUFVLEtBQUssU0FBUyxJQUFJO0FBQUEsVUFDNUIsWUFBWSxLQUFLO0FBQUEsVUFDakIsZ0JBQVksd0JBQVc7QUFBQSxZQUNyQjtBQUFBLFlBQ0E7QUFBQSxZQUNBLFlBQVk7QUFBQSxZQUNaLGVBQWU7QUFBQSxZQUNmLGtCQUFrQjtBQUFBLFlBQ2xCO0FBQUEsWUFDQSwyQkFBMkIsU0FBUztBQUFBLFVBQ3RDLENBQUM7QUFBQSxRQUNILENBQUM7QUFBQSxNQUNIO0FBRUEsYUFBTztBQUFBLElBQ1QsQ0FBQztBQUFBLEVBQ0g7QUFFQSxVQUFJLG1DQUFhLE9BQU8sR0FBRztBQUN6QixjQUFNLCtCQUFpQixLQUFLLFNBQVMsQ0FBQyxZQUFZO0FBQ2hELFlBQU0sYUFBYSxLQUFLLE1BQU0sT0FBTztBQUNyQyxpQkFBVyxRQUFRLFdBQVcsT0FBTztBQUNuQyxZQUFJLEtBQUssU0FBUyxRQUFRO0FBQ3hCO0FBQUEsUUFDRjtBQUNBLGNBQU1DLFdBQVUsVUFBVSxJQUFJLEtBQUssSUFBSTtBQUN2QyxZQUFJLENBQUNBLFVBQVM7QUFDWjtBQUFBLFFBQ0Y7QUFDQSxhQUFLLE9BQU9BO0FBQUEsTUFDZDtBQUNBLGlCQUFPLHNCQUFPLFVBQVU7QUFBQSxJQUMxQixDQUFDO0FBQUEsRUFDSCxlQUFXLHFDQUFlLE9BQU8sR0FBRztBQUNsQyxjQUFNLCtCQUFrQjtBQUFBLE1BQ3RCO0FBQUEsTUFDQSxZQUFZO0FBQUEsTUFDWixlQUFlO0FBQUEsTUFDZjtBQUFBLE1BQ0EsMkJBQTJCLFNBQVM7QUFBQSxJQUN0QyxDQUFDO0FBQUEsRUFDSDtBQUNGO0FBRUEsU0FBUyxZQUFZLEtBQWdEO0FBQ25FLFFBQU0sMEJBQTBCLDJCQUEyQixHQUFHO0FBQzlELFFBQU0sbUJBQW1CLE1BQU0sS0FBSyx3QkFBd0IsT0FBTyxDQUFDLEVBQUUsUUFBUTtBQUU5RSxRQUFNLFdBQWlELENBQUM7QUFDeEQsYUFBVyxtQkFBbUIsa0JBQWtCO0FBQzlDLFVBQU0sY0FBYyxnQkFBZ0I7QUFDcEMsZUFBVyxDQUFDLEtBQUssS0FBSyxLQUFLLE9BQU8sUUFBUSxXQUFXLEdBQXFEO0FBQ3hHLGVBQVMsR0FBRyxNQUFNO0FBQUEsSUFDcEI7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJzcGVjaWFsUmVuYW1lIiwgImJhY2tsaW5rcyIsICJuZXdQYXRoIl0KfQo=