UNPKG

obsidian-dev-utils

Version:

This is the collection of useful functions that you can use for your Obsidian plugin development

878 lines (865 loc) 118 kB
/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ (function initCjs() { const globalThisRecord = globalThis; globalThisRecord['__name'] ??= name; const originalRequire = require; if (originalRequire && !originalRequire.__isPatched) { // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function. require = Object.assign( (id) => requirePatched(id), originalRequire, { __isPatched: true } ); } const newFuncs = { __extractDefault() { return extractDefault; }, process() { const browserProcess = { browser: true, cwd() { return '/'; }, env: {}, platform: 'android' }; return browserProcess; } }; for (const key of Object.keys(newFuncs)) { globalThisRecord[key] ??= newFuncs[key]?.(); } function name(obj) { return obj; } function extractDefault(module) { return module && module.__esModule && 'default' in module ? module.default : module; } const OBSIDIAN_BUILT_IN_MODULE_NAMES = [ 'obsidian', '@codemirror/autocomplete', '@codemirror/collab', '@codemirror/commands', '@codemirror/language', '@codemirror/lint', '@codemirror/search', '@codemirror/state', '@codemirror/text', '@codemirror/view', '@lezer/common', '@lezer/lr', '@lezer/highlight']; const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [ '@codemirror/closebrackets', '@codemirror/comment', '@codemirror/fold', '@codemirror/gutter', '@codemirror/highlight', '@codemirror/history', '@codemirror/matchbrackets', '@codemirror/panel', '@codemirror/rangeset', '@codemirror/rectangular-selection', '@codemirror/stream-parser', '@codemirror/tooltip']; function requirePatched(id) { if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) { return originalRequire?.(id); } // eslint-disable-next-line @typescript-eslint/no-deprecated, @typescript-eslint/no-unnecessary-condition -- We need access to app here which might not be available yet. if (globalThis?.app?.isMobile) { if (id === 'process' || id === 'node:process') { console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`); return globalThis.process; } } else { const module = originalRequire?.(id); if (module) { return extractDefault(module); } } console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`); return {}; } })(); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Link_exports = {}; __export(Link_exports, { LinkPathStyle: () => LinkPathStyle, LinkStyle: () => LinkStyle, convertLink: () => convertLink, editBacklinks: () => editBacklinks, editLinks: () => editLinks, editLinksInContent: () => editLinksInContent, encodeUrl: () => encodeUrl, escapeAlias: () => escapeAlias, extractLinkFile: () => extractLinkFile, fixFrontmatterMarkdownLinks: () => fixFrontmatterMarkdownLinks, generateMarkdownLink: () => generateMarkdownLink, generateRawMarkdownLink: () => generateRawMarkdownLink, parseLink: () => parseLink, parseLinks: () => parseLinks, registerGenerateMarkdownLinkDefaultOptionsFn: () => registerGenerateMarkdownLinkDefaultOptionsFn, shouldResetAlias: () => shouldResetAlias, splitSubpath: () => splitSubpath, testAngleBrackets: () => testAngleBrackets, testEmbed: () => testEmbed, testLeadingDot: () => testLeadingDot, testLeadingSlash: () => testLeadingSlash, testWikilink: () => testWikilink, unescapeAlias: () => unescapeAlias, updateLink: () => updateLink, updateLinksInContent: () => updateLinksInContent, updateLinksInFile: () => updateLinksInFile }); module.exports = __toCommonJS(Link_exports); var import_obsidian = require('obsidian'); var import_implementations = require('obsidian-typings/implementations'); var import_remark = require('remark'); var import_remark_parse = __toESM(__extractDefault(require('remark-parse')), 1); var import_remark_wiki_link = require('remark-wiki-link'); var import_unist_util_visit = require('unist-util-visit'); var import_AbortController = require('../AbortController.cjs'); var import_ObjectUtils = require('../ObjectUtils.cjs'); var import_Path = require('../Path.cjs'); var import_String = require('../String.cjs'); var import_url = require('../url.cjs'); var import_App = require('./App.cjs'); var import_FileChange = require('./FileChange.cjs'); var import_FileSystem = require('./FileSystem.cjs'); var import_MetadataCache = require('./MetadataCache.cjs'); var import_ObsidianSettings = require('./ObsidianSettings.cjs'); var import_Reference = require('./Reference.cjs'); const ESCAPED_WIKILINK_DIVIDER = "\\|"; const SPECIAL_LINK_SYMBOLS_REGEXP = /[\\\x00\x08\x0B\x0C\x0E-\x1F ]/g; const SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX = /[\\[\]<>_*~=`$]/g; const UNESCAPED_WIKILINK_DIVIDER_REGEXP = /(?<!\\)\|/g; const WIKILINK_DIVIDER = "|"; var LinkPathStyle = /* @__PURE__ */ ((LinkPathStyle2) => { LinkPathStyle2["AbsolutePathInVault"] = "AbsolutePathInVault"; LinkPathStyle2["ObsidianSettingsDefault"] = "ObsidianSettingsDefault"; LinkPathStyle2["RelativePathToTheSource"] = "RelativePathToTheSource"; LinkPathStyle2["ShortestPathWhenPossible"] = "ShortestPathWhenPossible"; return LinkPathStyle2; })(LinkPathStyle || {}); var LinkStyle = /* @__PURE__ */ ((LinkStyle2) => { LinkStyle2["Markdown"] = "Markdown"; LinkStyle2["ObsidianSettingsDefault"] = "ObsidianSettingsDefault"; LinkStyle2["PreserveExisting"] = "PreserveExisting"; LinkStyle2["Wikilink"] = "Wikilink"; return LinkStyle2; })(LinkStyle || {}); function convertLink(options) { const targetFile = extractLinkFile(options.app, options.link, options.oldSourcePathOrFile ?? options.newSourcePathOrFile); if (!targetFile) { return options.link.original; } return updateLink((0, import_ObjectUtils.normalizeOptionalProperties)({ app: options.app, link: options.link, linkStyle: options.linkStyle, newSourcePathOrFile: options.newSourcePathOrFile, newTargetPathOrFile: targetFile, oldSourcePathOrFile: options.oldSourcePathOrFile, shouldUpdateFileNameAlias: options.shouldUpdateFileNameAlias })); } async function editBacklinks(app, pathOrFile, linkConverter, processOptions = {}) { const backlinks = await (0, import_MetadataCache.getBacklinksForFileSafe)(app, pathOrFile, processOptions); for (const backlinkNotePath of backlinks.keys()) { const currentLinks = backlinks.get(backlinkNotePath) ?? []; const linkJsons = new Set(currentLinks.map((link) => (0, import_ObjectUtils.toJson)(link))); await editLinks(app, backlinkNotePath, (link) => { const linkJson = (0, import_ObjectUtils.toJson)(link); if (!linkJsons.has(linkJson)) { return; } return linkConverter(link); }, processOptions); } } async function editLinks(app, pathOrFile, linkConverter, processOptions = {}) { await (0, import_FileChange.applyFileChanges)(app, pathOrFile, async (abortSignal, content) => { const cache = await (0, import_MetadataCache.getCacheSafe)(app, pathOrFile); abortSignal.throwIfAborted(); const file = (0, import_FileSystem.getFile)(app, pathOrFile); const cachedContent = await app.vault.cachedRead(file); abortSignal.throwIfAborted(); if (content !== cachedContent) { return null; } return await getFileChanges(cache, (0, import_FileSystem.isCanvasFile)(app, pathOrFile), linkConverter, abortSignal); }, processOptions); } async function editLinksInContent(app, content, linkConverter, abortSignal) { abortSignal ??= (0, import_AbortController.abortSignalNever)(); abortSignal.throwIfAborted(); const newContent = await (0, import_FileChange.applyContentChanges)(abortSignal, content, "", async () => { const cache = await (0, import_MetadataCache.parseMetadata)(app, content); abortSignal.throwIfAborted(); const changes = await getFileChanges(cache, false, linkConverter, abortSignal); abortSignal.throwIfAborted(); return changes; }); abortSignal.throwIfAborted(); if (newContent === null) { throw new Error("Failed to update links in content"); } return newContent; } function encodeUrl(url) { return (0, import_String.replaceAll)(url, SPECIAL_LINK_SYMBOLS_REGEXP, ({ substring: specialLinkSymbol }) => encodeURIComponent(specialLinkSymbol)); } function escapeAlias(alias) { return (0, import_String.replaceAll)(alias, SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX, "\\$&"); } function extractLinkFile(app, link, sourcePathOrFile, shouldAllowNonExistingFile = false) { const { linkPath } = splitSubpath(link.link); const sourcePath = (0, import_FileSystem.getPath)(app, sourcePathOrFile); const file = app.metadataCache.getFirstLinkpathDest(linkPath, sourcePath); if (file) { return file; } if (!shouldAllowNonExistingFile) { return null; } if (linkPath.startsWith("/")) { return (0, import_FileSystem.getFile)(app, linkPath, true); } const fullLinkPath = (0, import_Path.join)((0, import_Path.dirname)(sourcePath), `./${linkPath}`); if (fullLinkPath.startsWith("../")) { return null; } return (0, import_FileSystem.getFile)(app, fullLinkPath, true); } function fixFrontmatterMarkdownLinks(cache) { return _fixFrontmatterMarkdownLinks(cache.frontmatter, "", cache); } function generateMarkdownLink(options) { const { app } = options; const DEFAULT_OPTIONS = { isEmptyEmbedAliasAllowed: true }; const customDefaultOptions = getGenerateMarkdownLinkDefaultOptionsFns(app).map((defaultOptionsFn) => defaultOptionsFn()); options = Object.assign({}, DEFAULT_OPTIONS, ...customDefaultOptions, options); const targetFile = (0, import_FileSystem.getFile)(app, options.targetPathOrFile, options.isNonExistingFileAllowed); return (0, import_MetadataCache.tempRegisterFilesAndRun)(app, [targetFile], () => generateMarkdownLinkImpl(options)); } function generateRawMarkdownLink(options) { const embedPrefix = options.isEmbed ? "!" : ""; if (options.isWikilink) { const aliasPart = options.alias ? `|${options.alias}` : ""; return `${embedPrefix}[[${options.url}${aliasPart}]]`; } const alias = options.alias ?? ""; const shouldEscapeAlias = options.shouldEscapeAlias ?? false; const escapedAlias = shouldEscapeAlias ? escapeAlias(alias) : alias; const url = options.shouldUseAngleBrackets ? `<${options.url}>` : encodeUrl(options.url); const titlePart = options.title ? ` ${JSON.stringify(options.title)}` : ""; return `${embedPrefix}[${escapedAlias}](${url}${titlePart})`; } function parseLink(str) { const links = parseLinks(str); return links[0]?.raw === str ? links[0] : null; } function parseLinks(str) { const embedSymbolOffsets = /* @__PURE__ */ new Set(); const EMBED_LINK_PREFIX = "!["; const NO_EMBED_LINK_PREFIX = "@["; const DUMMY_CHARACTER = "@"; const EMBED_INSIDE_LINK_REG_EXP = /\[(?<LinkAlias>!\[.*?\]\(.+?\))\]\((?<Link>.+?)\)/g; const noInsideEmbedsLinksStr = (0, import_String.replaceAll)(str, EMBED_INSIDE_LINK_REG_EXP, (_, linkAlias, link) => { const dummyAlias = DUMMY_CHARACTER.repeat(linkAlias.length); return `[${dummyAlias}](${link})`; }); const noEmbedStr = (0, import_String.replaceAll)(noInsideEmbedsLinksStr, EMBED_LINK_PREFIX, (args) => { embedSymbolOffsets.add(args.offset); return NO_EMBED_LINK_PREFIX; }); const processor = (0, import_remark.remark)().use(import_remark_parse.default).use(import_remark_wiki_link.wikiLinkPlugin, { aliasDivider: WIKILINK_DIVIDER }); const root = processor.parse(noEmbedStr); const links = []; const textLinks = []; (0, import_unist_util_visit.visit)(root, (node) => { let link; switch (node.type) { case "link": link = parseLinkNode(node, str); break; case "wikiLink": link = parseWikilinkNode(node, str); break; default: return; } if (embedSymbolOffsets.has(link.startOffset - 1)) { link.isEmbed = true; link.startOffset--; link.raw = `!${link.raw}`; } links.push(link); }); links.sort((a, b) => a.startOffset - b.startOffset); let textStartOffset = 0; for (const link of links) { extractTextLinks(str, textStartOffset, link.startOffset - 1, textLinks); textStartOffset = link.endOffset + 1; } extractTextLinks(str, textStartOffset, str.length - 1, textLinks); links.push(...textLinks); links.sort((a, b) => a.startOffset - b.startOffset); return links; } function registerGenerateMarkdownLinkDefaultOptionsFn(plugin, fn) { const generateMarkdownLinkDefaultOptionsFns = getGenerateMarkdownLinkDefaultOptionsFns(plugin.app); generateMarkdownLinkDefaultOptionsFns.push(fn); plugin.register(() => { generateMarkdownLinkDefaultOptionsFns.remove(fn); }); } function shouldResetAlias(options) { const { app, displayText, isWikilink, newSourcePathOrFile, oldSourcePathOrFile, oldTargetPath, targetPathOrFile } = options; if (isWikilink === false) { return false; } if (!displayText) { return true; } const targetFile = (0, import_FileSystem.getFile)(app, targetPathOrFile, true); const newSourcePath = (0, import_FileSystem.getPath)(app, newSourcePathOrFile); const oldSourcePath = (0, import_FileSystem.getPath)(app, oldSourcePathOrFile ?? newSourcePathOrFile); const newSourceFolder = (0, import_Path.dirname)(newSourcePath); const oldSourceFolder = (0, import_Path.dirname)(oldSourcePath); const aliasesToReset = /* @__PURE__ */ new Set(); for (const pathOrFile of [targetFile.path, oldTargetPath]) { if (!pathOrFile) { continue; } const path = (0, import_FileSystem.getPath)(app, pathOrFile); aliasesToReset.add(path); aliasesToReset.add((0, import_Path.basename)(path)); aliasesToReset.add((0, import_Path.relative)(newSourceFolder, path)); aliasesToReset.add((0, import_Path.relative)(oldSourceFolder, path)); } for (const sourcePath of [oldSourcePath, newSourcePath]) { aliasesToReset.add(app.metadataCache.fileToLinktext(targetFile, sourcePath, false)); } const cleanDisplayText = (0, import_String.replaceAll)((0, import_obsidian.normalizePath)(displayText.split(" > ")[0] ?? ""), /^\.\//g, "").toLowerCase(); for (const alias of aliasesToReset) { if (alias.toLowerCase() === cleanDisplayText) { return true; } const folder = (0, import_Path.dirname)(alias); const base = (0, import_Path.basename)(alias, (0, import_Path.extname)(alias)); if ((0, import_Path.join)(folder, base).toLowerCase() === cleanDisplayText) { return true; } } return false; } function splitSubpath(link) { const parsed = (0, import_obsidian.parseLinktext)((0, import_String.normalize)(link)); return { linkPath: parsed.path, subpath: parsed.subpath }; } function testAngleBrackets(link) { const parseLinkResult = parseLink(link); return parseLinkResult?.hasAngleBrackets ?? false; } function testEmbed(link) { const parseLinkResult = parseLink(link); return parseLinkResult?.isEmbed ?? false; } function testLeadingDot(link) { const parseLinkResult = parseLink(link); return parseLinkResult?.url.startsWith("./") ?? false; } function testLeadingSlash(link) { const parseLinkResult = parseLink(link); return parseLinkResult?.url.startsWith("/") ?? false; } function testWikilink(link) { const parseLinkResult = parseLink(link); return parseLinkResult?.isWikilink ?? false; } function unescapeAlias(escapedAlias) { return (0, import_String.replaceAll)(escapedAlias, /(?<Backslashes>\\+)(?<SpecialCharacter>[!"#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~])/g, (_, backslashes, specialChar) => { const ESCAPED_BACKSLASH_LENGTH = 2; const backslashCount = backslashes.length; const keepCount = Math.floor(backslashCount / ESCAPED_BACKSLASH_LENGTH); return "\\".repeat(keepCount) + specialChar; }); } function updateLink(options) { const { app, link, linkStyle, newSourcePathOrFile, newTargetPathOrFile, oldSourcePathOrFile, oldTargetPathOrFile, shouldUpdateFileNameAlias } = options; if (!newTargetPathOrFile) { return link.original; } const newTargetFile = (0, import_FileSystem.getFile)(app, newTargetPathOrFile, true); const oldSourcePath = (0, import_FileSystem.getPath)(app, oldSourcePathOrFile ?? newSourcePathOrFile); const oldTargetPath = (0, import_FileSystem.getPath)(app, oldTargetPathOrFile ?? newTargetPathOrFile); const isWikilink = shouldUseWikilinkStyle(app, link.original, linkStyle); const { subpath } = splitSubpath(link.link); let shouldKeepAlias = !shouldUpdateFileNameAlias; if ((0, import_FileSystem.isCanvasFile)(app, newSourcePathOrFile)) { if ((0, import_Reference.isCanvasFileNodeReference)(link)) { return newTargetFile.path + subpath; } } const parseLinkResult = parseLink(link.original); let alias; if (isWikilink && parseLinkResult?.alias) { alias = parseLinkResult.alias; shouldKeepAlias = true; } alias ??= shouldResetAlias((0, import_ObjectUtils.normalizeOptionalProperties)({ app, displayText: link.displayText, isWikilink, newSourcePathOrFile, oldSourcePathOrFile, oldTargetPath, targetPathOrFile: newTargetFile })) ? void 0 : parseLinkResult?.alias; if (!shouldKeepAlias) { if (alias === (0, import_Path.basename)(oldTargetPath, (0, import_Path.extname)(oldTargetPath))) { alias = newTargetFile.basename; } else if (alias === (0, import_Path.basename)(oldTargetPath)) { alias = newTargetFile.name; } } const newLink = generateMarkdownLink((0, import_ObjectUtils.normalizeOptionalProperties)({ alias, app, isSingleSubpathAllowed: oldSourcePath === oldTargetPath && !!parseLinkResult?.alias, linkStyle, originalLink: link.original, sourcePathOrFile: newSourcePathOrFile, subpath, targetPathOrFile: newTargetFile })); return newLink; } async function updateLinksInContent(options) { const { app, content, linkStyle, newSourcePathOrFile, oldSourcePathOrFile, shouldUpdateEmbedOnlyLinks, shouldUpdateFileNameAlias } = options; return await editLinksInContent(app, content, (link) => { const isEmbedLink = testEmbed(link.original); if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) { return; } return convertLink((0, import_ObjectUtils.normalizeOptionalProperties)({ app, link, linkStyle, newSourcePathOrFile, oldSourcePathOrFile, shouldUpdateFileNameAlias })); }); } async function updateLinksInFile(options) { const { app, linkStyle, newSourcePathOrFile, oldSourcePathOrFile, shouldUpdateEmbedOnlyLinks, shouldUpdateFileNameAlias } = options; if ((0, import_FileSystem.isCanvasFile)(app, newSourcePathOrFile) && !app.internalPlugins.getEnabledPluginById(import_implementations.InternalPluginName.Canvas)) { return; } await editLinks(app, newSourcePathOrFile, (link) => { const isEmbedLink = testEmbed(link.original); if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) { return; } return convertLink((0, import_ObjectUtils.normalizeOptionalProperties)({ app, link, linkStyle, newSourcePathOrFile, oldSourcePathOrFile, shouldUpdateFileNameAlias })); }, options); } function _fixFrontmatterMarkdownLinks(value, key, cache) { if (typeof value === "string") { const parseLinkResult = parseLink(value); if (!parseLinkResult || parseLinkResult.isWikilink || parseLinkResult.isExternal) { return false; } cache.frontmatterLinks ??= []; let link = cache.frontmatterLinks.find((frontmatterLink) => frontmatterLink.key === key); if (!link) { link = { key, link: "", original: "" }; cache.frontmatterLinks.push(link); } link.link = parseLinkResult.url; link.original = value; if (parseLinkResult.alias !== void 0) { link.displayText = parseLinkResult.alias; } return true; } if (typeof value !== "object" || value === null) { return false; } let hasFrontmatterLinks = false; for (const [childKey, childValue] of Object.entries(value)) { const hasChildFrontmatterLinks = _fixFrontmatterMarkdownLinks(childValue, key ? `${key}.${childKey}` : childKey, cache); hasFrontmatterLinks ||= hasChildFrontmatterLinks; } return hasFrontmatterLinks; } function decodeUrlSafely(url, isExternal, hasAngleBrackets) { if (isExternal || hasAngleBrackets) { return url; } try { return decodeURIComponent(url); } catch (error) { console.error(`Failed to decode URL ${url}`, error); return url; } } function extractAlias(str, aliasStartOffset, aliasEndOffset) { return aliasStartOffset < aliasEndOffset ? str.slice(aliasStartOffset, aliasEndOffset) : void 0; } function extractTextLinks(str, startOffset, endOffset, textLinks) { if (startOffset > endOffset) { return; } const textPart = str.slice(startOffset, endOffset + 1); (0, import_String.replaceAll)(textPart, /(?<Url>\S+)/g, (args, url) => { if (!(0, import_url.isUrl)(url)) { return; } textLinks.push({ encodedUrl: encodeUrl(url), endOffset: startOffset + args.offset + url.length, hasAngleBrackets: false, isEmbed: false, isExternal: true, isWikilink: false, raw: url, startOffset: startOffset + args.offset, url }); }); } function generateLinkText(app, targetFile, sourcePath, subpath, config) { if (sourcePath === "/") { sourcePath = ""; } let linkText; if (targetFile.path === sourcePath && subpath && config.isSingleSubpathAllowed) { linkText = ""; } else { switch (config.linkPathStyle) { case "AbsolutePathInVault" /* AbsolutePathInVault */: linkText = targetFile.path; if (config.shouldUseLeadingSlashForAbsolutePaths && !linkText.startsWith("/")) { linkText = `/${linkText}`; } break; case "RelativePathToTheNote" /* RelativePathToTheSource */: linkText = (0, import_Path.relative)((0, import_Path.dirname)(sourcePath), targetFile.path); if (config.shouldUseLeadingDotForRelativePaths && !linkText.startsWith(".")) { linkText = `./${linkText}`; } break; case "ShortestPathWhenPossible" /* ShortestPathWhenPossible */: { const shortestName = (0, import_FileSystem.isMarkdownFile)(app, targetFile) ? targetFile.basename : targetFile.name; const matchedFiles = app.metadataCache.getLinkpathDest(shortestName, sourcePath); linkText = matchedFiles.length === 1 && matchedFiles[0] === targetFile ? targetFile.name : targetFile.path; break; } default: throw new Error(`Invalid link path style: ${config.linkPathStyle}.`); } } linkText = config.isWikilink ? (0, import_String.trimEnd)(linkText, `.${import_FileSystem.MARKDOWN_FILE_EXTENSION}`) : linkText; linkText += subpath; return linkText; } function generateMarkdownLinkImpl(options) { const { app } = options; const targetFile = (0, import_FileSystem.getFile)(app, options.targetPathOrFile, options.isNonExistingFileAllowed); const sourcePath = (0, import_FileSystem.getPath)(app, options.sourcePathOrFile); const subpath = options.subpath ?? ""; const linkConfig = getLinkConfig(options, targetFile); const linkText = generateLinkText(app, targetFile, sourcePath, subpath, linkConfig); return linkConfig.isWikilink ? generateWikiLink(linkText, options.alias, linkConfig.isEmbed) : generateMarkdownStyleLink(linkText, targetFile, options, linkConfig); } function generateMarkdownStyleLink(linkText, targetFile, options, config) { const { app } = options; let alias = options.alias ?? ""; if (!alias && ((0, import_FileSystem.isMarkdownFile)(app, targetFile) || !options.isEmptyEmbedAliasAllowed)) { alias = !options.shouldIncludeAttachmentExtensionToEmbedAlias || (0, import_FileSystem.isMarkdownFile)(app, targetFile) ? targetFile.basename : targetFile.name; options.shouldEscapeAlias = true; } return generateRawMarkdownLink({ alias, isEmbed: config.isEmbed, isWikilink: false, shouldEscapeAlias: options.shouldEscapeAlias ?? false, shouldUseAngleBrackets: config.shouldUseAngleBrackets, url: linkText }); } function generateWikiLink(linkText, alias, isEmbed) { if (alias?.toLowerCase() === linkText.toLowerCase()) { return generateRawMarkdownLink({ isEmbed, isWikilink: true, url: alias }); } return generateRawMarkdownLink({ alias, isEmbed, isWikilink: true, url: linkText }); } async function getFileChanges(cache, isCanvasFileCache, linkConverter, abortSignal) { abortSignal ??= (0, import_AbortController.abortSignalNever)(); abortSignal.throwIfAborted(); if (!cache) { return []; } const changes = []; const tablePositions = (cache.sections ?? []).filter((section) => section.type === "table").map((section) => ({ end: section.position.end.offset, start: section.position.start.offset })); for (const link of (0, import_MetadataCache.getAllLinks)(cache)) { abortSignal.throwIfAborted(); const newContent = await linkConverter(link, abortSignal); abortSignal.throwIfAborted(); if (newContent === void 0) { continue; } const fileChange = (0, import_Reference.referenceToFileChange)(link, newContent); if (isCanvasFileCache) { if ((0, import_FileChange.isCanvasChange)(fileChange)) { changes.push(fileChange); } else { console.error("Unsupported file change", fileChange); continue; } } else { if (shouldEscapeWikilinkDivider(fileChange, tablePositions)) { fileChange.newContent = fileChange.newContent.replaceAll(UNESCAPED_WIKILINK_DIVIDER_REGEXP, ESCAPED_WIKILINK_DIVIDER); } changes.push(fileChange); } } return changes; } function getFinalLinkPathStyle(app, linkPathStyle) { switch (linkPathStyle ?? "ObsidianSettingsDefault" /* ObsidianSettingsDefault */) { case "AbsolutePathInVault" /* AbsolutePathInVault */: return "AbsolutePathInVault" /* AbsolutePathInVault */; case "RelativePathToTheSource" /* RelativePathToTheSource */: return "RelativePathToTheNote" /* RelativePathToTheSource */; case "ShortestPathWhenPossible" /* ShortestPathWhenPossible */: return "ShortestPathWhenPossible" /* ShortestPathWhenPossible */; case "ObsidianSettingsDefault" /* ObsidianSettingsDefault */: { const newLinkFormat = (0, import_ObsidianSettings.getNewLinkFormat)(app); switch (newLinkFormat) { case "absolute": return "AbsolutePathInVault" /* AbsolutePathInVault */; case "relative": return "RelativePathToTheNote" /* RelativePathToTheSource */; case "shortest": return "ShortestPathWhenPossible" /* ShortestPathWhenPossible */; default: throw new Error(`Invalid link format: ${newLinkFormat}.`); } } default: throw new Error(`Invalid link path style: ${linkPathStyle}.`); } } function getGenerateMarkdownLinkDefaultOptionsFns(app) { return (0, import_App.getObsidianDevUtilsState)(app, "generateMarkdownLinkDefaultOptionsFns", []).value; } function getLinkConfig(options, targetFile) { const { app } = options; return { isEmbed: options.isEmbed ?? (options.originalLink ? testEmbed(options.originalLink) : void 0) ?? (!(0, import_obsidian.requireApiVersion)("1.10.0") && !(0, import_FileSystem.isMarkdownFile)(app, targetFile)), isSingleSubpathAllowed: options.isSingleSubpathAllowed ?? true, isWikilink: shouldUseWikilinkStyle(app, options.originalLink, options.linkStyle), linkPathStyle: getFinalLinkPathStyle(app, options.linkPathStyle), shouldUseAngleBrackets: options.shouldUseAngleBrackets ?? (options.originalLink ? testAngleBrackets(options.originalLink) : void 0) ?? false, shouldUseLeadingDotForRelativePaths: options.shouldUseLeadingDotForRelativePaths ?? (options.originalLink ? testLeadingDot(options.originalLink) : void 0) ?? false, shouldUseLeadingSlashForAbsolutePaths: options.shouldUseLeadingSlashForAbsolutePaths ?? (options.originalLink ? testLeadingSlash(options.originalLink) : void 0) ?? false }; } function getRawLink(node, str) { return str.slice(node.position?.start.offset ?? 0, node.position?.end.offset ?? 0); } function hasAngleBracketsInLink(raw, rawUrl) { const OPEN_ANGLE_BRACKET = "<"; return raw.startsWith(OPEN_ANGLE_BRACKET) || rawUrl.startsWith(OPEN_ANGLE_BRACKET); } function parseLinkNode(node, str) { const LINK_ALIAS_SUFFIX = "]("; const LINK_SUFFIX = ")"; const raw = getRawLink(node, str); const aliasNodeStartOffset = node.children[0]?.position?.start.offset ?? 1; const aliasNodeEndOffset = node.children.at(-1)?.position?.end.offset ?? 1; const rawUrl = str.slice(aliasNodeEndOffset + LINK_ALIAS_SUFFIX.length, (node.position?.end.offset ?? 0) - LINK_SUFFIX.length); const hasAngleBrackets = hasAngleBracketsInLink(raw, rawUrl); const isExternal = (0, import_url.isUrl)(node.url); const url = decodeUrlSafely(node.url, isExternal, hasAngleBrackets); const alias = extractAlias(str, aliasNodeStartOffset, aliasNodeEndOffset); return (0, import_ObjectUtils.normalizeOptionalProperties)({ alias, encodedUrl: isExternal ? encodeUrl(url) : void 0, endOffset: node.position?.end.offset ?? 0, hasAngleBrackets, isEmbed: false, isExternal, isWikilink: false, raw, startOffset: node.position?.start.offset ?? 0, title: node.title ?? void 0, unescapedAlias: alias === void 0 ? void 0 : unescapeAlias(alias), url }); } function parseWikilinkNode(node, str) { return (0, import_ObjectUtils.normalizeOptionalProperties)({ alias: str.includes(WIKILINK_DIVIDER) ? node.data.alias : void 0, endOffset: node.position?.end.offset ?? 0, isEmbed: false, isExternal: false, isWikilink: true, raw: getRawLink(node, str), startOffset: node.position?.start.offset ?? 0, url: node.value }); } function shouldEscapeWikilinkDivider(fileChange, tablePositions) { if (!(0, import_FileChange.isContentChange)(fileChange)) { return false; } if (!UNESCAPED_WIKILINK_DIVIDER_REGEXP.test(fileChange.newContent)) { return false; } return tablePositions.some( (tablePosition) => tablePosition.start <= fileChange.reference.position.start.offset && fileChange.reference.position.end.offset <= tablePosition.end ); } function shouldUseWikilinkStyle(app, originalLink, linkStyle) { switch (linkStyle ?? "PreserveExisting" /* PreserveExisting */) { case "Markdown" /* Markdown */: return false; case "ObsidianSettingsDefault" /* ObsidianSettingsDefault */: return (0, import_ObsidianSettings.shouldUseWikilinks)(app); case "PreserveExisting" /* PreserveExisting */: return originalLink === void 0 ? (0, import_ObsidianSettings.shouldUseWikilinks)(app) : testWikilink(originalLink); case "Wikilink" /* Wikilink */: return true; default: throw new Error(`Invalid link style: ${linkStyle}.`); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LinkPathStyle, LinkStyle, convertLink, editBacklinks, editLinks, editLinksInContent, encodeUrl, escapeAlias, extractLinkFile, fixFrontmatterMarkdownLinks, generateMarkdownLink, generateRawMarkdownLink, parseLink, parseLinks, registerGenerateMarkdownLinkDefaultOptionsFn, shouldResetAlias, splitSubpath, testAngleBrackets, testEmbed, testLeadingDot, testLeadingSlash, testWikilink, unescapeAlias, updateLink, updateLinksInContent, updateLinksInFile }); //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBoYW5kbGluZyBhbmQgdXBkYXRpbmcgbGlua3Mgd2l0aGluIE9ic2lkaWFuIHZhdWx0cy4gSXQgaW5jbHVkZXNcbiAqIGZ1bmN0aW9ucyB0byBzcGxpdCBwYXRocywgdXBkYXRlIGxpbmtzIGluIGZpbGVzLCBhbmQgZ2VuZXJhdGUgbWFya2Rvd24gbGlua3Mgd2l0aCB2YXJpb3VzIG9wdGlvbnMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBMaW5rIH0gZnJvbSAnbWRhc3QnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBQbHVnaW4sXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgTm9kZSB9IGZyb20gJ3VuaXN0JztcblxuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dCxcbiAgcmVxdWlyZUFwaVZlcnNpb25cbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgSW50ZXJuYWxQbHVnaW5OYW1lIH0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncy9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHsgcmVtYXJrIH0gZnJvbSAncmVtYXJrJztcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tICdyZW1hcmstcGFyc2UnO1xuaW1wb3J0IHsgd2lraUxpbmtQbHVnaW4gfSBmcm9tICdyZW1hcmstd2lraS1saW5rJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAndW5pc3QtdXRpbC12aXNpdCc7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uL09iamVjdFV0aWxzLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi9UeXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRmlsZUNoYW5nZSB9IGZyb20gJy4vRmlsZUNoYW5nZS50cyc7XG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBQcm9jZXNzT3B0aW9ucyB9IGZyb20gJy4vVmF1bHQudHMnO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbE5ldmVyIH0gZnJvbSAnLi4vQWJvcnRDb250cm9sbGVyLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyxcbiAgdG9Kc29uXG59IGZyb20gJy4uL09iamVjdFV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9QYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZSxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbUVuZFxufSBmcm9tICcuLi9TdHJpbmcudHMnO1xuaW1wb3J0IHsgaXNVcmwgfSBmcm9tICcuLi91cmwudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi9BcHAudHMnO1xuaW1wb3J0IHtcbiAgYXBwbHlDb250ZW50Q2hhbmdlcyxcbiAgYXBwbHlGaWxlQ2hhbmdlcyxcbiAgaXNDYW52YXNDaGFuZ2UsXG4gIGlzQ29udGVudENoYW5nZVxufSBmcm9tICcuL0ZpbGVDaGFuZ2UudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEFsbExpbmtzLFxuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSxcbiAgZ2V0Q2FjaGVTYWZlLFxuICBwYXJzZU1ldGFkYXRhLFxuICB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1blxufSBmcm9tICcuL01ldGFkYXRhQ2FjaGUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TmV3TGlua0Zvcm1hdCxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vT2JzaWRpYW5TZXR0aW5ncy50cyc7XG5pbXBvcnQge1xuICBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlLFxuICByZWZlcmVuY2VUb0ZpbGVDaGFuZ2Vcbn0gZnJvbSAnLi9SZWZlcmVuY2UudHMnO1xuXG5jb25zdCBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIgPSAnXFxcXHwnO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBsaW5rIHN5bWJvbHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgd3JpdHRlbiB0byBjYXB0dXJlIGNvbnRyb2wgY2hhcmFjdGVycy5cbmNvbnN0IFNQRUNJQUxfTElOS19TWU1CT0xTX1JFR0VYUCA9IC9bXFxcXFxceDAwXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUYgXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBtYXJrZG93biBsaW5rIHN5bWJvbHMuXG4gKi9cbmNvbnN0IFNQRUNJQUxfTUFSS0RPV05fTElOS19TWU1CT0xTX1JFR0VYID0gL1tcXFxcW1xcXTw+Xyp+PWAkXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdW5lc2NhcGVkIHBpcGVzLlxuICovXG5jb25zdCBVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAgPSAvKD88IVxcXFwpXFx8L2c7XG5cbmNvbnN0IFdJS0lMSU5LX0RJVklERVIgPSAnfCc7XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICovXG5leHBvcnQgZW51bSBMaW5rUGF0aFN0eWxlIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvZnJvbS90aGUvdmF1bHQvcm9vdC90YXJnZXRdXWBcbiAgICovXG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHBhdGggc3R5bGUgZGVmaW5lZCBpbiBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIE9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0ID0gJ09ic2lkaWFuU2V0dGluZ3NEZWZhdWx0JyxcblxuICAvKipcbiAgICogVXNlIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbWy4uLy4uL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqL1xuICBSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZSA9ICdSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZScsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgc2hvcnRlc3QgcGF0aCB3aGVuIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tzaG9ydGVzdC1wYXRoLXRvLXRhcmdldF1dYFxuICAgKi9cbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICovXG5leHBvcnQgZW51bSBMaW5rU3R5bGUge1xuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gbWFya2Rvd24gZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShwYXRoL3RvL3RhcmdldC5tZClgXG4gICAqL1xuICBNYXJrZG93biA9ICdNYXJrZG93bicsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFByZXNlcnZlIHRoZSBleGlzdGluZyBsaW5rIHN0eWxlLlxuICAgKi9cbiAgUHJlc2VydmVFeGlzdGluZyA9ICdQcmVzZXJ2ZUV4aXN0aW5nJyxcblxuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gd2lraWxpbmsgZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldF1dYFxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldHxhbGlhc11dYFxuICAgKi9cbiAgV2lraWxpbmsgPSAnV2lraWxpbmsnXG59XG5cbmVudW0gRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgQWJzb2x1dGVQYXRoSW5WYXVsdCA9ICdBYnNvbHV0ZVBhdGhJblZhdWx0JyxcbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVOb3RlJyxcbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIGZvciB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbYWxpYXN8bGlua11dYFxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShsaW5rLm1kKWBcbiAgICovXG4gIGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBlbWJlZGRlZC4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBmaWxlIHR5cGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbW3RhcmdldF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbdGFyZ2V0XV1gLlxuICAgKi9cbiAgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICovXG4gIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgIGFuZCB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gaXMgYSBub24tZXhpc3RpbmcgZmlsZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAqL1xuICBpc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGEgc2luZ2xlIHN1YnBhdGguIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayB0YXJnZXRQYXRoT3JGaWxlfSBhbmQge0BsaW5rIHNvdXJjZVBhdGhPckZpbGV9IGFyZSB0aGUgc2FtZSBmaWxlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWyNzdWJwYXRoXV1gLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tzb3VyY2Ujc3VicGF0aF1dYFxuICAgKi9cbiAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCBsaW5rIHRleHQuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHZhbHVlcyBvZlxuICAgKlxuICAgKiAtIHtAbGluayBpc0VtYmVkfVxuICAgKiAtIHtAbGluayBsaW5rU3R5bGV9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUFuZ2xlQnJhY2tldHN9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzfVxuICAgKlxuICAgKiBUaGVzZSBpbmZlcnJlZCB2YWx1ZXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MgaWYgc3BlY2lmaWVkLlxuICAgKi9cbiAgb3JpZ2luYWxMaW5rPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtcXCpcXCphbGlhc1xcKlxcKl0obGluay5tZClgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgWyoqYWxpYXMqKl0obGluay5tZClgLlxuICAgKi9cbiAgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqL1xuICBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqL1xuICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1NvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqL1xuICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogU2hvdWxkIGJlIGVtcHR5IG9yIHN0YXJ0IHdpdGggYCNgLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtZW1wdHktc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoXV1gXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1zdWJwYXRoI3N1YnBhdGgjbmVzdGVkLXN1YnBhdGhdXWBcbiAgICovXG4gIHN1YnBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZVJhd01hcmtkb3duTGlua09wdGlvbnMge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgYWxpYXM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBpc0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYSB3aWtpbGluay5cbiAgICovXG4gIGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc1dpa2lsaW5rfSBpcyBgZmFsc2VgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVzZSBhbmdsZSBicmFja2V0cy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc1dpa2lsaW5rfSBpcyBgZmFsc2VgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSByZXN1bHQgb2YgcGFyc2luZyBhIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rUmVzdWx0IHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1xcKmFsaWFzXFwqXShsaW5rLm1kKSAtPiBcXCphbGlhc1xcKlxuICAgKiBgYGBcbiAgICovXG4gIGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmNvZGVkIFVSTCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oPGxpbmsgd2l0aCBzcGFjZS5tZD4pIC0+IGxpbmslMjB3aXRoJTIwc3BhY2UubWRcbiAgICogYGBgXG4gICAqL1xuICBlbmNvZGVkVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBoYXMgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKDxsaW5rLm1kPikgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgaGFzQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogIVtbYWxpYXNdXSAtPiB0cnVlXG4gICAqIFtbYWxpYXNdXSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBleHRlcm5hbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oaHR0cHM6Ly9leGFtcGxlLmNvbSkgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGZpbGUubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgaXNFeHRlcm5hbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbW2FsaWFzXV0gLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSByYXcgbGluayB0ZXh0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShsaW5rLm1kKSAtPiBbYWxpYXNdKGxpbmsubWQpXG4gICAqIGBgYFxuICAgKi9cbiAgcmF3OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhcnQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgc3RhcnRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSB0aXRsZSBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10obGluay5tZCBcInRpdGxlXCIpIC0+IHRpdGxlXG4gICAqIGBgYFxuICAgKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIHVuZXNjYXBlZCBhbGlhcyBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFtcXCphbGlhc1xcKl0obGluay5tZCkgLT4gKmFsaWFzKlxuICAgKiBgYGBcbiAgICovXG4gIHVuZXNjYXBlZEFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBVUkwgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGxpbmslMjB3aXRoJTIwc3BhY2UubWQpIC0+IGxpbmsgd2l0aCBzcGFjZS5tZFxuICAgKiBgYGBcbiAgICovXG4gIHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBzaG91bGRSZXNldEFsaWFzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRSZXNldEFsaWFzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBkaXNwbGF5IHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICBkaXNwbGF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICovXG4gIGlzV2lraWxpbms/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHRhcmdldCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgb2xkVGFyZ2V0UGF0aDogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTt