diff --git a/.nomedia b/.nomedia index 8863c00..cd7bc87 100644 --- a/.nomedia +++ b/.nomedia @@ -1 +1 @@ -/storage/emulated/0/Krita \ No newline at end of file +/storage/emulated/0/obsidian/digital-art-composition-book \ No newline at end of file diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 7632aac..b2b5b6b 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -7,5 +7,8 @@ "obsidian-sort-and-permute-lines", "dashboard-navigator", "automatic-table-of-contents", - "obsidian-advanced-uri" + "obsidian-advanced-uri", + "table-editor-obsidian", + "folder-notes", + "waypoint" ] \ No newline at end of file diff --git a/.obsidian/plugins/folder-notes/data.json b/.obsidian/plugins/folder-notes/data.json new file mode 100644 index 0000000..c42f689 --- /dev/null +++ b/.obsidian/plugins/folder-notes/data.json @@ -0,0 +1,108 @@ +{ + "syncFolderName": true, + "ctrlKey": true, + "altKey": false, + "hideFolderNote": true, + "templatePath": "", + "autoCreate": false, + "enableCollapsing": false, + "excludeFolders": [ + { + "type": "pattern", + "string": "*_attachment*", + "position": 0, + "subFolders": true, + "disableSync": true, + "disableAutoCreate": true, + "disableFolderNote": false, + "enableCollapsing": false, + "excludeFromFolderOverview": false, + "path": "", + "hideInSettings": false + } + ], + "whitelistFolders": [], + "showDeleteConfirmation": true, + "underlineFolder": true, + "stopWhitespaceCollapsing": true, + "underlineFolderInPath": true, + "openFolderNoteOnClickInPath": true, + "openInNewTab": false, + "folderNoteName": "{{folder_name}}", + "folderNoteType": ".md", + "disableFolderHighlighting": false, + "newFolderNoteName": "{{folder_name}}", + "storageLocation": "insideFolder", + "syncDelete": false, + "showRenameConfirmation": true, + "defaultOverview": { + "id": "", + "folderPath": "", + "title": "{{folderName}} overview", + "showTitle": false, + "depth": 3, + "includeTypes": [ + "folder", + "all" + ], + "style": "list", + "disableFileTag": false, + "sortBy": "name", + "sortByAsc": true, + "showEmptyFolders": false, + "onlyIncludeSubfolders": false, + "storeFolderCondition": true, + "showFolderNotes": false, + "disableCollapseIcon": true + }, + "useSubmenus": true, + "syncMove": true, + "frontMatterTitle": { + "enabled": false, + "explorer": true, + "path": true + }, + "settingsTab": "file_explorer", + "supportedFileTypes": [ + "md", + "canvas" + ], + "boldName": false, + "boldNameInPath": false, + "cursiveName": false, + "cursiveNameInPath": false, + "disableOpenFolderNoteOnClick": false, + "openByClick": true, + "openWithCtrl": false, + "openWithAlt": false, + "excludeFolderDefaultSettings": { + "type": "folder", + "path": "", + "subFolders": true, + "disableSync": true, + "disableAutoCreate": true, + "disableFolderNote": false, + "enableCollapsing": false, + "position": 0, + "excludeFromFolderOverview": false, + "string": "", + "hideInSettings": false + }, + "excludePatternDefaultSettings": { + "type": "pattern", + "path": "", + "subFolders": true, + "disableSync": true, + "disableAutoCreate": true, + "disableFolderNote": false, + "enableCollapsing": false, + "position": 0, + "excludeFromFolderOverview": false, + "string": "", + "hideInSettings": false + }, + "hideCollapsingIcon": false, + "tabManagerEnabled": true, + "ignoreAttachmentFolder": true, + "deleteFilesAction": "trash" +} \ No newline at end of file diff --git a/.obsidian/plugins/folder-notes/main.js b/.obsidian/plugins/folder-notes/main.js new file mode 100644 index 0000000..72306cd --- /dev/null +++ b/.obsidian/plugins/folder-notes/main.js @@ -0,0 +1,5906 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +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 __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +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(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// node_modules/front-matter-plugin-api-provider/lib/contracts/Api.js +var require_Api = __commonJS({ + "node_modules/front-matter-plugin-api-provider/lib/contracts/Api.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + } +}); + +// node_modules/front-matter-plugin-api-provider/lib/contracts/EventDispatcher.js +var require_EventDispatcher = __commonJS({ + "node_modules/front-matter-plugin-api-provider/lib/contracts/EventDispatcher.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + } +}); + +// node_modules/front-matter-plugin-api-provider/lib/contracts/Resolver.js +var require_Resolver = __commonJS({ + "node_modules/front-matter-plugin-api-provider/lib/contracts/Resolver.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + } +}); + +// node_modules/front-matter-plugin-api-provider/lib/index.js +var require_lib = __commonJS({ + "node_modules/front-matter-plugin-api-provider/lib/index.js"(exports) { + "use strict"; + var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports && exports.__exportStar || function(m, exports2) { + for (var p in m) + if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p)) + __createBinding(exports2, m, p); + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getApiSafe = exports.getDefer = exports.isPluginEnabled = exports.PluginNotEnabledError = exports.pluginId = void 0; + __exportStar(require_Api(), exports); + __exportStar(require_EventDispatcher(), exports); + __exportStar(require_Resolver(), exports); + exports.pluginId = "obsidian-front-matter-title-plugin"; + var PluginNotEnabledError = class extends Error { + }; + exports.PluginNotEnabledError = PluginNotEnabledError; + function isPluginEnabled(app2) { + var _a, _b, _c; + return (_c = (_b = (_a = app2 === null || app2 === void 0 ? void 0 : app2.plugins) === null || _a === void 0 ? void 0 : _a.enabledPlugins) === null || _b === void 0 ? void 0 : _b.has(exports.pluginId)) !== null && _c !== void 0 ? _c : false; + } + exports.isPluginEnabled = isPluginEnabled; + function getDefer2(app2) { + var _a, _b, _c, _d; + const plugin = (_b = (_a = app2 === null || app2 === void 0 ? void 0 : app2.plugins) === null || _a === void 0 ? void 0 : _a.getPlugin(exports.pluginId)) !== null && _b !== void 0 ? _b : null; + const defer = (_d = (_c = plugin === null || plugin === void 0 ? void 0 : plugin.getDefer) === null || _c === void 0 ? void 0 : _c.call(plugin)) !== null && _d !== void 0 ? _d : null; + if (defer === null) { + throw new PluginNotEnabledError(`Plugin ${exports.pluginId} is not enabled or old version`); + } + return defer; + } + exports.getDefer = getDefer2; + function getApiSafe(app2) { + return new ApiWrapper(null, app2); + } + exports.getApiSafe = getApiSafe; + var ApiWrapper = class { + constructor(api, app2) { + this.api = api; + this.app = app2; + } + before() { + if (this.api !== null) { + return; + } + const defer = this.getDeffer(); + if (defer === null) { + return; + } + const api = defer.getApi(); + if (api === null) { + return defer.awaitPlugin().then(() => { + this.api = defer.getApi(); + }); + } else { + this.api = api; + } + } + getDeffer() { + try { + return getDefer2(this.app); + } catch (e) { + if (e instanceof PluginNotEnabledError) { + return null; + } + throw e; + } + } + getResolverFactory() { + var _a, _b; + this.before(); + return (_b = (_a = this.api) === null || _a === void 0 ? void 0 : _a.getResolverFactory()) !== null && _b !== void 0 ? _b : null; + } + getEventDispatcher() { + var _a, _b; + this.before(); + return (_b = (_a = this.api) === null || _a === void 0 ? void 0 : _a.getEventDispatcher()) !== null && _b !== void 0 ? _b : null; + } + getEnabledFeatures() { + var _a, _b; + this.before(); + return (_b = (_a = this.api) === null || _a === void 0 ? void 0 : _a.getEnabledFeatures()) !== null && _b !== void 0 ? _b : []; + } + }; + } +}); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => FolderNotesPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian33 = require("obsidian"); + +// src/settings/SettingsTab.ts +var import_obsidian24 = require("obsidian"); + +// src/modals/ExistingNote.ts +var import_obsidian = require("obsidian"); +var ExistingFolderNoteModal = class extends import_obsidian.Modal { + constructor(app2, plugin, file, folder, folderNote) { + super(app2); + this.plugin = plugin; + this.app = app2; + this.file = file; + this.folder = folder; + this.folderNote = folderNote; + } + onOpen() { + var _a; + const { contentEl } = this; + contentEl.createEl("h2", { text: "A folder note for this folder already exists" }); + const setting = new import_obsidian.Setting(contentEl); + setting.infoEl.createEl("p", { text: "Are you sure you want to turn the note into a folder note and rename the existing folder note?" }); + (_a = setting.infoEl.parentElement) == null ? void 0 : _a.classList.add("fn-delete-confirmation-modal"); + const buttonContainer = setting.infoEl.createEl("div", { cls: "fn-delete-confirmation-modal-buttons" }); + if (import_obsidian.Platform.isMobileApp) { + const confirmButton = buttonContainer.createEl("button", { text: "Rename and don't ask again" }); + confirmButton.classList.add("mod-warning", "fn-confirmation-modal-button"); + confirmButton.addEventListener("click", async () => { + this.plugin.settings.showRenameConfirmation = false; + this.plugin.saveSettings(); + this.close(); + turnIntoFolderNote(this.plugin, this.file, this.folder, this.folderNote, true); + }); + } else { + const checkbox = buttonContainer.createEl("input", { type: "checkbox" }); + checkbox.addEventListener("change", (e) => { + const target = e.target; + if (target.checked) { + this.plugin.settings.showRenameConfirmation = false; + } else { + this.plugin.settings.showRenameConfirmation = true; + } + }); + const checkBoxText = buttonContainer.createEl("span", { text: "Don't ask again" }); + checkBoxText.addEventListener("click", () => { + checkbox.click(); + }); + } + const button = buttonContainer.createEl("button", { text: "Rename" }); + button.classList.add("mod-warning", "fn-confirmation-modal-button"); + button.addEventListener("click", async () => { + this.plugin.saveSettings(); + this.close(); + turnIntoFolderNote(this.plugin, this.file, this.folder, this.folderNote, true); + }); + button.focus(); + const cancelButton = buttonContainer.createEl("button", { text: "Cancel" }); + cancelButton.addEventListener("click", async () => { + this.close(); + }); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/template.ts +var import_obsidian2 = require("obsidian"); +async function applyTemplate(plugin, file, leaf, templatePath) { + const templateFile = templatePath ? plugin.app.vault.getAbstractFileByPath(templatePath) : null; + if (templateFile && templateFile instanceof import_obsidian2.TFile) { + try { + const { + templatesEnabled, + templaterEnabled, + templatesPlugin, + templaterPlugin + } = getTemplatePlugins(plugin.app); + const templateContent = await plugin.app.vault.read(templateFile); + if (templateContent.includes("==\u26A0 Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. \u26A0==")) { + return; + } + if (templatesEnabled && templaterEnabled) { + if (/<%/.test(templateContent)) { + return await templaterPlugin.write_template_to_file(templateFile, file); + } else { + if (leaf instanceof import_obsidian2.WorkspaceLeaf) { + leaf.openFile(file).then(async () => { + return await templatesPlugin.instance.insertTemplate(templateFile, file); + }); + } + } + } + if (templatesEnabled) { + if (leaf instanceof import_obsidian2.WorkspaceLeaf) { + leaf.openFile(file); + } + return await templatesPlugin.instance.insertTemplate(templateFile); + } + if (templaterEnabled) { + return await templaterPlugin.write_template_to_file(templateFile, file); + } + } catch (e) { + console.error(e); + } + } +} +function getTemplatePlugins(app2) { + var _a; + const templatesPlugin = app2.internalPlugins.plugins.templates; + const templatesEnabled = templatesPlugin.enabled; + const templaterPlugin = app2.plugins.plugins["templater-obsidian"]; + const templaterEnabled = app2.plugins.enabledPlugins.has("templater-obsidian"); + const templaterEmptyFileTemplate = templaterPlugin && ((_a = this.app.plugins.plugins["templater-obsidian"].settings) == null ? void 0 : _a.empty_file_template); + const templateFolder = templatesEnabled ? templatesPlugin.instance.options.folder : templaterPlugin ? templaterPlugin.settings.template_folder : void 0; + return { + templatesPlugin, + templatesEnabled, + templaterPlugin: templaterPlugin == null ? void 0 : templaterPlugin.templater, + templaterEnabled, + templaterEmptyFileTemplate, + templateFolder + }; +} + +// src/functions/folderNoteFunctions.ts +var import_obsidian12 = require("obsidian"); + +// src/modals/DeleteConfirmation.ts +var import_obsidian3 = require("obsidian"); +var DeleteConfirmationModal = class extends import_obsidian3.Modal { + constructor(app2, plugin, file) { + super(app2); + this.plugin = plugin; + this.app = app2; + this.file = file; + } + onOpen() { + const { contentEl, plugin } = this; + const modalTitle = contentEl.createDiv({ cls: "fn-modal-title" }); + const modalContent = contentEl.createDiv({ cls: "fn-modal-content" }); + modalTitle.createEl("h2", { text: "Delete folder note" }); + modalContent.createEl("p", { text: `Are you sure you want to delete the folder note "${this.file.name}" ?` }); + switch (plugin.settings.deleteFilesAction) { + case "trash": + modalContent.createEl("p", { text: "It will be moved to your system trash." }); + break; + case "obsidianTrash": + modalContent.createEl("p", { text: 'It will be moved to your Obsidian trash, which is located in the ".trash" hidden folder in your vault.' }); + break; + case "delete": + modalContent.createEl("p", { text: "It will be permanently deleted." }).setCssStyles({ color: "red" }); + break; + } + const buttonContainer = contentEl.createEl("div", { cls: "modal-button-container" }); + if (!import_obsidian3.Platform.isMobile) { + const checkbox = buttonContainer.createEl("label", { cls: "mod-checkbox" }); + checkbox.tabIndex = -1; + const input = checkbox.createEl("input", { type: "checkbox" }); + checkbox.appendText("Don't ask again"); + input.addEventListener("change", (e) => { + const target = e.target; + if (target.checked) { + plugin.settings.showDeleteConfirmation = false; + } else { + plugin.settings.showDeleteConfirmation = true; + } + plugin.saveSettings(); + }); + } else { + const confirmButton = buttonContainer.createEl("button", { text: "Delete and don't ask again", cls: "mod-destructive" }); + confirmButton.addEventListener("click", async () => { + plugin.settings.showDeleteConfirmation = false; + plugin.saveSettings(); + this.close(); + deleteFolderNote(plugin, this.file, false); + }); + } + const deleteButton = buttonContainer.createEl("button", { text: "Delete", cls: "mod-warning" }); + deleteButton.addEventListener("click", async () => { + this.close(); + deleteFolderNote(plugin, this.file, false); + }); + deleteButton.focus(); + const cancelButton = buttonContainer.createEl("button", { text: "Cancel", cls: "mod-cancel" }); + cancelButton.addEventListener("click", async () => { + this.close(); + }); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/functions/utils.ts +function getFileNameFromPathString(path) { + return path.substring(path.lastIndexOf("/") >= 0 ? path.lastIndexOf("/") + 1 : 0); +} +function getFolderNameFromPathString(path) { + if (path.endsWith(".md") || path.endsWith(".canvas")) { + return path.split("/").slice(-2)[0]; + } else { + return path.split("/").slice(-1)[0]; + } +} +function removeExtension(name) { + return name.replace(/\.[^/.]+$/, ""); +} +function getFolderPathFromString(path) { + const subString = path.lastIndexOf("/") >= 0 ? path.lastIndexOf("/") : 0; + return path.substring(0, subString); +} +function getFileExplorer() { + return this.app.workspace.getLeavesOfType("file-explorer")[0]; +} + +// src/ExcludeFolders/ExcludePattern.ts +var ExcludePattern = class { + constructor(pattern, position, plugin) { + this.type = "pattern"; + this.string = pattern; + this.position = position; + this.subFolders = plugin.settings.excludePatternDefaultSettings.subFolders; + this.disableSync = plugin.settings.excludePatternDefaultSettings.disableSync; + this.disableAutoCreate = plugin.settings.excludePatternDefaultSettings.disableAutoCreate; + this.disableFolderNote = plugin.settings.excludePatternDefaultSettings.disableFolderNote; + this.enableCollapsing = plugin.settings.excludePatternDefaultSettings.enableCollapsing; + this.excludeFromFolderOverview = plugin.settings.excludePatternDefaultSettings.excludeFromFolderOverview; + this.path = ""; + this.hideInSettings = false; + } +}; + +// src/ExcludeFolders/functions/folderFunctions.ts +var import_obsidian9 = require("obsidian"); + +// src/suggesters/FolderSuggester.ts +var import_obsidian5 = require("obsidian"); + +// src/suggesters/Suggest.ts +var import_obsidian4 = require("obsidian"); + +// node_modules/@popperjs/core/lib/enums.js +var top = "top"; +var bottom = "bottom"; +var right = "right"; +var left = "left"; +var auto = "auto"; +var basePlacements = [top, bottom, right, left]; +var start = "start"; +var end = "end"; +var clippingParents = "clippingParents"; +var viewport = "viewport"; +var popper = "popper"; +var reference = "reference"; +var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) { + return acc.concat([placement + "-" + start, placement + "-" + end]); +}, []); +var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) { + return acc.concat([placement, placement + "-" + start, placement + "-" + end]); +}, []); +var beforeRead = "beforeRead"; +var read = "read"; +var afterRead = "afterRead"; +var beforeMain = "beforeMain"; +var main = "main"; +var afterMain = "afterMain"; +var beforeWrite = "beforeWrite"; +var write = "write"; +var afterWrite = "afterWrite"; +var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; + +// node_modules/@popperjs/core/lib/dom-utils/getNodeName.js +function getNodeName(element) { + return element ? (element.nodeName || "").toLowerCase() : null; +} + +// node_modules/@popperjs/core/lib/dom-utils/getWindow.js +function getWindow(node) { + if (node == null) { + return window; + } + if (node.toString() !== "[object Window]") { + var ownerDocument = node.ownerDocument; + return ownerDocument ? ownerDocument.defaultView || window : window; + } + return node; +} + +// node_modules/@popperjs/core/lib/dom-utils/instanceOf.js +function isElement(node) { + var OwnElement = getWindow(node).Element; + return node instanceof OwnElement || node instanceof Element; +} +function isHTMLElement(node) { + var OwnElement = getWindow(node).HTMLElement; + return node instanceof OwnElement || node instanceof HTMLElement; +} +function isShadowRoot(node) { + if (typeof ShadowRoot === "undefined") { + return false; + } + var OwnElement = getWindow(node).ShadowRoot; + return node instanceof OwnElement || node instanceof ShadowRoot; +} + +// node_modules/@popperjs/core/lib/modifiers/applyStyles.js +function applyStyles(_ref) { + var state = _ref.state; + Object.keys(state.elements).forEach(function(name) { + var style = state.styles[name] || {}; + var attributes = state.attributes[name] || {}; + var element = state.elements[name]; + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + Object.assign(element.style, style); + Object.keys(attributes).forEach(function(name2) { + var value = attributes[name2]; + if (value === false) { + element.removeAttribute(name2); + } else { + element.setAttribute(name2, value === true ? "" : value); + } + }); + }); +} +function effect(_ref2) { + var state = _ref2.state; + var initialStyles = { + popper: { + position: state.options.strategy, + left: "0", + top: "0", + margin: "0" + }, + arrow: { + position: "absolute" + }, + reference: {} + }; + Object.assign(state.elements.popper.style, initialStyles.popper); + state.styles = initialStyles; + if (state.elements.arrow) { + Object.assign(state.elements.arrow.style, initialStyles.arrow); + } + return function() { + Object.keys(state.elements).forEach(function(name) { + var element = state.elements[name]; + var attributes = state.attributes[name] || {}; + var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); + var style = styleProperties.reduce(function(style2, property) { + style2[property] = ""; + return style2; + }, {}); + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + Object.assign(element.style, style); + Object.keys(attributes).forEach(function(attribute) { + element.removeAttribute(attribute); + }); + }); + }; +} +var applyStyles_default = { + name: "applyStyles", + enabled: true, + phase: "write", + fn: applyStyles, + effect, + requires: ["computeStyles"] +}; + +// node_modules/@popperjs/core/lib/utils/getBasePlacement.js +function getBasePlacement(placement) { + return placement.split("-")[0]; +} + +// node_modules/@popperjs/core/lib/utils/math.js +var max = Math.max; +var min = Math.min; +var round = Math.round; + +// node_modules/@popperjs/core/lib/utils/userAgent.js +function getUAString() { + var uaData = navigator.userAgentData; + if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) { + return uaData.brands.map(function(item) { + return item.brand + "/" + item.version; + }).join(" "); + } + return navigator.userAgent; +} + +// node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js +function isLayoutViewport() { + return !/^((?!chrome|android).)*safari/i.test(getUAString()); +} + +// node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js +function getBoundingClientRect(element, includeScale, isFixedStrategy) { + if (includeScale === void 0) { + includeScale = false; + } + if (isFixedStrategy === void 0) { + isFixedStrategy = false; + } + var clientRect = element.getBoundingClientRect(); + var scaleX = 1; + var scaleY = 1; + if (includeScale && isHTMLElement(element)) { + scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1; + scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1; + } + var _ref = isElement(element) ? getWindow(element) : window, visualViewport = _ref.visualViewport; + var addVisualOffsets = !isLayoutViewport() && isFixedStrategy; + var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX; + var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY; + var width = clientRect.width / scaleX; + var height = clientRect.height / scaleY; + return { + width, + height, + top: y, + right: x + width, + bottom: y + height, + left: x, + x, + y + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js +function getLayoutRect(element) { + var clientRect = getBoundingClientRect(element); + var width = element.offsetWidth; + var height = element.offsetHeight; + if (Math.abs(clientRect.width - width) <= 1) { + width = clientRect.width; + } + if (Math.abs(clientRect.height - height) <= 1) { + height = clientRect.height; + } + return { + x: element.offsetLeft, + y: element.offsetTop, + width, + height + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/contains.js +function contains(parent, child) { + var rootNode = child.getRootNode && child.getRootNode(); + if (parent.contains(child)) { + return true; + } else if (rootNode && isShadowRoot(rootNode)) { + var next = child; + do { + if (next && parent.isSameNode(next)) { + return true; + } + next = next.parentNode || next.host; + } while (next); + } + return false; +} + +// node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js +function getComputedStyle(element) { + return getWindow(element).getComputedStyle(element); +} + +// node_modules/@popperjs/core/lib/dom-utils/isTableElement.js +function isTableElement(element) { + return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0; +} + +// node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js +function getDocumentElement(element) { + return ((isElement(element) ? element.ownerDocument : element.document) || window.document).documentElement; +} + +// node_modules/@popperjs/core/lib/dom-utils/getParentNode.js +function getParentNode(element) { + if (getNodeName(element) === "html") { + return element; + } + return element.assignedSlot || element.parentNode || (isShadowRoot(element) ? element.host : null) || getDocumentElement(element); +} + +// node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js +function getTrueOffsetParent(element) { + if (!isHTMLElement(element) || getComputedStyle(element).position === "fixed") { + return null; + } + return element.offsetParent; +} +function getContainingBlock(element) { + var isFirefox = /firefox/i.test(getUAString()); + var isIE = /Trident/i.test(getUAString()); + if (isIE && isHTMLElement(element)) { + var elementCss = getComputedStyle(element); + if (elementCss.position === "fixed") { + return null; + } + } + var currentNode = getParentNode(element); + if (isShadowRoot(currentNode)) { + currentNode = currentNode.host; + } + while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) { + var css = getComputedStyle(currentNode); + if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") { + return currentNode; + } else { + currentNode = currentNode.parentNode; + } + } + return null; +} +function getOffsetParent(element) { + var window2 = getWindow(element); + var offsetParent = getTrueOffsetParent(element); + while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === "static") { + offsetParent = getTrueOffsetParent(offsetParent); + } + if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle(offsetParent).position === "static")) { + return window2; + } + return offsetParent || getContainingBlock(element) || window2; +} + +// node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js +function getMainAxisFromPlacement(placement) { + return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y"; +} + +// node_modules/@popperjs/core/lib/utils/within.js +function within(min2, value, max2) { + return max(min2, min(value, max2)); +} +function withinMaxClamp(min2, value, max2) { + var v = within(min2, value, max2); + return v > max2 ? max2 : v; +} + +// node_modules/@popperjs/core/lib/utils/getFreshSideObject.js +function getFreshSideObject() { + return { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; +} + +// node_modules/@popperjs/core/lib/utils/mergePaddingObject.js +function mergePaddingObject(paddingObject) { + return Object.assign({}, getFreshSideObject(), paddingObject); +} + +// node_modules/@popperjs/core/lib/utils/expandToHashMap.js +function expandToHashMap(value, keys) { + return keys.reduce(function(hashMap, key) { + hashMap[key] = value; + return hashMap; + }, {}); +} + +// node_modules/@popperjs/core/lib/modifiers/arrow.js +var toPaddingObject = function toPaddingObject2(padding, state) { + padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, { + placement: state.placement + })) : padding; + return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); +}; +function arrow(_ref) { + var _state$modifiersData$; + var state = _ref.state, name = _ref.name, options = _ref.options; + var arrowElement = state.elements.arrow; + var popperOffsets2 = state.modifiersData.popperOffsets; + var basePlacement = getBasePlacement(state.placement); + var axis = getMainAxisFromPlacement(basePlacement); + var isVertical = [left, right].indexOf(basePlacement) >= 0; + var len = isVertical ? "height" : "width"; + if (!arrowElement || !popperOffsets2) { + return; + } + var paddingObject = toPaddingObject(options.padding, state); + var arrowRect = getLayoutRect(arrowElement); + var minProp = axis === "y" ? top : left; + var maxProp = axis === "y" ? bottom : right; + var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len]; + var startDiff = popperOffsets2[axis] - state.rects.reference[axis]; + var arrowOffsetParent = getOffsetParent(arrowElement); + var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; + var centerToReference = endDiff / 2 - startDiff / 2; + var min2 = paddingObject[minProp]; + var max2 = clientSize - arrowRect[len] - paddingObject[maxProp]; + var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; + var offset2 = within(min2, center, max2); + var axisProp = axis; + state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$); +} +function effect2(_ref2) { + var state = _ref2.state, options = _ref2.options; + var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element; + if (arrowElement == null) { + return; + } + if (typeof arrowElement === "string") { + arrowElement = state.elements.popper.querySelector(arrowElement); + if (!arrowElement) { + return; + } + } + if (!contains(state.elements.popper, arrowElement)) { + return; + } + state.elements.arrow = arrowElement; +} +var arrow_default = { + name: "arrow", + enabled: true, + phase: "main", + fn: arrow, + effect: effect2, + requires: ["popperOffsets"], + requiresIfExists: ["preventOverflow"] +}; + +// node_modules/@popperjs/core/lib/utils/getVariation.js +function getVariation(placement) { + return placement.split("-")[1]; +} + +// node_modules/@popperjs/core/lib/modifiers/computeStyles.js +var unsetSides = { + top: "auto", + right: "auto", + bottom: "auto", + left: "auto" +}; +function roundOffsetsByDPR(_ref, win) { + var x = _ref.x, y = _ref.y; + var dpr = win.devicePixelRatio || 1; + return { + x: round(x * dpr) / dpr || 0, + y: round(y * dpr) / dpr || 0 + }; +} +function mapToStyles(_ref2) { + var _Object$assign2; + var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed; + var _offsets$x = offsets.x, x = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y = _offsets$y === void 0 ? 0 : _offsets$y; + var _ref3 = typeof roundOffsets === "function" ? roundOffsets({ + x, + y + }) : { + x, + y + }; + x = _ref3.x; + y = _ref3.y; + var hasX = offsets.hasOwnProperty("x"); + var hasY = offsets.hasOwnProperty("y"); + var sideX = left; + var sideY = top; + var win = window; + if (adaptive) { + var offsetParent = getOffsetParent(popper2); + var heightProp = "clientHeight"; + var widthProp = "clientWidth"; + if (offsetParent === getWindow(popper2)) { + offsetParent = getDocumentElement(popper2); + if (getComputedStyle(offsetParent).position !== "static" && position === "absolute") { + heightProp = "scrollHeight"; + widthProp = "scrollWidth"; + } + } + offsetParent = offsetParent; + if (placement === top || (placement === left || placement === right) && variation === end) { + sideY = bottom; + var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : offsetParent[heightProp]; + y -= offsetY - popperRect.height; + y *= gpuAcceleration ? 1 : -1; + } + if (placement === left || (placement === top || placement === bottom) && variation === end) { + sideX = right; + var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : offsetParent[widthProp]; + x -= offsetX - popperRect.width; + x *= gpuAcceleration ? 1 : -1; + } + } + var commonStyles = Object.assign({ + position + }, adaptive && unsetSides); + var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ + x, + y + }, getWindow(popper2)) : { + x, + y + }; + x = _ref4.x; + y = _ref4.y; + if (gpuAcceleration) { + var _Object$assign; + return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); + } + return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : "", _Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2)); +} +function computeStyles(_ref5) { + var state = _ref5.state, options = _ref5.options; + var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; + var commonStyles = { + placement: getBasePlacement(state.placement), + variation: getVariation(state.placement), + popper: state.elements.popper, + popperRect: state.rects.popper, + gpuAcceleration, + isFixed: state.options.strategy === "fixed" + }; + if (state.modifiersData.popperOffsets != null) { + state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.popperOffsets, + position: state.options.strategy, + adaptive, + roundOffsets + }))); + } + if (state.modifiersData.arrow != null) { + state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.arrow, + position: "absolute", + adaptive: false, + roundOffsets + }))); + } + state.attributes.popper = Object.assign({}, state.attributes.popper, { + "data-popper-placement": state.placement + }); +} +var computeStyles_default = { + name: "computeStyles", + enabled: true, + phase: "beforeWrite", + fn: computeStyles, + data: {} +}; + +// node_modules/@popperjs/core/lib/modifiers/eventListeners.js +var passive = { + passive: true +}; +function effect3(_ref) { + var state = _ref.state, instance = _ref.instance, options = _ref.options; + var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize; + var window2 = getWindow(state.elements.popper); + var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); + if (scroll) { + scrollParents.forEach(function(scrollParent) { + scrollParent.addEventListener("scroll", instance.update, passive); + }); + } + if (resize) { + window2.addEventListener("resize", instance.update, passive); + } + return function() { + if (scroll) { + scrollParents.forEach(function(scrollParent) { + scrollParent.removeEventListener("scroll", instance.update, passive); + }); + } + if (resize) { + window2.removeEventListener("resize", instance.update, passive); + } + }; +} +var eventListeners_default = { + name: "eventListeners", + enabled: true, + phase: "write", + fn: function fn() { + }, + effect: effect3, + data: {} +}; + +// node_modules/@popperjs/core/lib/utils/getOppositePlacement.js +var hash = { + left: "right", + right: "left", + bottom: "top", + top: "bottom" +}; +function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, function(matched) { + return hash[matched]; + }); +} + +// node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js +var hash2 = { + start: "end", + end: "start" +}; +function getOppositeVariationPlacement(placement) { + return placement.replace(/start|end/g, function(matched) { + return hash2[matched]; + }); +} + +// node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js +function getWindowScroll(node) { + var win = getWindow(node); + var scrollLeft = win.pageXOffset; + var scrollTop = win.pageYOffset; + return { + scrollLeft, + scrollTop + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js +function getWindowScrollBarX(element) { + return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; +} + +// node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js +function getViewportRect(element, strategy) { + var win = getWindow(element); + var html = getDocumentElement(element); + var visualViewport = win.visualViewport; + var width = html.clientWidth; + var height = html.clientHeight; + var x = 0; + var y = 0; + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; + var layoutViewport = isLayoutViewport(); + if (layoutViewport || !layoutViewport && strategy === "fixed") { + x = visualViewport.offsetLeft; + y = visualViewport.offsetTop; + } + } + return { + width, + height, + x: x + getWindowScrollBarX(element), + y + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js +function getDocumentRect(element) { + var _element$ownerDocumen; + var html = getDocumentElement(element); + var winScroll = getWindowScroll(element); + var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; + var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); + var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); + var x = -winScroll.scrollLeft + getWindowScrollBarX(element); + var y = -winScroll.scrollTop; + if (getComputedStyle(body || html).direction === "rtl") { + x += max(html.clientWidth, body ? body.clientWidth : 0) - width; + } + return { + width, + height, + x, + y + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js +function isScrollParent(element) { + var _getComputedStyle = getComputedStyle(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY; + return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); +} + +// node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js +function getScrollParent(node) { + if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) { + return node.ownerDocument.body; + } + if (isHTMLElement(node) && isScrollParent(node)) { + return node; + } + return getScrollParent(getParentNode(node)); +} + +// node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js +function listScrollParents(element, list) { + var _element$ownerDocumen; + if (list === void 0) { + list = []; + } + var scrollParent = getScrollParent(element); + var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); + var win = getWindow(scrollParent); + var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; + var updatedList = list.concat(target); + return isBody ? updatedList : updatedList.concat(listScrollParents(getParentNode(target))); +} + +// node_modules/@popperjs/core/lib/utils/rectToClientRect.js +function rectToClientRect(rect) { + return Object.assign({}, rect, { + left: rect.x, + top: rect.y, + right: rect.x + rect.width, + bottom: rect.y + rect.height + }); +} + +// node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js +function getInnerBoundingClientRect(element, strategy) { + var rect = getBoundingClientRect(element, false, strategy === "fixed"); + rect.top = rect.top + element.clientTop; + rect.left = rect.left + element.clientLeft; + rect.bottom = rect.top + element.clientHeight; + rect.right = rect.left + element.clientWidth; + rect.width = element.clientWidth; + rect.height = element.clientHeight; + rect.x = rect.left; + rect.y = rect.top; + return rect; +} +function getClientRectFromMixedType(element, clippingParent, strategy) { + return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element))); +} +function getClippingParents(element) { + var clippingParents2 = listScrollParents(getParentNode(element)); + var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle(element).position) >= 0; + var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; + if (!isElement(clipperElement)) { + return []; + } + return clippingParents2.filter(function(clippingParent) { + return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body"; + }); +} +function getClippingRect(element, boundary, rootBoundary, strategy) { + var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary); + var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]); + var firstClippingParent = clippingParents2[0]; + var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) { + var rect = getClientRectFromMixedType(element, clippingParent, strategy); + accRect.top = max(rect.top, accRect.top); + accRect.right = min(rect.right, accRect.right); + accRect.bottom = min(rect.bottom, accRect.bottom); + accRect.left = max(rect.left, accRect.left); + return accRect; + }, getClientRectFromMixedType(element, firstClippingParent, strategy)); + clippingRect.width = clippingRect.right - clippingRect.left; + clippingRect.height = clippingRect.bottom - clippingRect.top; + clippingRect.x = clippingRect.left; + clippingRect.y = clippingRect.top; + return clippingRect; +} + +// node_modules/@popperjs/core/lib/utils/computeOffsets.js +function computeOffsets(_ref) { + var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement; + var basePlacement = placement ? getBasePlacement(placement) : null; + var variation = placement ? getVariation(placement) : null; + var commonX = reference2.x + reference2.width / 2 - element.width / 2; + var commonY = reference2.y + reference2.height / 2 - element.height / 2; + var offsets; + switch (basePlacement) { + case top: + offsets = { + x: commonX, + y: reference2.y - element.height + }; + break; + case bottom: + offsets = { + x: commonX, + y: reference2.y + reference2.height + }; + break; + case right: + offsets = { + x: reference2.x + reference2.width, + y: commonY + }; + break; + case left: + offsets = { + x: reference2.x - element.width, + y: commonY + }; + break; + default: + offsets = { + x: reference2.x, + y: reference2.y + }; + } + var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; + if (mainAxis != null) { + var len = mainAxis === "y" ? "height" : "width"; + switch (variation) { + case start: + offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2); + break; + case end: + offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2); + break; + default: + } + } + return offsets; +} + +// node_modules/@popperjs/core/lib/utils/detectOverflow.js +function detectOverflow(state, options) { + if (options === void 0) { + options = {}; + } + var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$strategy = _options.strategy, strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; + var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); + var altContext = elementContext === popper ? reference : popper; + var popperRect = state.rects.popper; + var element = state.elements[altBoundary ? altContext : elementContext]; + var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy); + var referenceClientRect = getBoundingClientRect(state.elements.reference); + var popperOffsets2 = computeOffsets({ + reference: referenceClientRect, + element: popperRect, + strategy: "absolute", + placement + }); + var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2)); + var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; + var overflowOffsets = { + top: clippingClientRect.top - elementClientRect.top + paddingObject.top, + bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, + left: clippingClientRect.left - elementClientRect.left + paddingObject.left, + right: elementClientRect.right - clippingClientRect.right + paddingObject.right + }; + var offsetData = state.modifiersData.offset; + if (elementContext === popper && offsetData) { + var offset2 = offsetData[placement]; + Object.keys(overflowOffsets).forEach(function(key) { + var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; + var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x"; + overflowOffsets[key] += offset2[axis] * multiply; + }); + } + return overflowOffsets; +} + +// node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js +function computeAutoPlacement(state, options) { + if (options === void 0) { + options = {}; + } + var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; + var variation = getVariation(placement); + var placements2 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) { + return getVariation(placement2) === variation; + }) : basePlacements; + var allowedPlacements = placements2.filter(function(placement2) { + return allowedAutoPlacements.indexOf(placement2) >= 0; + }); + if (allowedPlacements.length === 0) { + allowedPlacements = placements2; + } + var overflows = allowedPlacements.reduce(function(acc, placement2) { + acc[placement2] = detectOverflow(state, { + placement: placement2, + boundary, + rootBoundary, + padding + })[getBasePlacement(placement2)]; + return acc; + }, {}); + return Object.keys(overflows).sort(function(a, b) { + return overflows[a] - overflows[b]; + }); +} + +// node_modules/@popperjs/core/lib/modifiers/flip.js +function getExpandedFallbackPlacements(placement) { + if (getBasePlacement(placement) === auto) { + return []; + } + var oppositePlacement = getOppositePlacement(placement); + return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; +} +function flip(_ref) { + var state = _ref.state, options = _ref.options, name = _ref.name; + if (state.modifiersData[name]._skip) { + return; + } + var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements; + var preferredPlacement = state.options.placement; + var basePlacement = getBasePlacement(preferredPlacement); + var isBasePlacement = basePlacement === preferredPlacement; + var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); + var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) { + return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, { + placement: placement2, + boundary, + rootBoundary, + padding, + flipVariations, + allowedAutoPlacements + }) : placement2); + }, []); + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var checksMap = /* @__PURE__ */ new Map(); + var makeFallbackChecks = true; + var firstFittingPlacement = placements2[0]; + for (var i = 0; i < placements2.length; i++) { + var placement = placements2[i]; + var _basePlacement = getBasePlacement(placement); + var isStartVariation = getVariation(placement) === start; + var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; + var len = isVertical ? "width" : "height"; + var overflow = detectOverflow(state, { + placement, + boundary, + rootBoundary, + altBoundary, + padding + }); + var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; + if (referenceRect[len] > popperRect[len]) { + mainVariationSide = getOppositePlacement(mainVariationSide); + } + var altVariationSide = getOppositePlacement(mainVariationSide); + var checks = []; + if (checkMainAxis) { + checks.push(overflow[_basePlacement] <= 0); + } + if (checkAltAxis) { + checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); + } + if (checks.every(function(check) { + return check; + })) { + firstFittingPlacement = placement; + makeFallbackChecks = false; + break; + } + checksMap.set(placement, checks); + } + if (makeFallbackChecks) { + var numberOfChecks = flipVariations ? 3 : 1; + var _loop = function _loop2(_i2) { + var fittingPlacement = placements2.find(function(placement2) { + var checks2 = checksMap.get(placement2); + if (checks2) { + return checks2.slice(0, _i2).every(function(check) { + return check; + }); + } + }); + if (fittingPlacement) { + firstFittingPlacement = fittingPlacement; + return "break"; + } + }; + for (var _i = numberOfChecks; _i > 0; _i--) { + var _ret = _loop(_i); + if (_ret === "break") + break; + } + } + if (state.placement !== firstFittingPlacement) { + state.modifiersData[name]._skip = true; + state.placement = firstFittingPlacement; + state.reset = true; + } +} +var flip_default = { + name: "flip", + enabled: true, + phase: "main", + fn: flip, + requiresIfExists: ["offset"], + data: { + _skip: false + } +}; + +// node_modules/@popperjs/core/lib/modifiers/hide.js +function getSideOffsets(overflow, rect, preventedOffsets) { + if (preventedOffsets === void 0) { + preventedOffsets = { + x: 0, + y: 0 + }; + } + return { + top: overflow.top - rect.height - preventedOffsets.y, + right: overflow.right - rect.width + preventedOffsets.x, + bottom: overflow.bottom - rect.height + preventedOffsets.y, + left: overflow.left - rect.width - preventedOffsets.x + }; +} +function isAnySideFullyClipped(overflow) { + return [top, right, bottom, left].some(function(side) { + return overflow[side] >= 0; + }); +} +function hide(_ref) { + var state = _ref.state, name = _ref.name; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var preventedOffsets = state.modifiersData.preventOverflow; + var referenceOverflow = detectOverflow(state, { + elementContext: "reference" + }); + var popperAltOverflow = detectOverflow(state, { + altBoundary: true + }); + var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); + var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); + var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); + var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); + state.modifiersData[name] = { + referenceClippingOffsets, + popperEscapeOffsets, + isReferenceHidden, + hasPopperEscaped + }; + state.attributes.popper = Object.assign({}, state.attributes.popper, { + "data-popper-reference-hidden": isReferenceHidden, + "data-popper-escaped": hasPopperEscaped + }); +} +var hide_default = { + name: "hide", + enabled: true, + phase: "main", + requiresIfExists: ["preventOverflow"], + fn: hide +}; + +// node_modules/@popperjs/core/lib/modifiers/offset.js +function distanceAndSkiddingToXY(placement, rects, offset2) { + var basePlacement = getBasePlacement(placement); + var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; + var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, { + placement + })) : offset2, skidding = _ref[0], distance = _ref[1]; + skidding = skidding || 0; + distance = (distance || 0) * invertDistance; + return [left, right].indexOf(basePlacement) >= 0 ? { + x: distance, + y: skidding + } : { + x: skidding, + y: distance + }; +} +function offset(_ref2) { + var state = _ref2.state, options = _ref2.options, name = _ref2.name; + var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset; + var data = placements.reduce(function(acc, placement) { + acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2); + return acc; + }, {}); + var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y; + if (state.modifiersData.popperOffsets != null) { + state.modifiersData.popperOffsets.x += x; + state.modifiersData.popperOffsets.y += y; + } + state.modifiersData[name] = data; +} +var offset_default = { + name: "offset", + enabled: true, + phase: "main", + requires: ["popperOffsets"], + fn: offset +}; + +// node_modules/@popperjs/core/lib/modifiers/popperOffsets.js +function popperOffsets(_ref) { + var state = _ref.state, name = _ref.name; + state.modifiersData[name] = computeOffsets({ + reference: state.rects.reference, + element: state.rects.popper, + strategy: "absolute", + placement: state.placement + }); +} +var popperOffsets_default = { + name: "popperOffsets", + enabled: true, + phase: "read", + fn: popperOffsets, + data: {} +}; + +// node_modules/@popperjs/core/lib/utils/getAltAxis.js +function getAltAxis(axis) { + return axis === "x" ? "y" : "x"; +} + +// node_modules/@popperjs/core/lib/modifiers/preventOverflow.js +function preventOverflow(_ref) { + var state = _ref.state, options = _ref.options, name = _ref.name; + var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; + var overflow = detectOverflow(state, { + boundary, + rootBoundary, + padding, + altBoundary + }); + var basePlacement = getBasePlacement(state.placement); + var variation = getVariation(state.placement); + var isBasePlacement = !variation; + var mainAxis = getMainAxisFromPlacement(basePlacement); + var altAxis = getAltAxis(mainAxis); + var popperOffsets2 = state.modifiersData.popperOffsets; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, { + placement: state.placement + })) : tetherOffset; + var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? { + mainAxis: tetherOffsetValue, + altAxis: tetherOffsetValue + } : Object.assign({ + mainAxis: 0, + altAxis: 0 + }, tetherOffsetValue); + var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; + var data = { + x: 0, + y: 0 + }; + if (!popperOffsets2) { + return; + } + if (checkMainAxis) { + var _offsetModifierState$; + var mainSide = mainAxis === "y" ? top : left; + var altSide = mainAxis === "y" ? bottom : right; + var len = mainAxis === "y" ? "height" : "width"; + var offset2 = popperOffsets2[mainAxis]; + var min2 = offset2 + overflow[mainSide]; + var max2 = offset2 - overflow[altSide]; + var additive = tether ? -popperRect[len] / 2 : 0; + var minLen = variation === start ? referenceRect[len] : popperRect[len]; + var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; + var arrowElement = state.elements.arrow; + var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { + width: 0, + height: 0 + }; + var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject(); + var arrowPaddingMin = arrowPaddingObject[mainSide]; + var arrowPaddingMax = arrowPaddingObject[altSide]; + var arrowLen = within(0, referenceRect[len], arrowRect[len]); + var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; + var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; + var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); + var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; + var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; + var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset; + var tetherMax = offset2 + maxOffset - offsetModifierValue; + var preventedOffset = within(tether ? min(min2, tetherMin) : min2, offset2, tether ? max(max2, tetherMax) : max2); + popperOffsets2[mainAxis] = preventedOffset; + data[mainAxis] = preventedOffset - offset2; + } + if (checkAltAxis) { + var _offsetModifierState$2; + var _mainSide = mainAxis === "x" ? top : left; + var _altSide = mainAxis === "x" ? bottom : right; + var _offset = popperOffsets2[altAxis]; + var _len = altAxis === "y" ? "height" : "width"; + var _min = _offset + overflow[_mainSide]; + var _max = _offset - overflow[_altSide]; + var isOriginSide = [top, left].indexOf(basePlacement) !== -1; + var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; + var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; + var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; + var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); + popperOffsets2[altAxis] = _preventedOffset; + data[altAxis] = _preventedOffset - _offset; + } + state.modifiersData[name] = data; +} +var preventOverflow_default = { + name: "preventOverflow", + enabled: true, + phase: "main", + fn: preventOverflow, + requiresIfExists: ["offset"] +}; + +// node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js +function getHTMLElementScroll(element) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js +function getNodeScroll(node) { + if (node === getWindow(node) || !isHTMLElement(node)) { + return getWindowScroll(node); + } else { + return getHTMLElementScroll(node); + } +} + +// node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js +function isElementScaled(element) { + var rect = element.getBoundingClientRect(); + var scaleX = round(rect.width) / element.offsetWidth || 1; + var scaleY = round(rect.height) / element.offsetHeight || 1; + return scaleX !== 1 || scaleY !== 1; +} +function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { + if (isFixed === void 0) { + isFixed = false; + } + var isOffsetParentAnElement = isHTMLElement(offsetParent); + var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); + var documentElement = getDocumentElement(offsetParent); + var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed); + var scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + var offsets = { + x: 0, + y: 0 + }; + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== "body" || isScrollParent(documentElement)) { + scroll = getNodeScroll(offsetParent); + } + if (isHTMLElement(offsetParent)) { + offsets = getBoundingClientRect(offsetParent, true); + offsets.x += offsetParent.clientLeft; + offsets.y += offsetParent.clientTop; + } else if (documentElement) { + offsets.x = getWindowScrollBarX(documentElement); + } + } + return { + x: rect.left + scroll.scrollLeft - offsets.x, + y: rect.top + scroll.scrollTop - offsets.y, + width: rect.width, + height: rect.height + }; +} + +// node_modules/@popperjs/core/lib/utils/orderModifiers.js +function order(modifiers) { + var map = /* @__PURE__ */ new Map(); + var visited = /* @__PURE__ */ new Set(); + var result = []; + modifiers.forEach(function(modifier) { + map.set(modifier.name, modifier); + }); + function sort(modifier) { + visited.add(modifier.name); + var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); + requires.forEach(function(dep) { + if (!visited.has(dep)) { + var depModifier = map.get(dep); + if (depModifier) { + sort(depModifier); + } + } + }); + result.push(modifier); + } + modifiers.forEach(function(modifier) { + if (!visited.has(modifier.name)) { + sort(modifier); + } + }); + return result; +} +function orderModifiers(modifiers) { + var orderedModifiers = order(modifiers); + return modifierPhases.reduce(function(acc, phase) { + return acc.concat(orderedModifiers.filter(function(modifier) { + return modifier.phase === phase; + })); + }, []); +} + +// node_modules/@popperjs/core/lib/utils/debounce.js +function debounce(fn2) { + var pending; + return function() { + if (!pending) { + pending = new Promise(function(resolve) { + Promise.resolve().then(function() { + pending = void 0; + resolve(fn2()); + }); + }); + } + return pending; + }; +} + +// node_modules/@popperjs/core/lib/utils/mergeByName.js +function mergeByName(modifiers) { + var merged = modifiers.reduce(function(merged2, current) { + var existing = merged2[current.name]; + merged2[current.name] = existing ? Object.assign({}, existing, current, { + options: Object.assign({}, existing.options, current.options), + data: Object.assign({}, existing.data, current.data) + }) : current; + return merged2; + }, {}); + return Object.keys(merged).map(function(key) { + return merged[key]; + }); +} + +// node_modules/@popperjs/core/lib/createPopper.js +var DEFAULT_OPTIONS = { + placement: "bottom", + modifiers: [], + strategy: "absolute" +}; +function areValidElements() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return !args.some(function(element) { + return !(element && typeof element.getBoundingClientRect === "function"); + }); +} +function popperGenerator(generatorOptions) { + if (generatorOptions === void 0) { + generatorOptions = {}; + } + var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers2 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; + return function createPopper2(reference2, popper2, options) { + if (options === void 0) { + options = defaultOptions; + } + var state = { + placement: "bottom", + orderedModifiers: [], + options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), + modifiersData: {}, + elements: { + reference: reference2, + popper: popper2 + }, + attributes: {}, + styles: {} + }; + var effectCleanupFns = []; + var isDestroyed = false; + var instance = { + state, + setOptions: function setOptions(setOptionsAction) { + var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction; + cleanupModifierEffects(); + state.options = Object.assign({}, defaultOptions, state.options, options2); + state.scrollParents = { + reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [], + popper: listScrollParents(popper2) + }; + var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers2, state.options.modifiers))); + state.orderedModifiers = orderedModifiers.filter(function(m) { + return m.enabled; + }); + runModifierEffects(); + return instance.update(); + }, + forceUpdate: function forceUpdate() { + if (isDestroyed) { + return; + } + var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper; + if (!areValidElements(reference3, popper3)) { + return; + } + state.rects = { + reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"), + popper: getLayoutRect(popper3) + }; + state.reset = false; + state.placement = state.options.placement; + state.orderedModifiers.forEach(function(modifier) { + return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); + }); + for (var index = 0; index < state.orderedModifiers.length; index++) { + if (state.reset === true) { + state.reset = false; + index = -1; + continue; + } + var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name; + if (typeof fn2 === "function") { + state = fn2({ + state, + options: _options, + name, + instance + }) || state; + } + } + }, + update: debounce(function() { + return new Promise(function(resolve) { + instance.forceUpdate(); + resolve(state); + }); + }), + destroy: function destroy() { + cleanupModifierEffects(); + isDestroyed = true; + } + }; + if (!areValidElements(reference2, popper2)) { + return instance; + } + instance.setOptions(options).then(function(state2) { + if (!isDestroyed && options.onFirstUpdate) { + options.onFirstUpdate(state2); + } + }); + function runModifierEffects() { + state.orderedModifiers.forEach(function(_ref) { + var name = _ref.name, _ref$options = _ref.options, options2 = _ref$options === void 0 ? {} : _ref$options, effect4 = _ref.effect; + if (typeof effect4 === "function") { + var cleanupFn = effect4({ + state, + name, + instance, + options: options2 + }); + var noopFn = function noopFn2() { + }; + effectCleanupFns.push(cleanupFn || noopFn); + } + }); + } + function cleanupModifierEffects() { + effectCleanupFns.forEach(function(fn2) { + return fn2(); + }); + effectCleanupFns = []; + } + return instance; + }; +} + +// node_modules/@popperjs/core/lib/popper.js +var defaultModifiers = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default, offset_default, flip_default, preventOverflow_default, arrow_default, hide_default]; +var createPopper = /* @__PURE__ */ popperGenerator({ + defaultModifiers +}); + +// src/suggesters/Suggest.ts +var wrapAround = (value, size) => { + return (value % size + size) % size; +}; +var Suggest = class { + constructor(owner, containerEl, scope) { + this.owner = owner; + this.containerEl = containerEl; + containerEl.on("click", ".suggestion-item", this.onSuggestionClick.bind(this)); + containerEl.on("mousemove", ".suggestion-item", this.onSuggestionMouseover.bind(this)); + scope.register([], "ArrowUp", (event) => { + if (!event.isComposing) { + this.setSelectedItem(this.selectedItem - 1, true); + return false; + } + }); + scope.register([], "ArrowDown", (event) => { + if (!event.isComposing) { + this.setSelectedItem(this.selectedItem + 1, true); + return false; + } + }); + scope.register([], "Enter", (event) => { + if (!event.isComposing) { + this.useSelectedItem(event); + return false; + } + }); + } + onSuggestionClick(event, el) { + event.preventDefault(); + const item = this.suggestions.indexOf(el); + this.setSelectedItem(item, false); + this.useSelectedItem(event); + } + onSuggestionMouseover(_event, el) { + const item = this.suggestions.indexOf(el); + this.setSelectedItem(item, false); + } + setSuggestions(values) { + this.containerEl.empty(); + const suggestionEls = []; + values.forEach((value) => { + const suggestionEl = this.containerEl.createDiv("suggestion-item"); + this.owner.renderSuggestion(value, suggestionEl); + suggestionEls.push(suggestionEl); + }); + this.values = values; + this.suggestions = suggestionEls; + this.setSelectedItem(0, false); + } + useSelectedItem(event) { + const currentValue = this.values[this.selectedItem]; + if (currentValue) { + this.owner.selectSuggestion(currentValue, event); + } + } + setSelectedItem(selectedIndex, scrollIntoView) { + const normalizedIndex = wrapAround(selectedIndex, this.suggestions.length); + const prevSelectedSuggestion = this.suggestions[this.selectedItem]; + const selectedSuggestion = this.suggestions[normalizedIndex]; + prevSelectedSuggestion == null ? void 0 : prevSelectedSuggestion.removeClass("is-selected"); + selectedSuggestion == null ? void 0 : selectedSuggestion.addClass("is-selected"); + this.selectedItem = normalizedIndex; + if (scrollIntoView) { + selectedSuggestion.scrollIntoView(false); + } + } +}; +var TextInputSuggest = class { + constructor(inputEl, plugin) { + this.inputEl = inputEl; + this.plugin = plugin; + this.scope = new import_obsidian4.Scope(); + this.suggestEl = createDiv("suggestion-container"); + const suggestion = this.suggestEl.createDiv("suggestion"); + this.suggest = new Suggest(this, suggestion, this.scope); + this.scope.register([], "Escape", this.close.bind(this)); + this.inputEl.addEventListener("input", this.onInputChanged.bind(this)); + this.inputEl.addEventListener("focus", this.onInputChanged.bind(this)); + this.inputEl.addEventListener("blur", this.close.bind(this)); + this.suggestEl.on("mousedown", ".suggestion-container", (event) => { + event.preventDefault(); + }); + } + onInputChanged() { + const inputStr = this.inputEl.value; + const suggestions = this.getSuggestions(inputStr); + if (!suggestions) { + this.close(); + return; + } + if (suggestions.length > 0) { + this.suggest.setSuggestions(suggestions); + this.open(app.dom.appContainerEl, this.inputEl); + } else { + this.close(); + } + } + open(container, inputEl) { + this.plugin.app.keymap.pushScope(this.scope); + container.appendChild(this.suggestEl); + this.popper = createPopper(inputEl, this.suggestEl, { + placement: "bottom-start", + modifiers: [ + { + name: "sameWidth", + enabled: true, + fn: ({ state, instance }) => { + const targetWidth = `${state.rects.reference.width}px`; + if (state.styles.popper.width === targetWidth) { + return; + } + state.styles.popper.width = targetWidth; + instance.update(); + }, + phase: "beforeWrite", + requires: ["computeStyles"] + } + ] + }); + } + close() { + this.plugin.app.keymap.popScope(this.scope); + this.suggest.setSuggestions([]); + if (this.popper) + this.popper.destroy(); + this.suggestEl.detach(); + } +}; + +// src/suggesters/FolderSuggester.ts +var FolderSuggest = class extends TextInputSuggest { + constructor(inputEl, plugin, folder) { + super(inputEl, plugin); + this.inputEl = inputEl; + this.folder = folder; + } + get_error_msg(mode) { + switch (mode) { + case 0 /* TemplateFiles */: + return "Templates folder doesn't exist"; + case 1 /* ScriptFiles */: + return "User Scripts folder doesn't exist"; + } + } + getSuggestions(input_str) { + const folders = []; + const lower_input_str = input_str.toLowerCase(); + let files = []; + if (this.folder) { + files = this.folder.children; + } else { + files = this.plugin.app.vault.getAllLoadedFiles(); + } + files.forEach((folder) => { + if (folder instanceof import_obsidian5.TFolder && folder.path.toLowerCase().contains(lower_input_str) && !this.plugin.settings.excludeFolders.find((f) => f.path === folder.path)) { + folders.push(folder); + } + }); + return folders; + } + renderSuggestion(folder, el) { + el.setText(folder.path); + } + selectSuggestion(folder) { + this.inputEl.value = folder.path; + this.inputEl.trigger("input"); + this.close(); + } +}; + +// src/ExcludeFolders/modals/ExcludeFolderSettings.ts +var import_obsidian6 = require("obsidian"); +var ExcludedFolderSettings = class extends import_obsidian6.Modal { + constructor(app2, plugin, excludedFolder) { + super(app2); + this.plugin = plugin; + this.app = app2; + this.excludedFolder = excludedFolder; + } + onOpen() { + this.display(); + } + display() { + const { contentEl } = this; + contentEl.empty(); + contentEl.createEl("h2", { text: "Excluded folder settings" }); + new import_obsidian6.Setting(contentEl).setName("Include subfolders").setDesc("Choose if the subfolders of the folder should also be excluded").addToggle((toggle) => toggle.setValue(this.excludedFolder.subFolders).onChange(async (value) => { + this.excludedFolder.subFolders = value; + await this.plugin.saveSettings(true); + })); + new import_obsidian6.Setting(contentEl).setName("Disable folder name sync").setDesc("Choose if the folder note should be renamed when the folder name is changed").addToggle((toggle) => toggle.setValue(this.excludedFolder.disableSync).onChange(async (value) => { + this.excludedFolder.disableSync = value; + await this.plugin.saveSettings(); + })); + new import_obsidian6.Setting(contentEl).setName("Don't show folder in folder overview").setDesc("Choose if the folder should be shown in the folder overview").addToggle((toggle) => toggle.setValue(this.excludedFolder.excludeFromFolderOverview).onChange(async (value) => { + this.excludedFolder.excludeFromFolderOverview = value; + await this.plugin.saveSettings(); + })); + new import_obsidian6.Setting(contentEl).setName("Disable auto creation of folder notes in this folder").setDesc("Choose if a folder note should be created when a new folder is created").addToggle((toggle) => toggle.setValue(this.excludedFolder.disableAutoCreate).onChange(async (value) => { + this.excludedFolder.disableAutoCreate = value; + await this.plugin.saveSettings(); + })); + new import_obsidian6.Setting(contentEl).setName("Disable open folder note").setDesc("Choose if the folder note should be opened when the folder is opened").addToggle((toggle) => toggle.setValue(this.excludedFolder.disableFolderNote).onChange(async (value) => { + this.excludedFolder.disableFolderNote = value; + await this.plugin.saveSettings(true); + this.display(); + })); + if (!this.excludedFolder.disableFolderNote) { + new import_obsidian6.Setting(contentEl).setName("Collapse folder when opening folder note").setDesc("Choose if the folder should be collapsed when the folder note is opened").addToggle((toggle) => toggle.setValue(this.excludedFolder.enableCollapsing).onChange(async (value) => { + this.excludedFolder.enableCollapsing = value; + await this.plugin.saveSettings(); + })); + } + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/ExcludeFolders/functions/patternFunctions.ts +var import_obsidian8 = require("obsidian"); + +// src/ExcludeFolders/modals/PatternSettings.ts +var import_obsidian7 = require("obsidian"); +var PatternSettings = class extends import_obsidian7.Modal { + constructor(app2, plugin, pattern) { + super(app2); + this.plugin = plugin; + this.app = app2; + this.pattern = pattern; + } + onOpen() { + this.display(); + } + display() { + const { contentEl } = this; + contentEl.empty(); + contentEl.createEl("h2", { text: "Pattern settings" }); + new import_obsidian7.Setting(contentEl).setName("Disable folder name sync").setDesc("Choose if the folder name should be renamed when the file name has been changed").addToggle((toggle) => toggle.setValue(this.pattern.disableSync).onChange(async (value) => { + this.pattern.disableSync = value; + await this.plugin.saveSettings(); + })); + new import_obsidian7.Setting(contentEl).setName("Disable auto creation of folder notes in this folder").setDesc("Choose if a folder note should be created when a new folder is created that matches this pattern").addToggle((toggle) => toggle.setValue(this.pattern.disableAutoCreate).onChange(async (value) => { + this.pattern.disableAutoCreate = value; + await this.plugin.saveSettings(); + })); + new import_obsidian7.Setting(contentEl).setName("Don't show folder in folder overview").setDesc("Choose if the folder should be shown in the folder overview").addToggle((toggle) => toggle.setValue(this.pattern.excludeFromFolderOverview).onChange(async (value) => { + this.pattern.excludeFromFolderOverview = value; + await this.plugin.saveSettings(); + })); + new import_obsidian7.Setting(contentEl).setName("Disable open folder note").setDesc("Choose if the folder note should be opened when the folder is opened").addToggle((toggle) => toggle.setValue(this.pattern.disableFolderNote).onChange(async (value) => { + this.pattern.disableFolderNote = value; + await this.plugin.saveSettings(); + this.display(); + })); + if (!this.pattern.disableFolderNote) { + new import_obsidian7.Setting(contentEl).setName("Collapse folder when opening folder note").setDesc("Choose if the folder should be collapsed when the folder note is opened").addToggle((toggle) => toggle.setValue(this.pattern.enableCollapsing).onChange(async (value) => { + this.pattern.enableCollapsing = value; + await this.plugin.saveSettings(); + })); + } + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/ExcludeFolders/functions/patternFunctions.ts +function updatePattern(plugin, pattern, newPattern) { + plugin.settings.excludeFolders = plugin.settings.excludeFolders.filter((folder) => folder.string !== pattern.string); + addExcludedFolder(plugin, newPattern); +} +function deletePattern(plugin, pattern) { + plugin.settings.excludeFolders = plugin.settings.excludeFolders.filter((folder) => folder.string !== pattern.string || folder.type === "folder"); + plugin.saveSettings(); + resyncArray(plugin); +} +function getExcludedFolderByPattern(plugin, folderName) { + return plugin.settings.excludeFolders.filter((s) => s.type == "pattern").find((pattern) => { + if (!pattern.string) { + return false; + } + const string = pattern.string.trim(); + if (!string.startsWith("{regex}") && !(string.startsWith("*") || string.endsWith("*"))) { + return false; + } + const regex = string.replace("{regex}", "").trim(); + if (string.startsWith("{regex}") && regex === "") { + return false; + } + if (regex !== void 0 && string.startsWith("{regex}")) { + const match = new RegExp(regex).exec(folderName); + if (match) { + return true; + } + } else if (string.startsWith("*") && string.endsWith("*")) { + if (folderName.includes(string.slice(1, -1))) { + return true; + } + } else if (string.startsWith("*")) { + if (folderName.endsWith(string.slice(1))) { + return true; + } + } else if (string.endsWith("*")) { + if (folderName.startsWith(string.slice(0, -1))) { + return true; + } + } + }); +} +function addExcludePatternListItem(settings, containerEl, pattern) { + const plugin = settings.plugin; + const setting = new import_obsidian8.Setting(containerEl); + setting.setClass("fn-exclude-folder-list"); + setting.addSearch((cb) => { + cb.containerEl.addClass("fn-exclude-folder-path"); + cb.setPlaceholder("Pattern"); + cb.setValue(pattern.string); + cb.onChange((value) => { + if (plugin.settings.excludeFolders.find((folder) => folder.string === value)) { + return; + } + pattern.string = value; + updatePattern(plugin, pattern, pattern); + }); + }); + setting.addButton((cb) => { + cb.setIcon("edit"); + cb.setTooltip("Edit pattern"); + cb.onClick(() => { + new PatternSettings(plugin.app, plugin, pattern).open(); + }); + }); + setting.addButton((cb) => { + cb.setIcon("up-chevron-glyph"); + cb.setTooltip("Move up"); + cb.onClick(() => { + if (pattern.position === 0) { + return; + } + pattern.position -= 1; + updatePattern(plugin, pattern, pattern); + const oldPattern = plugin.settings.excludeFolders.find((folder) => folder.position === pattern.position); + if (oldPattern) { + oldPattern.position += 1; + if (oldPattern.type === "pattern") { + updatePattern(plugin, oldPattern, oldPattern); + } else { + updateExcludedFolder(plugin, oldPattern, oldPattern); + } + } + settings.display(); + }); + }); + setting.addButton((cb) => { + cb.setIcon("down-chevron-glyph"); + cb.setTooltip("Move down"); + cb.onClick(() => { + if (pattern.position === plugin.settings.excludeFolders.length - 1) { + return; + } + pattern.position += 1; + updatePattern(plugin, pattern, pattern); + const oldPattern = plugin.settings.excludeFolders.find((folder) => folder.position === pattern.position); + if (oldPattern) { + oldPattern.position -= 1; + if (oldPattern.type === "pattern") { + updatePattern(plugin, oldPattern, oldPattern); + } else { + updateExcludedFolder(plugin, oldPattern, oldPattern); + } + } + settings.display(); + }); + }); + setting.addButton((cb) => { + cb.setIcon("trash-2"); + cb.setTooltip("Delete pattern"); + cb.onClick(() => { + deletePattern(plugin, pattern); + setting.clear(); + setting.settingEl.remove(); + }); + }); +} + +// src/ExcludeFolders/functions/folderFunctions.ts +function getExcludedFolder(plugin, path) { + const folderName = getFolderNameFromPathString(path); + const matchedPattern = getExcludedFolderByPattern(plugin, folderName); + if (matchedPattern) { + return matchedPattern; + } + const excludedFolder = getExcludedFolderByPath(plugin, path); + if ((excludedFolder == null ? void 0 : excludedFolder.path) === "") { + return; + } + return excludedFolder; +} +function getExcludedFolderByPath(plugin, path) { + return plugin.settings.excludeFolders.find((excludedFolder) => { + if (excludedFolder.path === path) { + return true; + } + if (!excludedFolder.subFolders) { + return false; + } + const excludedFolderPath = excludedFolder.path.includes("/") ? excludedFolder.path : excludedFolder.path + "/"; + let folderPath = getFolderPathFromString(path); + folderPath = folderPath.includes("/") ? folderPath : folderPath + "/"; + if (folderPath.includes("/") || folderPath.includes("\\")) { + return folderPath.startsWith(excludedFolderPath) || folderPath === excludedFolderPath; + } else { + return folderPath === excludedFolderPath; + } + }); +} +function addExcludedFolder(plugin, excludedFolder) { + plugin.settings.excludeFolders.push(excludedFolder); + plugin.saveSettings(true); +} +function deleteExcludedFolder(plugin, excludedFolder) { + plugin.settings.excludeFolders = plugin.settings.excludeFolders.filter((folder) => folder.path !== excludedFolder.path || folder.type === "pattern"); + plugin.saveSettings(true); + resyncArray(plugin); +} +function updateExcludedFolder(plugin, excludedFolder, newExcludeFolder) { + plugin.settings.excludeFolders = plugin.settings.excludeFolders.filter((folder) => folder.path !== excludedFolder.path); + addExcludedFolder(plugin, newExcludeFolder); +} +function resyncArray(plugin) { + plugin.settings.excludeFolders = plugin.settings.excludeFolders.sort((a, b) => a.position - b.position); + plugin.settings.excludeFolders.forEach((folder, index) => { + folder.position = index; + }); + plugin.saveSettings(); +} +function addExcludeFolderListItem(settings, containerEl, excludedFolder) { + const plugin = settings.plugin; + const setting = new import_obsidian9.Setting(containerEl); + setting.setClass("fn-exclude-folder-list"); + setting.addSearch((cb) => { + new FolderSuggest(cb.inputEl, plugin); + cb.containerEl.addClass("fn-exclude-folder-path"); + cb.setPlaceholder("Folder path"); + cb.setValue(excludedFolder.path); + cb.onChange((value) => { + if (value.startsWith("{regex}") || value.includes("*")) { + deleteExcludedFolder(plugin, excludedFolder); + const pattern = new ExcludePattern(value, plugin.settings.excludeFolders.length, plugin); + addExcludedFolder(plugin, pattern); + addExcludePatternListItem(settings, containerEl, pattern); + setting.clear(); + setting.settingEl.remove(); + } + if (!plugin.app.vault.getAbstractFileByPath(value)) + return; + excludedFolder.path = value; + updateExcludedFolder(plugin, excludedFolder, excludedFolder); + }); + }); + setting.addButton((cb) => { + cb.setIcon("edit"); + cb.setTooltip("Edit folder note"); + cb.onClick(() => { + new ExcludedFolderSettings(plugin.app, plugin, excludedFolder).open(); + }); + }); + setting.addButton((cb) => { + cb.setIcon("up-chevron-glyph"); + cb.setTooltip("Move up"); + cb.onClick(() => { + if (excludedFolder.position === 0) { + return; + } + excludedFolder.position -= 1; + updateExcludedFolder(plugin, excludedFolder, excludedFolder); + const oldExcludedFolder = plugin.settings.excludeFolders.find((folder) => folder.position === excludedFolder.position); + if (oldExcludedFolder) { + oldExcludedFolder.position += 1; + if (oldExcludedFolder.type === "pattern") { + updatePattern(plugin, oldExcludedFolder, oldExcludedFolder); + } else { + updateExcludedFolder(plugin, oldExcludedFolder, oldExcludedFolder); + } + } + settings.display(); + }); + }); + setting.addButton((cb) => { + cb.setIcon("down-chevron-glyph"); + cb.setTooltip("Move down"); + cb.onClick(() => { + if (excludedFolder.position === plugin.settings.excludeFolders.length - 1) { + return; + } + excludedFolder.position += 1; + updateExcludedFolder(plugin, excludedFolder, excludedFolder); + const oldExcludedFolder = plugin.settings.excludeFolders.find((folder) => folder.position === excludedFolder.position); + if (oldExcludedFolder) { + oldExcludedFolder.position -= 1; + if (oldExcludedFolder.type === "pattern") { + updatePattern(plugin, oldExcludedFolder, oldExcludedFolder); + } else { + updateExcludedFolder(plugin, oldExcludedFolder, oldExcludedFolder); + } + } + settings.display(); + }); + }); + setting.addButton((cb) => { + cb.setIcon("trash-2"); + cb.setTooltip("Delete excluded folder"); + cb.onClick(() => { + deleteExcludedFolder(plugin, excludedFolder); + setting.clear(); + setting.settingEl.remove(); + }); + }); +} + +// src/ExcludeFolders/ExcludeFolder.ts +var ExcludedFolder = class { + constructor(path, position, plugin) { + this.type = "folder"; + this.path = path; + this.subFolders = plugin.settings.excludeFolderDefaultSettings.subFolders; + this.disableSync = plugin.settings.excludeFolderDefaultSettings.disableSync; + this.disableAutoCreate = plugin.settings.excludeFolderDefaultSettings.disableAutoCreate; + this.disableFolderNote = plugin.settings.excludeFolderDefaultSettings.disableFolderNote; + this.enableCollapsing = plugin.settings.excludeFolderDefaultSettings.enableCollapsing; + this.position = position; + this.excludeFromFolderOverview = plugin.settings.excludeFolderDefaultSettings.excludeFromFolderOverview; + this.string = ""; + this.hideInSettings = false; + } +}; + +// src/functions/excalidraw.ts +async function openExcalidrawView(leaf) { + const { excalidraw, excalidrawEnabled } = await getExcalidrawPlugin(this.app); + if (excalidrawEnabled) { + excalidraw.setExcalidrawView(leaf); + } +} +async function getExcalidrawPlugin(app2) { + const excalidraw = app2.plugins.plugins["obsidian-excalidraw-plugin"]; + const excalidrawEnabled = app2.plugins.enabledPlugins.has("obsidian-excalidraw-plugin"); + return { + excalidraw, + excalidrawEnabled + }; +} + +// src/modals/AskForExtension.ts +var import_obsidian10 = require("obsidian"); +var AskForExtensionModal = class extends import_obsidian10.FuzzySuggestModal { + constructor(plugin, folderPath, openFile, extension, useModal, existingNote) { + super(plugin.app); + this.plugin = plugin; + this.folderPath = folderPath; + this.extension = extension; + this.openFile = openFile; + this.useModal = useModal; + this.existingNote = existingNote; + } + getItems() { + return this.plugin.settings.supportedFileTypes.filter((item) => item.toLowerCase() !== ".ask"); + } + getItemText(item) { + return item; + } + onChooseItem(item, evt) { + this.extension = "." + item; + createFolderNote(this.plugin, this.folderPath, this.openFile, this.extension, this.useModal, this.existingNote); + this.close(); + } +}; + +// src/functions/styleFunctions.ts +var import_obsidian11 = require("obsidian"); +function loadFileClasses(forceReload = false, plugin) { + if (plugin.activeFileExplorer === getFileExplorer() && !forceReload) { + return; + } + plugin.activeFileExplorer = getFileExplorer(); + plugin.app.vault.getAllLoadedFiles().forEach((file) => { + if (!(file instanceof import_obsidian11.TFolder)) { + return; + } + const folderNote = getFolderNote(plugin, file.path); + if (!folderNote) { + removeCSSClassFromEL(file == null ? void 0 : file.path, "has-folder-note"); + removeCSSClassFromEL(file == null ? void 0 : file.path, "only-has-folder-note"); + return; + } + const excludedFolder = getExcludedFolder(plugin, file.path); + if (excludedFolder == null ? void 0 : excludedFolder.disableFolderNote) { + removeCSSClassFromEL(folderNote.path, "is-folder-note"); + removeCSSClassFromEL(file.path, "has-folder-note"); + removeCSSClassFromEL(file == null ? void 0 : file.path, "only-has-folder-note"); + } else { + addCSSClassToTitleEL(folderNote.path, "is-folder-note"); + addCSSClassToTitleEL(file.path, "has-folder-note"); + if (plugin.isEmptyFolderNoteFolder(file)) { + addCSSClassToTitleEL(file.path, "only-has-folder-note"); + } else { + removeCSSClassFromEL(file.path, "only-has-folder-note"); + } + } + }); +} +function applyCSSClassesToFolder(folderPath, plugin) { + const folder = plugin.app.vault.getAbstractFileByPath(folderPath); + if (!folder || !(folder instanceof import_obsidian11.TFolder)) { + return; + } + const excludedFolder = getExcludedFolder(plugin, folder.path); + if (excludedFolder == null ? void 0 : excludedFolder.disableFolderNote) { + return; + } + const folderNote = getFolderNote(plugin, folder.path); + if (!folderNote) { + return; + } + addCSSClassesToBothFolderAndNote(folderNote, folder, plugin); +} +function addCSSClassesToBothFolderAndNote(file, folder, plugin) { + addCSSClassToFolderNote(file); + addCSSClassesToFolder(folder, plugin); +} +function addCSSClassesToFolder(folder, plugin) { + addCSSClassToTitleEL(folder.path, "has-folder-note"); + if (plugin.isEmptyFolderNoteFolder(folder)) { + addCSSClassToTitleEL(folder.path, "only-has-folder-note"); + } else { + removeCSSClassFromEL(folder.path, "only-has-folder-note"); + } +} +function addCSSClassToFolderNote(file) { + addCSSClassToTitleEL(file.path, "is-folder-note"); +} +async function addCSSClassToTitleEL(path, cssClass, waitForCreate = false, count = 0) { + const fileExplorerItem = getEl(path); + if (!fileExplorerItem) { + if (waitForCreate && count < 5) { + await new Promise((r) => setTimeout(r, 500)); + addCSSClassToTitleEL(path, cssClass, waitForCreate, count + 1); + return; + } + return; + } + fileExplorerItem.addClass(cssClass); + const viewHeaderItems = document.querySelectorAll(`[data-path="${path}"]`); + viewHeaderItems.forEach((item) => { + item.addClass(cssClass); + }); +} +function removeCSSClassFromEL(path, cssClass) { + if (!path) + return; + const fileExplorerItem = getEl(path); + const viewHeaderItems = document.querySelectorAll(`[data-path="${path}"]`); + viewHeaderItems.forEach((item) => { + item.removeClass(cssClass); + }); + if (!fileExplorerItem) { + return; + } + fileExplorerItem.removeClass(cssClass); +} +function getEl(path) { + const fileExplorer = getFileExplorer(); + if (!fileExplorer) { + return null; + } + const fileExplorerItem = fileExplorer.view.fileItems[path]; + if (!fileExplorerItem) { + return null; + } + if (fileExplorerItem.selfEl) + return fileExplorerItem.selfEl; + return fileExplorerItem.titleEl; +} + +// src/functions/folderNoteFunctions.ts +var defaultExcalidrawTemplate = `--- + +excalidraw-plugin: parsed +tags: [excalidraw] + +--- +==\u26A0 Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. \u26A0== + + +%% +# Drawing +\`\`\`json +{"type":"excalidraw","version":2,"source":"https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/1.9.20","elements":[],"appState":{"gridSize":null,"viewBackgroundColor":"#ffffff"}} +\`\`\` +%%`; +async function createFolderNote(plugin, folderPath, openFile, extension, useModal, existingNote) { + var _a; + const leaf = plugin.app.workspace.getLeaf(false); + const folderName = getFolderNameFromPathString(folderPath); + const fileName = plugin.settings.folderNoteName.replace("{{folder_name}}", folderName); + let folderNoteType = extension != null ? extension : plugin.settings.folderNoteType; + if (folderNoteType === ".excalidraw") { + folderNoteType = ".md"; + extension = ".excalidraw"; + } else if (folderNoteType === ".ask") { + return new AskForExtensionModal(plugin, folderPath, openFile, folderNoteType, useModal, existingNote).open(); + } + let path = ""; + if (plugin.settings.storageLocation === "parentFolder") { + const parentFolderPath = getFolderPathFromString(folderPath); + if (parentFolderPath.trim() === "") { + path = `${fileName}${folderNoteType}`; + } else { + path = `${parentFolderPath}/${fileName}${folderNoteType}`; + } + } else if (plugin.settings.storageLocation === "vaultFolder") { + path = `${fileName}${folderNoteType}`; + } else { + path = `${folderPath}/${fileName}${folderNoteType}`; + } + let file; + if (!existingNote) { + let content = ""; + if (extension !== ".md") { + if (plugin.settings.templatePath && folderNoteType.split(".").pop() == plugin.settings.templatePath.split(".").pop()) { + const templateFile = plugin.app.vault.getAbstractFileByPath(plugin.settings.templatePath); + if (templateFile instanceof import_obsidian12.TFile) { + if (["md", "canvas", "txt"].includes(templateFile.extension)) { + content = await plugin.app.vault.read(templateFile); + if (extension === ".excalidraw" && !content.includes("==\u26A0 Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. \u26A0==")) { + content = defaultExcalidrawTemplate; + } + } else { + return plugin.app.vault.readBinary(templateFile).then(async (data) => { + file = await plugin.app.vault.createBinary(path, data); + if (openFile) { + await leaf.openFile(file); + } + }); + } + } + } else if (plugin.settings.folderNoteType === ".excalidraw" || extension === ".excalidraw") { + content = defaultExcalidrawTemplate; + } else if (plugin.settings.folderNoteType === ".canvas") { + content = "{}"; + } + } + file = await plugin.app.vault.create(path, content); + } else { + file = existingNote; + await plugin.app.fileManager.renameFile(existingNote, path).then(() => { + file = existingNote; + }); + } + if (openFile) { + if (((_a = plugin.app.workspace.getActiveFile()) == null ? void 0 : _a.path) === path) { + if (plugin.activeFolderDom) { + plugin.activeFolderDom.removeClass("fn-is-active"); + plugin.activeFolderDom = null; + } + const folder2 = getFolder2(plugin, file); + if (!folder2) { + return; + } + plugin.activeFolderDom = getEl(folder2.path); + if (plugin.activeFolderDom) + plugin.activeFolderDom.addClass("fn-is-active"); + } + await leaf.openFile(file); + if (plugin.settings.folderNoteType === ".excalidraw" || extension === ".excalidraw") { + openExcalidrawView(leaf); + } + } + const matchingExtension = (extension == null ? void 0 : extension.split(".").pop()) == plugin.settings.templatePath.split(".").pop(); + if (file && !existingNote && matchingExtension && plugin.settings.folderNoteType !== ".excalidraw") { + applyTemplate(plugin, file, leaf, plugin.settings.templatePath); + } + const folder = plugin.app.vault.getAbstractFileByPath(folderPath); + if (!(folder instanceof import_obsidian12.TFolder)) + return; + addCSSClassToTitleEL(path, "is-folder-note", true); + addCSSClassToTitleEL(folder.path, "has-folder-note"); +} +async function turnIntoFolderNote(plugin, file, folder, folderNote, skipConfirmation) { + var _a; + const extension = file.extension; + if (folderNote) { + if (plugin.settings.showRenameConfirmation && !skipConfirmation) { + return new ExistingFolderNoteModal(plugin.app, plugin, file, folder, folderNote).open(); + } + removeCSSClassFromEL(folderNote.path, "is-folder-note"); + let excludedFolder = getExcludedFolder(plugin, folder.path); + let excludedFolderExisted = true; + let disabledSync = false; + if (!excludedFolder) { + excludedFolderExisted = false; + excludedFolder = new ExcludedFolder(folder.path, plugin.settings.excludeFolders.length, plugin); + addExcludedFolder(plugin, excludedFolder); + } else if (!excludedFolder.disableSync) { + disabledSync = false; + excludedFolder.disableSync = true; + updateExcludedFolder(plugin, excludedFolder, excludedFolder); + } + const newPath = `${folder.path}/${folder.name} (${file.stat.ctime.toString().slice(10) + Math.floor(Math.random() * 1e3)}).${extension}`; + plugin.app.fileManager.renameFile(folderNote, newPath).then(() => { + if (!excludedFolder) { + return; + } + if (!excludedFolderExisted) { + deleteExcludedFolder(plugin, excludedFolder); + } else if (!disabledSync) { + excludedFolder.disableSync = false; + updateExcludedFolder(plugin, excludedFolder, excludedFolder); + } + }); + } + const folderName = folder.name; + const fileName = plugin.settings.folderNoteName.replace("{{folder_name}}", folderName); + let path = `${folder.path}/${fileName}.${extension}`; + if (plugin.settings.storageLocation === "parentFolder") { + const parentFolderPath = (_a = folder.parent) == null ? void 0 : _a.path; + if (!parentFolderPath) + return; + if (parentFolderPath.trim() === "") { + path = `${fileName}.${extension}`; + } else { + path = `${parentFolderPath}/${fileName}.${extension}`; + } + } + await plugin.app.fileManager.renameFile(file, path); + addCSSClassToTitleEL(path, "is-folder-note", true); + addCSSClassToTitleEL(folder.path, "has-folder-note"); +} +async function openFolderNote(plugin, file, evt) { + var _a; + const path = file.path; + if (((_a = plugin.app.workspace.getActiveFile()) == null ? void 0 : _a.path) === path && !(import_obsidian12.Keymap.isModEvent(evt) == "tab")) { + return; + } + const leaf = plugin.app.workspace.getLeaf(import_obsidian12.Keymap.isModEvent(evt) || plugin.settings.openInNewTab); + if (file instanceof import_obsidian12.TFile) { + await leaf.openFile(file); + } +} +async function deleteFolderNote(plugin, file, displayModal) { + if (plugin.settings.showDeleteConfirmation && displayModal) { + return new DeleteConfirmationModal(plugin.app, plugin, file).open(); + } + const folder = getFolder2(plugin, file); + if (!folder) + return; + removeCSSClassFromEL(folder.path, "has-folder-note"); + switch (plugin.settings.deleteFilesAction) { + case "trash": + await plugin.app.vault.trash(file, true); + break; + case "obsidianTrash": + await plugin.app.vault.trash(file, false); + break; + case "delete": + await plugin.app.vault.delete(file); + break; + } +} +function extractFolderName(template, changedFileName) { + const [prefix, suffix] = template.split("{{folder_name}}"); + if (prefix.trim() === "" && suffix.trim() === "") { + return changedFileName; + } + if (!changedFileName.startsWith(prefix) || !changedFileName.endsWith(suffix)) { + return null; + } + if (changedFileName.startsWith(prefix) && prefix.trim() !== "") { + return changedFileName.slice(prefix.length).replace(suffix, ""); + } else if (changedFileName.endsWith(suffix) && suffix.trim() !== "") { + return changedFileName.slice(0, -suffix.length); + } + return null; +} +function getFolderNote(plugin, folderPath, storageLocation, file) { + if (!folderPath) + return null; + const folder = { + path: folderPath, + name: getFolderNameFromPathString(folderPath) + }; + let fileName = plugin.settings.folderNoteName.replace("{{folder_name}}", folder.name); + if (file) { + fileName = plugin.settings.folderNoteName.replace("{{folder_name}}", file.basename); + } + if (!fileName) + return null; + if ((plugin.settings.storageLocation === "parentFolder" || storageLocation === "parentFolder") && storageLocation !== "insideFolder") { + folder.path = getFolderPathFromString(folderPath); + } + let path = `${folder.path}/${fileName}`; + if (folder.path.trim() === "") { + folder.path = fileName; + path = `${fileName}`; + } + let folderNoteType = plugin.settings.folderNoteType; + if (folderNoteType === ".excalidraw") { + folderNoteType = ".md"; + } + let folderNote = plugin.app.vault.getAbstractFileByPath(path + folderNoteType); + if (folderNote instanceof import_obsidian12.TFile) { + return folderNote; + } else { + const supportedFileTypes = plugin.settings.supportedFileTypes.filter((type) => type !== plugin.settings.folderNoteType.replace(".", "")); + for (let type of supportedFileTypes) { + if (type === "excalidraw" || type === ".excalidraw") { + type = ".md"; + } + if (!type.startsWith(".")) { + type = "." + type; + } + folderNote = plugin.app.vault.getAbstractFileByPath(path + type); + if (folderNote instanceof import_obsidian12.TFile) { + return folderNote; + } + } + } +} +function getFolder2(plugin, file, storageLocation) { + var _a, _b; + if (!file) + return null; + let folderName = extractFolderName(plugin.settings.folderNoteName, file.basename); + if (plugin.settings.folderNoteName === file.basename && plugin.settings.storageLocation === "insideFolder") { + folderName = (_b = (_a = file.parent) == null ? void 0 : _a.name) != null ? _b : ""; + } + if (!folderName) + return null; + let folderPath = getFolderPathFromString(file.path); + let folder = null; + if ((plugin.settings.storageLocation === "parentFolder" || storageLocation === "parentFolder") && storageLocation !== "insideFolder") { + if (folderPath.trim() === "") { + folderPath = folderName; + } else { + folderPath = `${folderPath}/${folderName}`; + } + folder = plugin.app.vault.getAbstractFileByPath(folderPath); + } else { + folder = plugin.app.vault.getAbstractFileByPath(folderPath); + } + if (!folder) { + return null; + } + return folder; +} +function getFolderNoteFolder(plugin, folderNote, fileName) { + if (!folderNote) + return null; + let filePath = ""; + if (typeof folderNote === "string") { + filePath = folderNote; + } else { + fileName = folderNote.basename; + filePath = folderNote.path; + } + const folderName = extractFolderName(plugin.settings.folderNoteName, fileName); + if (!folderName) + return null; + let folderPath = getFolderPathFromString(filePath); + if (plugin.settings.storageLocation === "parentFolder") { + if (folderPath.trim() === "") { + folderPath = folderName; + } else { + folderPath = `${folderPath}/${folderName}`; + } + } else { + folderPath = getFolderPathFromString(filePath); + } + const folder = plugin.app.vault.getAbstractFileByPath(folderPath); + if (!folder) { + return null; + } + return folder; +} + +// src/settings/GeneralSettings.ts +var import_obsidian17 = require("obsidian"); + +// src/modals/AddSupportedFileType.ts +var import_obsidian13 = require("obsidian"); +var AddSupportedFileModal = class extends import_obsidian13.Modal { + constructor(app2, plugin, settingsTab, list) { + super(app2); + this.plugin = plugin; + this.app = app2; + this.name = ""; + this.list = list; + this.settingsTab = settingsTab; + } + onOpen() { + const { contentEl } = this; + contentEl.addEventListener("keydown", (e) => { + if (e.key === "Enter") { + this.close(); + } + }); + contentEl.createEl("h2", { text: "Extension name" }); + new import_obsidian13.Setting(contentEl).setName('Enter the name of the extension (only the short form, e.g. "md")').addText((text) => text.setValue("").onChange(async (value) => { + if (value.trim() !== "") { + this.name = value.trim(); + } + })); + } + async onClose() { + if (this.name.toLocaleLowerCase() === "markdown") { + this.name = "md"; + } + const { contentEl } = this; + if (this.name === "") { + contentEl.empty(); + this.settingsTab.display(); + } else if (this.plugin.settings.supportedFileTypes.includes(this.name.toLowerCase())) { + return new import_obsidian13.Notice("This extension is already supported"); + } else { + await this.list.addValue(this.name.toLowerCase()); + this.settingsTab.display(); + this.plugin.saveSettings(); + contentEl.empty(); + } + } +}; + +// src/events/FrontMatterTitle.ts +var import_front_matter_plugin_api_provider = __toESM(require_lib()); +var import_obsidian14 = require("obsidian"); +var FrontMatterTitlePluginHandler = class { + constructor(plugin) { + this.api = null; + this.deffer = null; + this.modifiedFolders = /* @__PURE__ */ new Map(); + this.plugin = plugin; + this.app = plugin.app; + (async () => { + var _a; + this.deffer = (0, import_front_matter_plugin_api_provider.getDefer)(this.app); + if (this.deffer.isPluginReady()) { + this.api = this.deffer.getApi(); + } else { + await this.deffer.awaitPlugin(); + this.api = this.deffer.getApi(); + if (!this.deffer.isFeaturesReady()) { + await this.deffer.awaitFeatures(); + } + } + const dispatcher = (_a = this.api) == null ? void 0 : _a.getEventDispatcher(); + if (dispatcher) { + this.dispatcher = dispatcher; + } + const event = { + name: "manager:update", + cb: (data) => { + this.handleRename(data, true); + } + }; + const ref = dispatcher == null ? void 0 : dispatcher.addListener(event); + if (ref) { + this.eventRef = ref; + } + this.plugin.app.vault.getFiles().forEach((file) => { + this.handleRename({ id: "", result: false, path: file.path }, false); + }); + this.plugin.updateBreadcrumbs(); + })(); + } + deleteEvent() { + if (this.eventRef) { + this.dispatcher.removeListener(this.eventRef); + } + } + async handleRename(data, isEvent) { + var _a, _b, _c; + if (data.data) + data = data.data; + const file = this.app.vault.getAbstractFileByPath(data.path); + if (!(file instanceof import_obsidian14.TFile)) { + return; + } + const resolver = (_b = (_a = this.api) == null ? void 0 : _a.getResolverFactory()) == null ? void 0 : _b.createResolver("#feature-id#"); + const newName = resolver == null ? void 0 : resolver.resolve((_c = file == null ? void 0 : file.path) != null ? _c : ""); + const folder = getFolder2(this.plugin, file); + if (!(folder instanceof import_obsidian14.TFolder)) { + return; + } + const folderNote = getFolderNote(this.plugin, folder.path); + if (!folderNote) { + return; + } + if (folderNote !== file) { + return; + } + if (isEvent) { + this.plugin.changeName(folder, newName, true); + } else { + this.plugin.changeName(folder, newName, false); + } + if (newName) { + folder.newName = newName; + this.modifiedFolders.set(folder.path, folder); + } else { + folder.newName = null; + this.modifiedFolders.delete(folder.path); + } + } +}; + +// src/modals/ConfirmCreation.ts +var import_obsidian15 = require("obsidian"); +var ConfirmationModal = class extends import_obsidian15.Modal { + constructor(app2, plugin) { + super(app2); + this.plugin = plugin; + this.app = app2; + this.extension = plugin.settings.folderNoteType; + } + onOpen() { + var _a, _b, _c; + this.modalEl.addClass("fn-confirmation-modal"); + let templateFolderPath; + const { templateFolder, templaterPlugin } = getTemplatePlugins(this.plugin.app); + if ((!templateFolder || (templateFolder == null ? void 0 : templateFolder.trim()) === "") && !templaterPlugin) { + templateFolderPath = ""; + } + if (templaterPlugin) { + templateFolderPath = (_b = (_a = templaterPlugin.plugin) == null ? void 0 : _a.settings) == null ? void 0 : _b.templates_folder; + } else { + templateFolderPath = templateFolder; + } + const { contentEl } = this; + contentEl.createEl("h2", { text: "Create folder note for every folder" }); + const setting = new import_obsidian15.Setting(contentEl); + setting.infoEl.createEl("p", { text: "Make sure to backup your vault before using this feature." }).style.color = "#fb464c"; + setting.infoEl.createEl("p", { text: "This feature will create a folder note for every folder in your vault." }); + setting.infoEl.createEl("p", { text: "Every folder that already has a folder note will be ignored." }); + setting.infoEl.createEl("p", { text: "Every excluded folder will be ignored." }); + if (!this.plugin.settings.templatePath || ((_c = this.plugin.settings.templatePath) == null ? void 0 : _c.trim()) === "") { + new import_obsidian15.Setting(contentEl).setName("Folder note file extension").setDesc("Choose the file extension for the folder notes.").addDropdown((cb) => { + this.plugin.settings.supportedFileTypes.forEach((extension) => { + cb.addOption("." + extension, extension); + }); + cb.setValue(this.extension); + cb.onChange(async (value) => { + this.extension = value; + }); + }); + } + new import_obsidian15.Setting(contentEl).addButton((cb) => { + cb.setButtonText("Create"); + cb.setCta(); + cb.buttonEl.focus(); + cb.onClick(async () => { + if (this.plugin.settings.templatePath && this.plugin.settings.templatePath.trim() !== "") { + this.extension = "." + this.plugin.settings.templatePath.split(".").pop(); + } + if (this.extension === ".ask") { + return new import_obsidian15.Notice("Please choose a file extension"); + } + this.close(); + const folders = this.app.vault.getAllLoadedFiles().filter((file) => file.parent instanceof import_obsidian15.TFolder); + for (const folder of folders) { + if (folder instanceof import_obsidian15.TFolder) { + const excludedFolder = getExcludedFolder(this.plugin, folder.path); + if (excludedFolder) + continue; + if (folder.path === templateFolderPath) + continue; + const folderNote = getFolderNote(this.plugin, folder.path); + if (folderNote) + continue; + await createFolderNote(this.plugin, folder.path, false, this.extension); + } + } + }); + }).addButton((cb) => { + cb.setButtonText("Cancel"); + cb.onClick(async () => { + this.close(); + }); + }); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/suggesters/TemplateSuggester.ts +var import_obsidian16 = require("obsidian"); +var TemplateSuggest = class extends TextInputSuggest { + constructor(inputEl, plugin) { + super(inputEl, plugin); + this.inputEl = inputEl; + } + get_error_msg(mode) { + switch (mode) { + case 0 /* TemplateFiles */: + return "Templates folder doesn't exist"; + case 1 /* ScriptFiles */: + return "User Scripts folder doesn't exist"; + } + } + getSuggestions(input_str) { + var _a, _b; + const { templateFolder, templaterPlugin } = getTemplatePlugins(this.plugin.app); + if ((!templateFolder || (templateFolder == null ? void 0 : templateFolder.trim()) === "") && !templaterPlugin) { + this.plugin.settings.templatePath = ""; + this.plugin.saveSettings(); + return []; + } + let folder; + if (templaterPlugin) { + folder = this.plugin.app.vault.getAbstractFileByPath((_b = (_a = templaterPlugin.plugin) == null ? void 0 : _a.settings) == null ? void 0 : _b.templates_folder); + } else { + folder = this.plugin.app.vault.getAbstractFileByPath(templateFolder); + } + const files = []; + const lower_input_str = input_str.toLowerCase(); + import_obsidian16.Vault.recurseChildren(folder, (file) => { + if (file instanceof import_obsidian16.TFile && file.path.toLowerCase().contains(lower_input_str)) { + files.push(file); + } + }); + return files; + } + renderSuggestion(file, el) { + el.setText(file.name.replace(".md", "")); + } + selectSuggestion(file) { + this.inputEl.value = file.name.replace(".md", ""); + this.inputEl.trigger("input"); + this.plugin.settings.templatePath = file.path; + this.plugin.saveSettings(); + this.close(); + } +}; + +// src/settings/GeneralSettings.ts +async function renderGeneral(settingsTab) { + const containerEl = settingsTab.settingsPage; + const nameSetting = new import_obsidian17.Setting(containerEl).setName("Folder note name").setDesc("{{folder_name}} will be replaced with the name of the folder").addText((text) => text.setValue(settingsTab.plugin.settings.newFolderNoteName).onChange(async (value) => { + if (value.trim() === "") { + return; + } + settingsTab.plugin.settings.newFolderNoteName = value; + await settingsTab.plugin.saveSettings(); + })).addButton((button) => button.setButtonText("Rename existing folder notes").setCta().onClick(async () => { + settingsTab.updateFolderNotes(settingsTab.plugin.settings.newFolderNoteName); + settingsTab.display(); + })); + nameSetting.infoEl.appendText("Requires a restart to take effect"); + nameSetting.infoEl.style.color = settingsTab.app.vault.getConfig("accentColor") || "#7d5bed"; + if (settingsTab.plugin.settings.newFolderNoteName !== "{{folder_name}}") { + new import_obsidian17.Setting(containerEl).setName("Use folder name instead of folder note name in the tab title").setDesc(`When you're using a folder note name like "folder note" and have multiple folder notes open you can't separate them anymore by their name. This setting uses the folder name instead and allows you to indentify the different files.`).addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.tabManagerEnabled).onChange(async (value) => { + if (!value) { + settingsTab.plugin.tabManager.resetTabs(); + } else { + settingsTab.plugin.settings.tabManagerEnabled = value; + settingsTab.plugin.tabManager.updateTabs(); + } + settingsTab.plugin.settings.tabManagerEnabled = value; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + })); + } + new import_obsidian17.Setting(containerEl).setName("Default folder note type for new folder notes").setDesc("Choose the default file type for new folder notes. (canvas, markdown, ...)").addDropdown((dropdown) => { + dropdown.addOption(".ask", "ask for file type"); + settingsTab.plugin.settings.supportedFileTypes.forEach((type) => { + if (type === ".md" || type === "md") { + dropdown.addOption(".md", "markdown"); + } else { + dropdown.addOption("." + type, type); + } + }); + if (!settingsTab.plugin.settings.supportedFileTypes.includes(settingsTab.plugin.settings.folderNoteType.replace(".", "")) && settingsTab.plugin.settings.folderNoteType !== ".ask") { + settingsTab.plugin.settings.folderNoteType = ".md"; + settingsTab.plugin.saveSettings(); + } + const defaultType = settingsTab.plugin.settings.folderNoteType.startsWith(".") ? settingsTab.plugin.settings.folderNoteType : "." + settingsTab.plugin.settings.folderNoteType; + dropdown.setValue(defaultType).onChange(async (value) => { + settingsTab.plugin.settings.folderNoteType = value; + settingsTab.plugin.saveSettings(); + settingsTab.display(); + }); + }); + const setting0 = new import_obsidian17.Setting(containerEl); + setting0.setName("Supported file types for folder notes"); + const desc0 = document.createDocumentFragment(); + desc0.append("Choose the file types that should be supported for folder notes. (e.g. if you click on a folder name it searches for all file extensions that are supported)", desc0.createEl("br"), "Adding more file types may cause performance issues becareful when adding more file types and don't add too many."); + setting0.setDesc(desc0); + const list = setting0.createList((list2) => { + list2.addSettings(settingsTab); + list2.setValues(settingsTab.plugin.settings.supportedFileTypes || ["md", "canvas"]); + list2.addResetButton(); + }); + if (!settingsTab.plugin.settings.supportedFileTypes.includes("md") || !settingsTab.plugin.settings.supportedFileTypes.includes("canvas") || !settingsTab.plugin.settings.supportedFileTypes.includes("excalidraw")) { + setting0.addDropdown((dropdown) => { + const options = [ + { value: "md", label: "Markdown" }, + { value: "canvas", label: "Canvas" }, + { value: "excalidraw", label: "excalidraw" }, + { value: "custom", label: "Custom extension" } + ]; + options.forEach((option) => { + var _a; + if (!((_a = settingsTab.plugin.settings.supportedFileTypes) == null ? void 0 : _a.includes(option.value))) { + dropdown.addOption(option.value, option.label); + } + }); + dropdown.addOption("+", "+"); + dropdown.setValue("+"); + dropdown.onChange(async (value) => { + if (value === "custom") { + return new AddSupportedFileModal(settingsTab.app, settingsTab.plugin, settingsTab, list).open(); + } + await list.addValue(value.toLowerCase()); + settingsTab.display(); + settingsTab.plugin.saveSettings(); + }); + }); + } else { + setting0.addButton((button) => button.setButtonText("Add custom file type").setCta().onClick(async () => { + new AddSupportedFileModal(settingsTab.app, settingsTab.plugin, settingsTab, list).open(); + })); + } + const setting = new import_obsidian17.Setting(containerEl); + const desc = document.createDocumentFragment(); + desc.append("Restart after changing the template path"); + setting.setName("Template path"); + setting.setDesc(desc).descEl.style.color = settingsTab.app.vault.getConfig("accentColor") || "#7d5bed"; + setting.addSearch((cb) => { + var _a; + new TemplateSuggest(cb.inputEl, settingsTab.plugin); + cb.setPlaceholder("Template path"); + cb.setValue(((_a = settingsTab.plugin.app.vault.getAbstractFileByPath(settingsTab.plugin.settings.templatePath)) == null ? void 0 : _a.name.replace(".md", "")) || ""); + cb.onChange(async (value) => { + if (value.trim() === "") { + settingsTab.plugin.settings.templatePath = ""; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + return; + } + }); + }); + const storageLocation = new import_obsidian17.Setting(containerEl).setName("Storage location").setDesc("Choose where to store the folder notes").addDropdown((dropdown) => dropdown.addOption("insideFolder", "Inside the folder").addOption("parentFolder", "In the parent folder").setValue(settingsTab.plugin.settings.storageLocation).onChange(async (value) => { + settingsTab.plugin.settings.storageLocation = value; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + loadFileClasses(void 0, settingsTab.plugin); + })); + storageLocation.infoEl.appendText("Requires a restart to take effect"); + storageLocation.infoEl.style.color = settingsTab.app.vault.getConfig("accentColor") || "#7d5bed"; + const switchLocation = new import_obsidian17.Setting(containerEl).setName("Switch to new storage location").setDesc("Move all folder notes to the new storage location").addButton((button) => button.setButtonText("Switch").setCta().onClick(async () => { + let oldStorageLocation = settingsTab.plugin.settings.storageLocation; + if (settingsTab.plugin.settings.storageLocation === "parentFolder") { + oldStorageLocation = "insideFolder"; + } else if (settingsTab.plugin.settings.storageLocation === "insideFolder") { + oldStorageLocation = "parentFolder"; + } + settingsTab.switchStorageLocation(oldStorageLocation); + })); + switchLocation.infoEl.appendText("Requires a restart to take effect"); + switchLocation.infoEl.style.color = settingsTab.app.vault.getConfig("accentColor") || "#7d5bed"; + if (settingsTab.plugin.settings.storageLocation === "parentFolder") { + new import_obsidian17.Setting(containerEl).setName("Delete folder notes when deleting the folder").setDesc("Delete the folder note when deleting the folder").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.syncDelete).onChange(async (value) => { + settingsTab.plugin.settings.syncDelete = value; + await settingsTab.plugin.saveSettings(); + })); + new import_obsidian17.Setting(containerEl).setName("Move folder notes when moving the folder").setDesc("Move the folder note when moving the folder").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.syncMove).onChange(async (value) => { + settingsTab.plugin.settings.syncMove = value; + await settingsTab.plugin.saveSettings(); + })); + } + if (import_obsidian17.Platform.isDesktopApp) { + new import_obsidian17.Setting(containerEl).setName("Key for creating folder note").setDesc("The key combination to create a folder note").addDropdown((dropdown) => { + if (!import_obsidian17.Platform.isMacOS) { + dropdown.addOption("ctrl", "Ctrl + Click"); + } else { + dropdown.addOption("ctrl", "Cmd + Click"); + } + dropdown.addOption("alt", "Alt + Click"); + dropdown.setValue(settingsTab.plugin.settings.ctrlKey ? "ctrl" : "alt"); + dropdown.onChange(async (value) => { + settingsTab.plugin.settings.ctrlKey = value === "ctrl"; + settingsTab.plugin.settings.altKey = value === "alt"; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + }); + }); + new import_obsidian17.Setting(containerEl).setName("Key for opening folder note").setDesc("Select the combination to open a folder note").addDropdown((dropdown) => { + dropdown.addOption("click", "Mouse Click"); + if (!import_obsidian17.Platform.isMacOS) { + dropdown.addOption("ctrl", "Ctrl + Click"); + } else { + dropdown.addOption("ctrl", "Cmd + Click"); + } + dropdown.addOption("alt", "Alt + Click"); + if (settingsTab.plugin.settings.openByClick) { + dropdown.setValue("click"); + } else if (settingsTab.plugin.settings.openWithCtrl) { + dropdown.setValue("ctrl"); + } else { + dropdown.setValue("alt"); + } + dropdown.onChange(async (value) => { + settingsTab.plugin.settings.openByClick = value === "click"; + settingsTab.plugin.settings.openWithCtrl = value === "ctrl"; + settingsTab.plugin.settings.openWithAlt = value === "alt"; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + }); + }); + } + new import_obsidian17.Setting(containerEl).setName("Sync folder name").setDesc("Automatically rename the folder note when the folder name is changed").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.syncFolderName).onChange(async (value) => { + settingsTab.plugin.settings.syncFolderName = value; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + })); + new import_obsidian17.Setting(containerEl).setName("Confirm folder note deletion").setDesc("Ask for confirmation before deleting a folder note").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.showDeleteConfirmation).onChange(async (value) => { + settingsTab.plugin.settings.showDeleteConfirmation = value; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + })); + new import_obsidian17.Setting(containerEl).setName("Deleted folder notes").setDesc("What happens to the folder note after you delete it").addDropdown((dropdown) => { + dropdown.addOption("trash", "Move to system trash"); + dropdown.addOption("obsidianTrash", "Move to Obsidian trash (.trash folder)"); + dropdown.addOption("delete", "Delete permanently"); + dropdown.setValue(settingsTab.plugin.settings.deleteFilesAction); + dropdown.onChange(async (value) => { + settingsTab.plugin.settings.deleteFilesAction = value; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + }); + }); + if (import_obsidian17.Platform.isDesktop) { + const setting3 = new import_obsidian17.Setting(containerEl); + setting3.setName("Open folder note in a new tab by default"); + setting3.setDesc("Always open folder notes in a new tab (except when you try to open the same note) instead of having to use ctrl/cmd + click to open in a new tab"); + setting3.addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.openInNewTab).onChange(async (value) => { + settingsTab.plugin.settings.openInNewTab = value; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + })); + setting3.infoEl.appendText("Requires a restart to take effect"); + setting3.infoEl.style.color = settingsTab.app.vault.getConfig("accentColor") || "#7d5bed"; + } + new import_obsidian17.Setting(containerEl).setName("Automatically create folder notes").setDesc("Automatically create a folder note when a new folder is created").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.autoCreate).onChange(async (value) => { + settingsTab.plugin.settings.autoCreate = value; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + })); + new import_obsidian17.Setting(containerEl).setName("Enable front matter title plugin integration").setDesc("Automatically rename a folder name when the folder note is renamed").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.frontMatterTitle.enabled).onChange(async (value) => { + var _a; + settingsTab.plugin.settings.frontMatterTitle.enabled = value; + await settingsTab.plugin.saveSettings(); + if (value) { + settingsTab.plugin.fmtpHandler = new FrontMatterTitlePluginHandler(settingsTab.plugin); + } else { + if (settingsTab.plugin.fmtpHandler) { + settingsTab.plugin.updateBreadcrumbs(true); + } + settingsTab.plugin.app.vault.getFiles().forEach((file) => { + var _a2; + (_a2 = settingsTab.plugin.fmtpHandler) == null ? void 0 : _a2.handleRename({ id: "", result: false, path: file.path }, false); + }); + (_a = settingsTab.plugin.fmtpHandler) == null ? void 0 : _a.deleteEvent(); + settingsTab.plugin.fmtpHandler = null; + } + settingsTab.display(); + })); + new import_obsidian17.Setting(containerEl).setName("Create folder note for every folder").setDesc("Create a folder note for every folder in the vault").addButton((cb) => { + cb.setIcon("plus"); + cb.setTooltip("Create folder notes"); + cb.onClick(async () => { + new ConfirmationModal(settingsTab.app, settingsTab.plugin).open(); + }); + }); +} + +// src/settings/FileExplorerSettings.ts +var import_obsidian18 = require("obsidian"); +async function renderFileExplorer(settingsTab) { + const containerEl = settingsTab.settingsPage; + new import_obsidian18.Setting(containerEl).setName("Hide folder note").setDesc("Hide the folder note in the file explorer").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.hideFolderNote).onChange(async (value) => { + settingsTab.plugin.settings.hideFolderNote = value; + await settingsTab.plugin.saveSettings(); + if (value) { + document.body.classList.add("hide-folder-note"); + } else { + document.body.classList.remove("hide-folder-note"); + } + settingsTab.display(); + })); + const setting2 = new import_obsidian18.Setting(containerEl).setName("Don't open folder notes by clicking on the name (on mobile)").setDesc("Folder notes don't open when clicking on the name of the folder (on mobile)").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.disableOpenFolderNoteOnClick).onChange(async (value) => { + settingsTab.plugin.settings.disableOpenFolderNoteOnClick = value; + await settingsTab.plugin.saveSettings(); + })); + setting2.infoEl.appendText("Requires a restart to take effect"); + setting2.infoEl.style.color = settingsTab.app.vault.getConfig("accentColor") || "#7d5bed"; + new import_obsidian18.Setting(containerEl).setName("Only open folder notes through the name").setDesc("Only open folder notes in the file explorer by clicking on the folder name").addToggle((toggle) => toggle.setValue(!settingsTab.plugin.settings.stopWhitespaceCollapsing).onChange(async (value) => { + if (!value) { + document.body.classList.add("fn-whitespace-stop-collapsing"); + } else { + document.body.classList.remove("fn-whitespace-stop-collapsing"); + } + settingsTab.plugin.settings.stopWhitespaceCollapsing = !value; + await settingsTab.plugin.saveSettings(); + })); + const disableSetting = new import_obsidian18.Setting(containerEl); + disableSetting.setName("Disable folder collapsing"); + disableSetting.setDesc("Disable the ability to collapse folders by clicking exactly on the folder name"); + disableSetting.addToggle((toggle) => toggle.setValue(!settingsTab.plugin.settings.enableCollapsing).onChange(async (value) => { + settingsTab.plugin.settings.enableCollapsing = !value; + await settingsTab.plugin.saveSettings(); + })); + disableSetting.infoEl.appendText("Requires a restart to take effect"); + disableSetting.infoEl.style.color = settingsTab.app.vault.getConfig("accentColor") || "#7d5bed"; + new import_obsidian18.Setting(containerEl).setName("Use submenus").setDesc("Use submenus for file/folder commands").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.useSubmenus).onChange(async (value) => { + settingsTab.plugin.settings.useSubmenus = value; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + })); + if (settingsTab.plugin.settings.frontMatterTitle.enabled) { + new import_obsidian18.Setting(containerEl).setName("Change folder name in the file explorer").setDesc("Automatically rename a folder name in the file explorer when the folder note is renamed").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.frontMatterTitle.explorer).onChange(async (value) => { + settingsTab.plugin.settings.frontMatterTitle.explorer = value; + await settingsTab.plugin.saveSettings(); + settingsTab.plugin.app.vault.getFiles().forEach((file) => { + var _a; + (_a = settingsTab.plugin.fmtpHandler) == null ? void 0 : _a.handleRename({ id: "", result: false, path: file.path }, false); + }); + })); + } + settingsTab.settingsPage.createEl("h3", { text: "Style settings" }); + new import_obsidian18.Setting(containerEl).setName("Hide collapse icon").setDesc("Hide the collapse icon in the file explorer next to the name of a folder when a folder only contains a folder note").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.hideCollapsingIcon).onChange(async (value) => { + settingsTab.plugin.settings.hideCollapsingIcon = value; + await settingsTab.plugin.saveSettings(); + if (value) { + document.body.classList.add("fn-hide-collapse-icon"); + } else { + document.body.classList.remove("fn-hide-collapse-icon"); + } + settingsTab.display(); + })); + if (settingsTab.plugin.settings.hideCollapsingIcon) { + new import_obsidian18.Setting(containerEl).setName("Hide collapse icon also when the attachment folder is in the same folder").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.ignoreAttachmentFolder).onChange(async (value) => { + settingsTab.plugin.settings.ignoreAttachmentFolder = value; + await settingsTab.plugin.saveSettings(); + })); + } + new import_obsidian18.Setting(containerEl).setName("Underline the name of folder notes").setDesc("Add an underline to folders that have a folder note in the file explorer").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.underlineFolder).onChange(async (value) => { + settingsTab.plugin.settings.underlineFolder = value; + if (value) { + document.body.classList.add("folder-note-underline"); + } else { + document.body.classList.remove("folder-note-underline"); + } + await settingsTab.plugin.saveSettings(); + })); + new import_obsidian18.Setting(containerEl).setName("Bold the name of folder notes").setDesc("Make the folder name bold in the file explorer").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.boldName).onChange(async (value) => { + settingsTab.plugin.settings.boldName = value; + if (value) { + document.body.classList.add("folder-note-bold"); + } else { + document.body.classList.remove("folder-note-bold"); + } + await settingsTab.plugin.saveSettings(); + })); + new import_obsidian18.Setting(containerEl).setName("Cursive the name of folder notes").setDesc("Make the folder name cursive in the file explorer").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.cursiveName).onChange(async (value) => { + settingsTab.plugin.settings.cursiveName = value; + if (value) { + document.body.classList.add("folder-note-cursive"); + } else { + document.body.classList.remove("folder-note-cursive"); + } + await settingsTab.plugin.saveSettings(); + })); +} + +// src/settings/PathSettings.ts +var import_obsidian19 = require("obsidian"); +async function renderPath(settingsTab) { + const containerEl = settingsTab.settingsPage; + new import_obsidian19.Setting(containerEl).setName("Open folder note through path").setDesc("Open a folder note when clicking on a folder name in the path if it is a folder note").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.openFolderNoteOnClickInPath).onChange(async (value) => { + settingsTab.plugin.settings.openFolderNoteOnClickInPath = value; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + })); + new import_obsidian19.Setting(containerEl).setName("Change folder name in the path").setDesc("Automatically rename a folder name in the path above a note when the folder note is renamed").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.frontMatterTitle.path).onChange(async (value) => { + settingsTab.plugin.settings.frontMatterTitle.path = value; + await settingsTab.plugin.saveSettings(); + if (value) { + settingsTab.plugin.updateBreadcrumbs(); + } else { + settingsTab.plugin.updateBreadcrumbs(true); + } + })); + settingsTab.settingsPage.createEl("h3", { text: "Style settings" }); + new import_obsidian19.Setting(containerEl).setName("Underline folders in the path").setDesc("Add an underline to folders that have a folder note in the path above a note").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.underlineFolderInPath).onChange(async (value) => { + settingsTab.plugin.settings.underlineFolderInPath = value; + if (value) { + document.body.classList.add("folder-note-underline-path"); + } else { + document.body.classList.remove("folder-note-underline-path"); + } + await settingsTab.plugin.saveSettings(); + })); + new import_obsidian19.Setting(containerEl).setName("Bold folders in the path").setDesc("Make the folder name bold in the path above a note").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.boldNameInPath).onChange(async (value) => { + settingsTab.plugin.settings.boldNameInPath = value; + if (value) { + document.body.classList.add("folder-note-bold-path"); + } else { + document.body.classList.remove("folder-note-bold-path"); + } + await settingsTab.plugin.saveSettings(); + })); + new import_obsidian19.Setting(containerEl).setName("Cursive the name of folder notes in the path").setDesc("Make the folder name cursive in the path above a note").addToggle((toggle) => toggle.setValue(settingsTab.plugin.settings.cursiveNameInPath).onChange(async (value) => { + settingsTab.plugin.settings.cursiveNameInPath = value; + if (value) { + document.body.classList.add("folder-note-cursive-path"); + } else { + document.body.classList.remove("folder-note-cursive-path"); + } + await settingsTab.plugin.saveSettings(); + })); +} + +// src/settings/FolderOverviewSettings.ts +var import_obsidian22 = require("obsidian"); + +// src/folderOverview/ModalSettings.ts +var import_obsidian21 = require("obsidian"); + +// src/folderOverview/FolderOverview.ts +var import_obsidian20 = require("obsidian"); +var FolderOverview = class { + constructor(plugin, ctx, source, el) { + this.pathBlacklist = []; + this.folders = []; + let yaml = (0, import_obsidian20.parseYaml)(source); + if (!yaml) { + yaml = {}; + } + const includeTypes = (yaml == null ? void 0 : yaml.includeTypes) || plugin.settings.defaultOverview.includeTypes || ["folder", "markdown"]; + this.plugin = plugin; + this.ctx = ctx; + this.source = source; + this.el = el; + this.sourceFilePath = this.ctx.sourcePath; + this.yaml = { + id: (yaml == null ? void 0 : yaml.id) || crypto.randomUUID(), + folderPath: (yaml == null ? void 0 : yaml.folderPath) === void 0 || (yaml == null ? void 0 : yaml.folderPath) === null ? getFolderPathFromString(ctx.sourcePath) : yaml == null ? void 0 : yaml.folderPath, + title: (yaml == null ? void 0 : yaml.title) || plugin.settings.defaultOverview.title, + showTitle: (yaml == null ? void 0 : yaml.showTitle) === void 0 || (yaml == null ? void 0 : yaml.showTitle) === null ? plugin.settings.defaultOverview.showTitle : yaml == null ? void 0 : yaml.showTitle, + depth: (yaml == null ? void 0 : yaml.depth) || plugin.settings.defaultOverview.depth, + style: (yaml == null ? void 0 : yaml.style) || "list", + includeTypes: includeTypes.map((type) => type.toLowerCase()), + disableFileTag: (yaml == null ? void 0 : yaml.disableFileTag) === void 0 || (yaml == null ? void 0 : yaml.disableFileTag) === null ? plugin.settings.defaultOverview.disableFileTag : yaml == null ? void 0 : yaml.disableFileTag, + sortBy: (yaml == null ? void 0 : yaml.sortBy) || plugin.settings.defaultOverview.sortBy, + sortByAsc: (yaml == null ? void 0 : yaml.sortByAsc) === void 0 || (yaml == null ? void 0 : yaml.sortByAsc) === null ? plugin.settings.defaultOverview.sortByAsc : yaml == null ? void 0 : yaml.sortByAsc, + showEmptyFolders: (yaml == null ? void 0 : yaml.showEmptyFolders) === void 0 || (yaml == null ? void 0 : yaml.showEmptyFolders) === null ? plugin.settings.defaultOverview.showEmptyFolders : yaml == null ? void 0 : yaml.showEmptyFolders, + onlyIncludeSubfolders: (yaml == null ? void 0 : yaml.onlyIncludeSubfolders) === void 0 || (yaml == null ? void 0 : yaml.onlyIncludeSubfolders) === null ? plugin.settings.defaultOverview.onlyIncludeSubfolders : yaml == null ? void 0 : yaml.onlyIncludeSubfolders, + storeFolderCondition: (yaml == null ? void 0 : yaml.storeFolderCondition) === void 0 || (yaml == null ? void 0 : yaml.storeFolderCondition) === null ? plugin.settings.defaultOverview.storeFolderCondition : yaml == null ? void 0 : yaml.storeFolderCondition, + showFolderNotes: (yaml == null ? void 0 : yaml.showFolderNotes) === void 0 || (yaml == null ? void 0 : yaml.showFolderNotes) === null ? plugin.settings.defaultOverview.showFolderNotes : yaml == null ? void 0 : yaml.showFolderNotes, + disableCollapseIcon: (yaml == null ? void 0 : yaml.disableCollapseIcon) === void 0 || (yaml == null ? void 0 : yaml.disableCollapseIcon) === null ? plugin.settings.defaultOverview.disableCollapseIcon : yaml == null ? void 0 : yaml.disableCollapseIcon + }; + } + create(plugin, source, el, ctx) { + var _a; + el.empty(); + (_a = el.parentElement) == null ? void 0 : _a.classList.add("folder-overview-container"); + const root = el.createEl("div", { cls: "folder-overview" }); + const titleEl = root.createEl("h1", { cls: "folder-overview-title" }); + const ul = root.createEl("ul", { cls: "folder-overview-list" }); + if (this.yaml.includeTypes.length === 0) { + return this.addEditButton(root); + } + let files = []; + const sourceFile = plugin.app.vault.getAbstractFileByPath(ctx.sourcePath); + if (!sourceFile) + return; + let sourceFolderPath = this.yaml.folderPath || getFolderPathFromString(ctx.sourcePath); + let sourceFolder; + if (sourceFolderPath !== "/") { + if (this.yaml.folderPath === "") { + sourceFolder = plugin.app.vault.getAbstractFileByPath(getFolderPathFromString(ctx.sourcePath)); + } else { + sourceFolder = plugin.app.vault.getAbstractFileByPath(this.yaml.folderPath); + } + } + if (this.yaml.showTitle) { + if (sourceFolder && sourceFolderPath !== "/") { + titleEl.innerText = this.yaml.title.replace("{{folderName}}", sourceFolder.name); + } else if (sourceFolderPath == "/") { + titleEl.innerText = this.yaml.title.replace("{{folderName}}", "Vault"); + } else { + titleEl.innerText = this.yaml.title.replace("{{folderName}}", ""); + } + } + if (!sourceFolder && (sourceFolderPath !== "/" && sourceFolderPath !== "")) { + return new import_obsidian20.Notice("Folder overview: Couldn't find the folder"); + } + if (!sourceFolder && sourceFolderPath == "") { + sourceFolderPath = "/"; + } + if (sourceFolderPath == "/") { + const rootFiles = []; + plugin.app.vault.getAllLoadedFiles().filter((f) => { + var _a2; + return ((_a2 = f.parent) == null ? void 0 : _a2.path) === "/"; + }).forEach((file) => { + if (!file.path.includes("/")) { + rootFiles.push(file); + } + }); + files = rootFiles; + } else if (sourceFolder) { + files = sourceFolder.children; + } + files = this.filterFiles(files, plugin, sourceFolderPath, this.yaml.depth, this.pathBlacklist); + if (!this.yaml.includeTypes.includes("folder")) { + files = this.getAllFiles(files, sourceFolderPath, this.yaml.depth); + } + if (files.length === 0) { + return this.addEditButton(root); + } + files = this.sortFiles(files); + if (this.yaml.style === "grid") { + const grid = root.createEl("div", { cls: "folder-overview-grid" }); + files.forEach(async (file) => { + const gridItem = grid.createEl("div", { cls: "folder-overview-grid-item" }); + const gridArticle = gridItem.createEl("article", { cls: "folder-overview-grid-item-article" }); + if (file instanceof import_obsidian20.TFile) { + const fileContent = await plugin.app.vault.read(file); + const descriptionEl = gridArticle.createEl("p", { cls: "folder-overview-grid-item-description" }); + let description = fileContent.split("\n")[0]; + if (description.length > 64) { + description = description.slice(0, 64) + "..."; + } + descriptionEl.innerText = description; + const link = gridArticle.createEl("a", { cls: "folder-overview-grid-item-link internal-link" }); + const title = link.createEl("h1", { cls: "folder-overview-grid-item-link-title" }); + title.innerText = file.name.replace(".md", "").replace(".canvas", ""); + link.href = file.path; + } else if (file instanceof import_obsidian20.TFolder) { + const folderItem = gridArticle.createEl("div", { cls: "folder-overview-grid-item-folder" }); + const folderName = folderItem.createEl("h1", { cls: "folder-overview-grid-item-folder-name" }); + folderName.innerText = file.name; + } + }); + } else if (this.yaml.style === "list") { + const folders = this.sortFiles(files.filter((f) => f instanceof import_obsidian20.TFolder)); + files = this.sortFiles(files.filter((f) => f instanceof import_obsidian20.TFile)); + folders.forEach((file) => { + if (file instanceof import_obsidian20.TFolder) { + const folderItem = this.addFolderList(plugin, ul, this.pathBlacklist, file); + if (!folderItem) { + return; + } + this.goThroughFolders(plugin, folderItem, file, this.yaml.depth, sourceFolderPath, ctx, this.yaml, this.pathBlacklist, this.yaml.includeTypes, this.yaml.disableFileTag); + } + }); + files.forEach((file) => { + if (file instanceof import_obsidian20.TFile) { + this.addFileList(plugin, ul, this.pathBlacklist, file, this.yaml.includeTypes, this.yaml.disableFileTag); + } + }); + } else if (this.yaml.style === "explorer") { + if (this.plugin.app.workspace.layoutReady) { + this.cloneFileExplorerView(plugin, ctx, root, this.yaml, this.pathBlacklist); + } else { + this.plugin.app.workspace.onLayoutReady(() => { + this.cloneFileExplorerView(plugin, ctx, root, this.yaml, this.pathBlacklist); + }); + } + } + const overviewListEl = el.childNodes[0].childNodes[1]; + if (overviewListEl && overviewListEl.childNodes.length === 0) { + if (this.yaml.style === "explorer") { + const overview = el.childNodes[0]; + if (!overview.childNodes[2]) { + if (this.plugin.app.workspace.layoutReady) { + return this.addEditButton(root); + } + } + } else { + if (this.plugin.app.workspace.layoutReady) { + return this.addEditButton(root); + } + } + } + if (this.yaml.includeTypes.length > 1 && (!this.yaml.showEmptyFolders || this.yaml.onlyIncludeSubfolders) && this.yaml.style === "list") { + this.removeEmptyFolders(ul, 1, this.yaml); + } + } + addEditButton(root) { + const editButton = root.createEl("button", { cls: "folder-overview-edit-button" }); + editButton.innerText = "Edit overview"; + editButton.addEventListener("click", (e) => { + e.stopImmediatePropagation(); + e.preventDefault(); + e.stopPropagation(); + new FolderOverviewSettings(this.plugin.app, this.plugin, this.yaml, this.ctx, this.el).open(); + }, { capture: true }); + } + cloneFileExplorerView(plugin, ctx, root, yaml, pathBlacklist) { + const folder = getEl(this.yaml.folderPath); + let folderElement = folder == null ? void 0 : folder.parentElement; + let tFolder = plugin.app.vault.getAbstractFileByPath(this.yaml.folderPath); + if (!tFolder && yaml.folderPath.trim() == "") { + tFolder = plugin.app.vault.getAbstractFileByPath(getFolderPathFromString(ctx.sourcePath)); + } + if (!folderElement && yaml.folderPath.trim() !== "") + return; + folderElement = document.querySelector("div.nav-files-container"); + if (!folderElement) + return; + const newFolderElement = folderElement.cloneNode(true); + newFolderElement.querySelectorAll("div.nav-folder-title ").forEach((el) => { + var _a; + const folder2 = plugin.app.vault.getAbstractFileByPath(el.getAttribute("data-path") || ""); + if (!(folder2 instanceof import_obsidian20.TFolder)) + return; + if (this.yaml.storeFolderCondition) { + if (folder2.collapsed) { + el.classList.add("is-collapsed"); + } else { + el.classList.remove("is-collapsed"); + } + } else { + if ((_a = el.parentElement) == null ? void 0 : _a.classList.contains("is-collapsed")) { + folder2.collapsed = true; + } else { + folder2.collapsed = false; + } + } + if (el.classList.contains("has-folder-note")) { + const folderNote = getFolderNote(plugin, folder2.path); + if (folderNote) { + this.pathBlacklist.push(folderNote.path); + } + } + }); + if (tFolder instanceof import_obsidian20.TFolder) { + this.addFiles(tFolder.children, root); + } else if (yaml.folderPath.trim() === "/") { + const rootFiles = []; + plugin.app.vault.getAllLoadedFiles().filter((f) => f instanceof import_obsidian20.TFolder).forEach((file) => { + if (!file.path.includes("/")) { + rootFiles.push(file); + } + }); + this.addFiles(rootFiles, root); + } + newFolderElement.querySelectorAll("div.tree-item-icon").forEach((el) => { + if (el instanceof HTMLElement) { + el.onclick = () => { + var _a; + const path = (_a = el.parentElement) == null ? void 0 : _a.getAttribute("data-path"); + if (!path) + return; + const folder2 = plugin.app.vault.getAbstractFileByPath(path); + this.handleCollapseClick(el, plugin, yaml, pathBlacklist, this.source, folder2); + }; + } + }); + } + async addFiles(files, childrenElement) { + const folders = this.sortFiles(files.filter((file) => file instanceof import_obsidian20.TFolder)); + const filesWithoutFolders = this.sortFiles(files.filter((file) => !(file instanceof import_obsidian20.TFolder))); + for (const child of folders) { + if (child instanceof import_obsidian20.TFolder) { + const folderNote = getFolderNote(this.plugin, child.path); + if (folderNote) { + this.pathBlacklist.push(folderNote.path); + } + const excludedFolder = getExcludedFolder(this.plugin, child.path); + if (excludedFolder == null ? void 0 : excludedFolder.excludeFromFolderOverview) { + continue; + } + const svg = ''; + const folderElement = childrenElement.createDiv({ + cls: "tree-item nav-folder" + }); + const folderTitle = folderElement.createDiv({ + cls: "tree-item-self is-clickable nav-folder-title", + attr: { + "data-path": child.path, + "draggable": "true" + } + }); + if (!child.collapsed) { + folderTitle.classList.remove("is-collapsed"); + const childrenElement2 = folderElement == null ? void 0 : folderElement.createDiv({ cls: "tree-item-children nav-folder-children" }); + this.addFiles(child.children, childrenElement2); + } else { + folderTitle.classList.add("is-collapsed"); + } + if (folderNote) { + folderTitle.classList.add("has-folder-note"); + } + if (folderNote && child.children.length === 1 && this.yaml.disableCollapseIcon) { + folderTitle.classList.add("fn-has-no-files"); + } + const collapseIcon = folderTitle.createDiv({ + cls: "tree-item-icon collapse-icon nav-folder-collapse-indicator fn-folder-overview-collapse-icon" + }); + if (child.collapsed) { + collapseIcon.classList.add("is-collapsed"); + } + collapseIcon.innerHTML = svg; + collapseIcon.onclick = () => { + this.handleCollapseClick(collapseIcon, this.plugin, this.yaml, this.pathBlacklist, this.source, child); + }; + folderTitle.createDiv({ + cls: "tree-item-inner nav-folder-title-content", + text: child.name + }); + } + } + for (const child of filesWithoutFolders) { + if (child instanceof import_obsidian20.TFile) { + if (this.pathBlacklist.includes(child.path) && !this.yaml.showFolderNotes) { + continue; + } + const extension = child.extension.toLowerCase() == "md" ? "markdown" : child.extension.toLowerCase(); + const includeTypes = this.yaml.includeTypes; + if (includeTypes.length > 0 && !includeTypes.includes("all")) { + if ((extension === "md" || extension === "markdown") && !includeTypes.includes("markdown")) + continue; + if (extension === "canvas" && !includeTypes.includes("canvas")) + continue; + if (extension === "pdf" && !includeTypes.includes("pdf")) + continue; + const imageTypes = ["jpg", "jpeg", "png", "gif", "svg", "webp"]; + if (imageTypes.includes(extension) && !includeTypes.includes("image")) + continue; + const videoTypes = ["mp4", "webm", "ogv", "mov", "mkv"]; + if (videoTypes.includes(extension) && !includeTypes.includes("video")) + continue; + const audioTypes = ["mp3", "wav", "m4a", "3gp", "flac", "ogg", "oga", "opus"]; + if (audioTypes.includes(extension) && includeTypes.includes("audio")) + continue; + const allTypes = ["markdown", "md", "canvas", "pdf", ...imageTypes, ...videoTypes, ...audioTypes]; + if (!allTypes.includes(extension) && !includeTypes.includes("other")) + continue; + } + const fileElement = childrenElement.createDiv({ + cls: "tree-item nav-file" + }); + const fileTitle = fileElement.createDiv({ + cls: "tree-item-self is-clickable nav-file-title pointer-cursor", + attr: { + "data-path": child.path, + "draggable": "true" + } + }); + fileTitle.onclick = () => { + this.plugin.app.workspace.openLinkText(child.path, child.path, true); + }; + fileTitle.createDiv({ + cls: "tree-item-inner nav-file-title-content", + text: child.basename + }); + if (child.extension !== "md") { + fileTitle.createDiv({ + cls: "nav-file-tag", + text: child.extension + }); + } + } + } + } + handleCollapseClick(el, plugin, yaml, pathBlacklist, sourcePath, folder) { + var _a, _b, _c, _d; + el.classList.toggle("is-collapsed"); + if (el.classList.contains("is-collapsed")) { + if (!(folder instanceof import_obsidian20.TFolder)) + return; + folder.collapsed = true; + (_c = (_b = (_a = el.parentElement) == null ? void 0 : _a.parentElement) == null ? void 0 : _b.childNodes[1]) == null ? void 0 : _c.remove(); + } else { + if (!(folder instanceof import_obsidian20.TFolder)) + return; + folder.collapsed = false; + const folderElement = (_d = el.parentElement) == null ? void 0 : _d.parentElement; + if (!folderElement) + return; + const childrenElement = folderElement.createDiv({ cls: "tree-item-children nav-folder-children" }); + let files = this.sortFiles(folder.children); + files = this.filterFiles(files, plugin, folder.path, this.yaml.depth || 1, pathBlacklist); + this.addFiles(files, childrenElement); + } + } + goThroughFolders(plugin, list, folder, depth, sourceFolderPath, ctx, yaml, pathBlacklist, includeTypes, disableFileTag) { + if (sourceFolderPath === "") { + depth--; + } + let files = this.filterFiles(folder.children, plugin, sourceFolderPath, depth, pathBlacklist); + files = this.sortFiles(files.filter((file) => !(file instanceof import_obsidian20.TFolder))); + if (this.yaml.sortByAsc) { + files = files.reverse(); + } + const folders = this.sortFiles(files.filter((file) => file instanceof import_obsidian20.TFolder)); + const ul = list.createEl("ul", { cls: "folder-overview-list" }); + folders.forEach((file) => { + if (file instanceof import_obsidian20.TFolder) { + const folderItem = this.addFolderList(plugin, ul, pathBlacklist, file); + if (!folderItem) + return; + this.goThroughFolders(plugin, folderItem, file, depth, sourceFolderPath, ctx, yaml, pathBlacklist, includeTypes, disableFileTag); + } + }); + files.forEach((file) => { + if (file instanceof import_obsidian20.TFile) { + this.addFileList(plugin, ul, pathBlacklist, file, includeTypes, disableFileTag); + } + }); + } + filterFiles(files, plugin, sourceFolderPath, depth, pathBlacklist) { + return files.filter((file) => { + if (pathBlacklist.includes(file.path) && !this.yaml.showFolderNotes) { + return false; + } + const folderPath = getFolderPathFromString(file.path); + if (!folderPath.startsWith(sourceFolderPath) && sourceFolderPath !== "/") { + return false; + } + if (file.path === this.sourceFilePath) { + return false; + } + const excludedFolder = getExcludedFolder(plugin, file.path); + if (excludedFolder == null ? void 0 : excludedFolder.excludeFromFolderOverview) { + return false; + } + if (file.path.split("/").length - sourceFolderPath.split("/").length - 1 < depth) { + return true; + } + }); + } + sortFiles(files) { + const yaml = this.yaml; + if (!(yaml == null ? void 0 : yaml.sortBy)) { + yaml.sortBy = this.plugin.settings.defaultOverview.sortBy || "name"; + yaml.sortByAsc = this.plugin.settings.defaultOverview.sortByAsc || false; + } + files.sort((a, b) => { + if (a instanceof import_obsidian20.TFolder && !(b instanceof import_obsidian20.TFolder)) { + return -1; + } + if (!(a instanceof import_obsidian20.TFolder) && b instanceof import_obsidian20.TFolder) { + return 1; + } + if (a instanceof import_obsidian20.TFolder && b instanceof import_obsidian20.TFolder) { + if (a.name.localeCompare(b.name) < 0) { + return -1; + } else if (a.name.localeCompare(b.name) > 0) { + return 1; + } + } + if (!(a instanceof import_obsidian20.TFile) || !(b instanceof import_obsidian20.TFile)) { + return -1; + } + if (yaml.sortBy === "created") { + if (a.stat.ctime > b.stat.ctime) { + return -1; + } else if (a.stat.ctime < b.stat.ctime) { + return 1; + } + } else if (yaml.sortBy === "modified") { + if (a.stat.mtime > b.stat.mtime) { + return -1; + } else if (a.stat.mtime < b.stat.mtime) { + return 1; + } + } else if (yaml.sortBy === "name") { + if (a.basename.localeCompare(b.basename) < 0) { + return -1; + } else if (a.basename.localeCompare(b.basename) > 0) { + return 1; + } + } + return 0; + }); + if (!(yaml == null ? void 0 : yaml.sortByAsc)) { + files = files.reverse(); + } + return files; + } + removeEmptyFolders(ul, depth, yaml) { + const childrensToRemove = []; + ul.childNodes.forEach((el) => { + var _a, _b; + if (((_a = el.childNodes[0]) == null ? void 0 : _a.classList) && ((_b = el.childNodes[0]) == null ? void 0 : _b.classList.contains("internal-link"))) { + return; + } + const childrens = el.querySelector("ul"); + if (!childrens || childrens === null) { + return; + } + if (childrens && !(childrens == null ? void 0 : childrens.hasChildNodes()) && !(el instanceof HTMLUListElement)) { + childrensToRemove.push(el); + } else if (el instanceof HTMLUListElement || el instanceof HTMLLIElement) { + this.removeEmptyFolders(el, depth + 1, yaml); + } + }); + childrensToRemove.forEach((el) => { + if (yaml.onlyIncludeSubfolders && depth === 1) { + return; + } + el.remove(); + }); + } + addFolderList(plugin, list, pathBlacklist, folder) { + const folderItem = list.createEl("li", { cls: "folder-overview-list folder-list" }); + const folderNote = getFolderNote(plugin, folder.path); + if (folderNote instanceof import_obsidian20.TFile) { + const folderNoteLink = folderItem.createEl("a", { cls: "folder-overview-list-item folder-name-item internal-link", href: folderNote.path }); + folderNoteLink.innerText = folder.name; + pathBlacklist.push(folderNote.path); + } else { + const folderName = folderItem.createEl("span", { cls: "folder-overview-list-item folder-name-item" }); + folderName.innerText = folder.name; + } + return folderItem; + } + addFileList(plugin, list, pathBlacklist, file, includeTypes, disableFileTag) { + if (includeTypes.length > 0 && !includeTypes.includes("all")) { + if (file.extension === "md" && !includeTypes.includes("markdown")) + return; + if (file.extension === "canvas" && !includeTypes.includes("canvas")) + return; + if (file.extension === "pdf" && !includeTypes.includes("pdf")) + return; + const imageTypes = ["jpg", "jpeg", "png", "gif", "svg", "webp"]; + if (imageTypes.includes(file.extension) && !includeTypes.includes("image")) + return; + const videoTypes = ["mp4", "webm", "ogv", "mov", "mkv"]; + if (videoTypes.includes(file.extension) && !includeTypes.includes("video")) + return; + const audioTypes = ["mp3", "wav", "m4a", "3gp", "flac", "ogg", "oga", "opus"]; + if (audioTypes.includes(file.extension) && includeTypes.includes("audio")) + return; + const allTypes = ["md", "canvas", "pdf", ...imageTypes, ...videoTypes, ...audioTypes]; + if (!allTypes.includes(file.extension) && !includeTypes.includes("other")) + return; + } + if (!this.yaml.showFolderNotes) { + if (pathBlacklist.includes(file.path)) + return; + } + const listItem = list.createEl("li", { cls: "folder-overview-list file-link" }); + const nameItem = listItem.createEl("div", { cls: "folder-overview-list-item" }); + const link = nameItem.createEl("a", { cls: "internal-link", href: file.path }); + link.innerText = file.basename; + if (file.extension !== "md" && !disableFileTag) { + nameItem.createDiv({ cls: "nav-file-tag" }).innerText = file.extension; + } + } + getAllFiles(files, sourceFolderPath, depth) { + const allFiles = []; + files.forEach((file) => { + if (file instanceof import_obsidian20.TFolder) { + if (file.path.split("/").length - sourceFolderPath.split("/").length - 1 < depth - 1) { + allFiles.push(...this.getAllFiles(file.children, sourceFolderPath, depth)); + } + } else { + allFiles.push(file); + } + }); + return allFiles; + } +}; +async function updateYaml(plugin, ctx, el, yaml) { + const file = plugin.app.vault.getAbstractFileByPath(ctx.sourcePath); + if (!(file instanceof import_obsidian20.TFile)) + return; + let stringYaml = (0, import_obsidian20.stringifyYaml)(yaml); + await plugin.app.vault.process(file, (text) => { + const info = ctx.getSectionInfo(el); + if (stringYaml[stringYaml.length - 1] !== "\n") { + stringYaml += "\n"; + } + if (info) { + const { lineStart } = info; + const lineEnd = getCodeBlockEndLine(text, lineStart); + if (lineEnd === -1 || !lineEnd) + return text; + const lineLength = lineEnd - lineStart; + const lines = text.split("\n"); + lines.splice(lineStart, lineLength + 1, `\`\`\`folder-overview +${stringYaml}\`\`\``); + return lines.join("\n"); + } + return `\`\`\`folder-overview +${stringYaml}\`\`\``; + }); +} +function getCodeBlockEndLine(text, startLine, count = 1) { + let line = startLine + 1; + const lines = text.split("\n"); + while (line < lines.length) { + if (count > 50) { + return -1; + } + if (lines[line].startsWith("```")) { + return line; + } + line++; + count++; + } + return line; +} + +// src/folderOverview/ModalSettings.ts +var FolderOverviewSettings = class extends import_obsidian21.Modal { + constructor(app2, plugin, yaml, ctx, el, defaultSettings) { + super(app2); + this.plugin = plugin; + this.app = app2; + if (!yaml) { + this.yaml = this.plugin.settings.defaultOverview; + } else if (ctx) { + const includeTypes = (yaml == null ? void 0 : yaml.includeTypes) || plugin.settings.defaultOverview.includeTypes || ["folder", "markdown"]; + this.yaml = { + id: (yaml == null ? void 0 : yaml.id) || crypto.randomUUID(), + folderPath: (yaml == null ? void 0 : yaml.folderPath) === void 0 || (yaml == null ? void 0 : yaml.folderPath) === null ? getFolderPathFromString(ctx.sourcePath) : yaml == null ? void 0 : yaml.folderPath, + title: (yaml == null ? void 0 : yaml.title) || plugin.settings.defaultOverview.title, + showTitle: (yaml == null ? void 0 : yaml.showTitle) === void 0 || (yaml == null ? void 0 : yaml.showTitle) === null ? plugin.settings.defaultOverview.showTitle : yaml == null ? void 0 : yaml.showTitle, + depth: (yaml == null ? void 0 : yaml.depth) || plugin.settings.defaultOverview.depth, + style: (yaml == null ? void 0 : yaml.style) || "list", + includeTypes: includeTypes.map((type) => type.toLowerCase()), + disableFileTag: (yaml == null ? void 0 : yaml.disableFileTag) === void 0 || (yaml == null ? void 0 : yaml.disableFileTag) === null ? plugin.settings.defaultOverview.disableFileTag : yaml == null ? void 0 : yaml.disableFileTag, + sortBy: (yaml == null ? void 0 : yaml.sortBy) || plugin.settings.defaultOverview.sortBy, + sortByAsc: (yaml == null ? void 0 : yaml.sortByAsc) === void 0 || (yaml == null ? void 0 : yaml.sortByAsc) === null ? plugin.settings.defaultOverview.sortByAsc : yaml == null ? void 0 : yaml.sortByAsc, + showEmptyFolders: (yaml == null ? void 0 : yaml.showEmptyFolders) === void 0 || (yaml == null ? void 0 : yaml.showEmptyFolders) === null ? plugin.settings.defaultOverview.showEmptyFolders : yaml == null ? void 0 : yaml.showEmptyFolders, + onlyIncludeSubfolders: (yaml == null ? void 0 : yaml.onlyIncludeSubfolders) === void 0 || (yaml == null ? void 0 : yaml.onlyIncludeSubfolders) === null ? plugin.settings.defaultOverview.onlyIncludeSubfolders : yaml == null ? void 0 : yaml.onlyIncludeSubfolders, + storeFolderCondition: (yaml == null ? void 0 : yaml.storeFolderCondition) === void 0 || (yaml == null ? void 0 : yaml.storeFolderCondition) === null ? plugin.settings.defaultOverview.storeFolderCondition : yaml == null ? void 0 : yaml.storeFolderCondition, + showFolderNotes: (yaml == null ? void 0 : yaml.showFolderNotes) === void 0 || (yaml == null ? void 0 : yaml.showFolderNotes) === null ? plugin.settings.defaultOverview.showFolderNotes : yaml == null ? void 0 : yaml.showFolderNotes, + disableCollapseIcon: (yaml == null ? void 0 : yaml.disableCollapseIcon) === void 0 || (yaml == null ? void 0 : yaml.disableCollapseIcon) === null ? plugin.settings.defaultOverview.disableCollapseIcon : yaml == null ? void 0 : yaml.disableCollapseIcon + }; + } + if (ctx) { + this.ctx = ctx; + } + if (el) { + this.el = el; + } + if (defaultSettings) { + this.yaml = this.plugin.settings.defaultOverview; + this.defaultSettings = true; + return; + } + updateYaml(this.plugin, this.ctx, this.el, this.yaml); + } + onOpen() { + this.display(); + } + display() { + var _a, _b, _c, _d; + const { contentEl } = this; + contentEl.empty(); + contentEl.addEventListener("keydown", (e) => { + if (e.key === "Enter") { + this.close(); + } + }); + if (!this.defaultSettings) { + contentEl.createEl("h2", { text: "Folder overview settings" }); + } else { + contentEl.createEl("h2", { text: "Default folder overview settings" }); + } + new import_obsidian21.Setting(contentEl).setName("Show the title").setDesc("Choose if the title should be shown").addToggle((toggle) => toggle.setValue(this.yaml.showTitle).onChange(async (value) => { + this.yaml.showTitle = value; + this.display(); + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + ; + })); + if (this.yaml.showTitle) { + new import_obsidian21.Setting(contentEl).setName("Title").setDesc("Choose the title of the folder overview").addText((text) => { + var _a2; + return text.setValue(((_a2 = this.yaml) == null ? void 0 : _a2.title) || "{{folderName}} overview").onChange(async (value) => { + this.yaml.title = value; + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + ; + }); + }); + } + new import_obsidian21.Setting(contentEl).setName("Folder path for the overview").setDesc("Choose the folder path for the overview").addSearch((search) => { + var _a2; + new FolderSuggest(search.inputEl, this.plugin); + search.setPlaceholder("Folder path").setValue(((_a2 = this.yaml) == null ? void 0 : _a2.folderPath) || "").onChange(async (value) => { + if (!(this.app.vault.getAbstractFileByPath(value) instanceof import_obsidian21.TFolder) && value !== "") + return; + this.yaml.folderPath = value; + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + ; + }); + }); + new import_obsidian21.Setting(contentEl).setName("Overview style").setDesc("Choose the style of the overview (grid style soon)").addDropdown((dropdown) => { + var _a2; + return dropdown.addOption("list", "List").addOption("explorer", "Explorer").setValue(((_a2 = this.yaml) == null ? void 0 : _a2.style) || "list").onChange(async (value) => { + this.yaml.style = value; + this.display(); + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + }); + }); + if (this.yaml.style === "explorer") { + new import_obsidian21.Setting(contentEl).setName("Store collapsed condition").setDesc("Choose if the collapsed condition should be stored stored until you restart Obsidian").addToggle((toggle) => toggle.setValue(this.yaml.storeFolderCondition).onChange(async (value) => { + this.yaml.storeFolderCondition = value; + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + ; + })); + } + const setting = new import_obsidian21.Setting(contentEl); + setting.setName("Include types"); + const list = setting.createList((list2) => { + var _a2; + return list2.addModal(this).setValues(((_a2 = this.yaml) == null ? void 0 : _a2.includeTypes) || this.plugin.settings.defaultOverview.includeTypes || []).addResetButton(); + }); + if ((((_b = (_a = this.yaml) == null ? void 0 : _a.includeTypes) == null ? void 0 : _b.length) || 0) < 8 && !((_c = this.yaml.includeTypes) == null ? void 0 : _c.includes("all"))) { + setting.addDropdown((dropdown) => { + if (!this.yaml.includeTypes) + this.yaml.includeTypes = this.plugin.settings.defaultOverview.includeTypes || []; + this.yaml.includeTypes = this.yaml.includeTypes.map((type) => type.toLowerCase()); + const options = [ + { value: "markdown", label: "Markdown" }, + { value: "folder", label: "Folder" }, + { value: "canvas", label: "Canvas" }, + { value: "pdf", label: "PDF" }, + { value: "image", label: "Image" }, + { value: "audio", label: "Audio" }, + { value: "video", label: "Video" }, + { value: "other", label: "All other file types" }, + { value: "all", label: "All file types" } + ]; + options.forEach((option) => { + var _a2; + if (!((_a2 = this.yaml.includeTypes) == null ? void 0 : _a2.includes(option.value))) { + dropdown.addOption(option.value, option.label); + } + }); + dropdown.addOption("+", "+"); + dropdown.setValue("+"); + dropdown.onChange(async (value) => { + var _a2; + if (value === "all") { + this.yaml.includeTypes = (_a2 = this.yaml.includeTypes) == null ? void 0 : _a2.filter((type) => type === "folder"); + list.setValues(this.yaml.includeTypes); + } + await list.addValue(value.toLowerCase()); + this.display(); + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + }); + }); + } + let disableFileTag; + (_d = this.yaml.includeTypes) == null ? void 0 : _d.forEach((type) => { + type === "folder" || type === "markdown" ? disableFileTag = true : null; + }); + if (disableFileTag) { + new import_obsidian21.Setting(contentEl).setName("Disable file tag").setDesc("Choose if the file tag should be shown after the file name").addToggle((toggle) => { + toggle.setValue(this.yaml.disableFileTag).onChange(async (value) => { + this.yaml.disableFileTag = value; + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + }); + }); + } + new import_obsidian21.Setting(contentEl).setName("Show folder notes").setDesc("Choose if folder notes (the note itself and not the folder name) should be shown in the overview").addToggle((toggle) => toggle.setValue(this.yaml.showFolderNotes).onChange(async (value) => { + this.yaml.showFolderNotes = value; + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + })); + if (this.yaml.style !== "explorer") { + new import_obsidian21.Setting(contentEl).setName("File depth").setDesc("File & folder = +1 depth").addSlider((slider) => { + var _a2; + return slider.setValue(((_a2 = this.yaml) == null ? void 0 : _a2.depth) || 2).setLimits(1, 10, 1).onChange(async (value) => { + this.yaml.depth = value; + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + }); + }); + } + new import_obsidian21.Setting(contentEl).setName("Sort files by").setDesc("Choose how the files should be sorted").addDropdown((dropdown) => { + var _a2; + return dropdown.addOption("name", "Name").addOption("created", "Created").addOption("modified", "Modified").setValue(((_a2 = this.yaml) == null ? void 0 : _a2.sortBy) || "name").onChange(async (value) => { + this.yaml.sortBy = value; + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + }); + }).addDropdown((dropdown) => { + dropdown.addOption("desc", "Descending").addOption("asc", "Ascending"); + if (this.yaml.sortByAsc) { + dropdown.setValue("asc"); + } else { + dropdown.setValue("desc"); + } + dropdown.onChange(async (value) => { + if (value === "desc") { + this.yaml.sortByAsc = false; + } else { + this.yaml.sortByAsc = true; + } + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + }); + }); + if (this.yaml.style === "list") { + new import_obsidian21.Setting(contentEl).setName("Show folder names of folders that appear empty in the folder overview").setDesc("Show the names of folders that appear to have no files/folders in the folder overview. That's mostly the case when you set the file depth to 1.").addToggle((toggle) => { + toggle.setValue(this.yaml.showEmptyFolders).onChange(async (value) => { + this.yaml.showEmptyFolders = value; + this.yaml.onlyIncludeSubfolders = false; + this.display(); + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + }); + }); + if (this.yaml.showEmptyFolders) { + new import_obsidian21.Setting(contentEl).setName("Only show first empty subfolders of current folder").addToggle((toggle) => { + toggle.setValue(this.yaml.onlyIncludeSubfolders).onChange(async (value) => { + this.yaml.onlyIncludeSubfolders = value; + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + }); + }); + } + } + if (this.yaml.style === "explorer") { + new import_obsidian21.Setting(contentEl).setName("Disable collapse icon for folder notes").setDesc("Remove the collapse icon next to the folder name for folder notes when they only contain the folder note itself").addToggle((toggle) => { + toggle.setValue(this.yaml.disableCollapseIcon).onChange(async (value) => { + this.yaml.disableCollapseIcon = value; + if (this.defaultSettings) { + return this.plugin.saveSettings(); + } + await updateYaml(this.plugin, this.ctx, this.el, this.yaml); + }); + }); + } + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/settings/FolderOverviewSettings.ts +async function renderFolderOverview(settingsTab) { + const containerEl = settingsTab.settingsPage; + new import_obsidian22.Setting(containerEl).setName("Manage folder overview defaults").setDesc("Manage the default settings for the folder overview plugin").addButton((button) => button.setButtonText("Manage").setCta().onClick(async () => { + new FolderOverviewSettings(settingsTab.plugin.app, settingsTab.plugin, settingsTab.plugin.settings.defaultOverview, null, null, true).open(); + })); +} + +// src/settings/ExcludedFoldersSettings.ts +var import_obsidian23 = require("obsidian"); +async function renderExcludeFolders(settingsTab) { + const containerEl = settingsTab.settingsPage; + const manageExcluded = new import_obsidian23.Setting(containerEl).setHeading().setClass("fn-excluded-folder-heading").setName("Manage excluded folders"); + const desc3 = document.createDocumentFragment(); + desc3.append("Add {regex} at the beginning of the folder name to use a regex pattern.", desc3.createEl("br"), "Use * before and after to exclude folders that include the name between the *s.", desc3.createEl("br"), "Use * before the folder name to exclude folders that end with the folder name.", desc3.createEl("br"), "Use * after the folder name to exclude folders that start with the folder name."); + manageExcluded.setDesc(desc3); + manageExcluded.infoEl.appendText("The regexes and wildcards are only for the folder name, not the path."); + manageExcluded.infoEl.createEl("br"); + manageExcluded.infoEl.appendText("If you want to switch to a folder path delete the pattern first."); + manageExcluded.infoEl.style.color = settingsTab.app.vault.getConfig("accentColor") || "#7d5bed"; + new import_obsidian23.Setting(containerEl).setName("Exclude folder default settings").addButton((cb) => { + cb.setButtonText("Manage"); + cb.setCta(); + cb.onClick(async () => { + new ExcludedFolderSettings(settingsTab.app, settingsTab.plugin, settingsTab.plugin.settings.excludeFolderDefaultSettings).open(); + }); + }); + new import_obsidian23.Setting(containerEl).setName("Exclude pattern default settings").addButton((cb) => { + cb.setButtonText("Manage"); + cb.setCta(); + cb.onClick(async () => { + new PatternSettings(settingsTab.app, settingsTab.plugin, settingsTab.plugin.settings.excludePatternDefaultSettings).open(); + }); + }); + new import_obsidian23.Setting(containerEl).setName("Add excluded folder").setClass("add-exclude-folder-item").addButton((cb) => { + cb.setIcon("plus"); + cb.setClass("add-exclude-folder"); + cb.setTooltip("Add excluded folder"); + cb.onClick(() => { + const excludedFolder = new ExcludedFolder("", settingsTab.plugin.settings.excludeFolders.length, settingsTab.plugin); + addExcludeFolderListItem(settingsTab, containerEl, excludedFolder); + addExcludedFolder(settingsTab.plugin, excludedFolder); + settingsTab.display(); + }); + }); + settingsTab.plugin.settings.excludeFolders.sort((a, b) => a.position - b.position).forEach((excludedFolder) => { + var _a, _b; + if (((_a = excludedFolder.string) == null ? void 0 : _a.trim()) !== "" && ((_b = excludedFolder.path) == null ? void 0 : _b.trim()) === "") { + addExcludePatternListItem(settingsTab, containerEl, excludedFolder); + } else { + addExcludeFolderListItem(settingsTab, containerEl, excludedFolder); + } + }); +} + +// src/settings/SettingsTab.ts +var DEFAULT_SETTINGS = { + syncFolderName: true, + ctrlKey: true, + altKey: false, + hideFolderNote: true, + templatePath: "", + autoCreate: false, + enableCollapsing: false, + excludeFolders: [], + whitelistFolders: [], + showDeleteConfirmation: true, + underlineFolder: true, + stopWhitespaceCollapsing: true, + underlineFolderInPath: true, + openFolderNoteOnClickInPath: true, + openInNewTab: false, + folderNoteName: "{{folder_name}}", + folderNoteType: ".md", + disableFolderHighlighting: false, + newFolderNoteName: "{{folder_name}}", + storageLocation: "insideFolder", + syncDelete: false, + showRenameConfirmation: true, + defaultOverview: { + id: "", + folderPath: "", + title: "{{folderName}} overview", + showTitle: false, + depth: 3, + includeTypes: ["folder", "markdown"], + style: "list", + disableFileTag: false, + sortBy: "name", + sortByAsc: true, + showEmptyFolders: false, + onlyIncludeSubfolders: false, + storeFolderCondition: true, + showFolderNotes: false, + disableCollapseIcon: true + }, + useSubmenus: true, + syncMove: true, + frontMatterTitle: { + enabled: false, + explorer: true, + path: true + }, + settingsTab: "general", + supportedFileTypes: ["md", "canvas"], + boldName: false, + boldNameInPath: false, + cursiveName: false, + cursiveNameInPath: false, + disableOpenFolderNoteOnClick: false, + openByClick: true, + openWithCtrl: false, + openWithAlt: false, + excludeFolderDefaultSettings: { + type: "folder", + path: "", + subFolders: true, + disableSync: true, + disableAutoCreate: true, + disableFolderNote: false, + enableCollapsing: false, + position: 0, + excludeFromFolderOverview: false, + string: "", + hideInSettings: false + }, + excludePatternDefaultSettings: { + type: "pattern", + path: "", + subFolders: true, + disableSync: true, + disableAutoCreate: true, + disableFolderNote: false, + enableCollapsing: false, + position: 0, + excludeFromFolderOverview: false, + string: "", + hideInSettings: false + }, + hideCollapsingIcon: false, + tabManagerEnabled: true, + ignoreAttachmentFolder: true, + deleteFilesAction: "trash" +}; +var SettingsTab = class extends import_obsidian24.PluginSettingTab { + constructor(app2, plugin) { + super(app2, plugin); + this.TABS = { + GENERAL: { + name: "General", + id: "general" + }, + FOLDER_OVERVIEW: { + name: "Folder overview", + id: "folder_overview" + }, + EXCLUDE_FOLDERS: { + name: "Exclude folders", + id: "exclude_folders" + }, + FILE_EXPLORER: { + name: "File explorer", + id: "file_explorer" + }, + PATH: { + name: "Path", + id: "path" + } + }; + } + renderSettingsPage(tabId) { + this.settingsPage.empty(); + switch (tabId.toLocaleLowerCase()) { + case this.TABS.GENERAL.id: + renderGeneral(this); + break; + case this.TABS.FOLDER_OVERVIEW.id: + renderFolderOverview(this); + break; + case this.TABS.EXCLUDE_FOLDERS.id: + renderExcludeFolders(this); + break; + case this.TABS.FILE_EXPLORER.id: + renderFileExplorer(this); + break; + case this.TABS.PATH.id: + renderPath(this); + break; + } + } + display() { + this.plugin.settingsOpened = true; + const { containerEl } = this; + containerEl.empty(); + const tabBar = containerEl.createEl("nav", { cls: "fn-settings-tab-bar" }); + for (const [tabId, tabInfo] of Object.entries(this.TABS)) { + const tabEl = tabBar.createEl("div", { cls: "fn-settings-tab" }); + const tabName = tabEl.createEl("div", { cls: "fn-settings-tab-name", text: tabInfo.name }); + if (this.plugin.settings.settingsTab.toLocaleLowerCase() === tabId.toLocaleLowerCase()) { + tabEl.addClass("fn-settings-tab-active"); + } + tabEl.addEventListener("click", () => { + for (const tabEl2 of tabBar.children) { + tabEl2.removeClass("fn-settings-tab-active"); + this.plugin.settings.settingsTab = tabId.toLocaleLowerCase(); + this.plugin.saveSettings(); + } + tabEl.addClass("fn-settings-tab-active"); + this.renderSettingsPage(tabId); + }); + } + this.settingsPage = containerEl.createDiv({ cls: "fn-settings-page" }); + this.renderSettingsPage(this.plugin.settings.settingsTab); + } + updateFolderNotes(newTemplate) { + new import_obsidian24.Notice("Starting to update folder notes..."); + for (const folder of this.app.vault.getAllLoadedFiles()) { + if (folder instanceof import_obsidian24.TFolder) { + const folderNote = getFolderNote(this.plugin, folder.path); + if (!(folderNote instanceof import_obsidian24.TFile)) { + continue; + } + const folderNoteName = newTemplate.replace("{{folder_name}}", folder.name); + const newPath = `${folder.path}/${folderNoteName}.${folderNote.extension}`; + if (this.plugin.app.vault.getAbstractFileByPath(newPath)) { + continue; + } + this.plugin.app.fileManager.renameFile(folderNote, newPath); + } + } + this.plugin.settings.folderNoteName = newTemplate; + this.plugin.saveSettings(); + new import_obsidian24.Notice("Finished updating folder notes"); + } + switchStorageLocation(oldMethod) { + new import_obsidian24.Notice("Starting to switch storage location..."); + this.app.vault.getAllLoadedFiles().forEach((file) => { + if (file instanceof import_obsidian24.TFolder) { + const folderNote = getFolderNote(this.plugin, file.path, oldMethod); + if (folderNote instanceof import_obsidian24.TFile) { + if (this.plugin.settings.storageLocation === "parentFolder") { + let newPath = ""; + if (getFolderPathFromString(file.path).trim() === "") { + newPath = `${folderNote.name}`; + } else { + newPath = `${getFolderPathFromString(file.path)}/${folderNote.name}`; + } + this.plugin.app.fileManager.renameFile(folderNote, newPath); + } else if (this.plugin.settings.storageLocation === "insideFolder") { + if (getFolderPathFromString(folderNote.path) === file.path) { + return; + } else { + const newPath = `${file.path}/${folderNote.name}`; + this.plugin.app.fileManager.renameFile(folderNote, newPath); + } + } + } + } + }); + new import_obsidian24.Notice("Finished switching storage location"); + } + onClose() { + this.plugin.settingsOpened = false; + } +}; + +// src/Commands.ts +var import_obsidian25 = require("obsidian"); +var Commands = class { + constructor(app2, plugin) { + this.plugin = plugin; + this.app = app2; + } + registerCommands() { + this.editorCommands(); + this.fileCommands(); + this.regularCommands(); + } + regularCommands() { + this.plugin.addCommand({ + id: "turn-into-folder-note", + name: "Make current active note a folder note for the folder of the active note", + callback: () => { + const file = this.app.workspace.getActiveFile(); + if (!(file instanceof import_obsidian25.TFile)) + return; + const folder = file.parent; + if (!(folder instanceof import_obsidian25.TFolder)) + return; + const folderNote = getFolderNote(this.plugin, folder.path); + turnIntoFolderNote(this.plugin, file, folder, folderNote); + } + }); + this.plugin.addCommand({ + id: "create-folder-note", + name: "Create folder note with a new folder for the active note in the current folder", + callback: async () => { + var _a, _b, _c; + const file = this.app.workspace.getActiveFile(); + if (!(file instanceof import_obsidian25.TFile)) + return; + let newPath = ((_a = file.parent) == null ? void 0 : _a.path) + "/" + file.basename; + if (((_b = file.parent) == null ? void 0 : _b.path) === "" || ((_c = file.parent) == null ? void 0 : _c.path) === "/") { + newPath = file.basename; + } + if (this.plugin.app.vault.getAbstractFileByPath(newPath)) { + return new import_obsidian25.Notice("Folder already exists"); + } + const automaticallyCreateFolderNote = this.plugin.settings.autoCreate; + this.plugin.settings.autoCreate = false; + this.plugin.saveSettings(); + await this.plugin.app.vault.createFolder(newPath); + const folder = this.plugin.app.vault.getAbstractFileByPath(newPath); + if (!(folder instanceof import_obsidian25.TFolder)) + return; + createFolderNote(this.plugin, folder.path, true, "." + file.extension, false, file); + this.plugin.settings.autoCreate = automaticallyCreateFolderNote; + this.plugin.saveSettings(); + } + }); + this.plugin.addCommand({ + id: "create-folder-note-for-current-folder", + name: "Create markdown folder note for current folder of active note", + callback: () => { + const file = this.app.workspace.getActiveFile(); + if (!(file instanceof import_obsidian25.TFile)) + return; + const folder = file.parent; + if (!(folder instanceof import_obsidian25.TFolder)) + return; + createFolderNote(this.plugin, folder.path, true, ".md", false); + } + }); + this.plugin.settings.supportedFileTypes.forEach((fileType) => { + if (fileType === "md") + return; + this.plugin.addCommand({ + id: `create-${fileType}-folder-note-for-current-folder`, + name: `Create ${fileType} folder note for current folder of active note`, + callback: () => { + const file = this.app.workspace.getActiveFile(); + if (!(file instanceof import_obsidian25.TFile)) + return; + const folder = file.parent; + if (!(folder instanceof import_obsidian25.TFolder)) + return; + createFolderNote(this.plugin, folder.path, true, "." + fileType, false); + } + }); + }); + this.plugin.addCommand({ + id: "delete-folder-note-for-current-folder", + name: "Delete folder note of current folder of active note", + callback: () => { + const file = this.app.workspace.getActiveFile(); + if (!(file instanceof import_obsidian25.TFile)) + return; + const folder = file.parent; + if (!(folder instanceof import_obsidian25.TFolder)) + return; + const folderNote = getFolderNote(this.plugin, folder.path); + if (!(folderNote instanceof import_obsidian25.TFile)) + return; + deleteFolderNote(this.plugin, folderNote, true); + } + }); + this.plugin.addCommand({ + id: "open-folder-note-for-current-folder", + name: "Open folder note of current folder of active note", + callback: () => { + const file = this.app.workspace.getActiveFile(); + if (!(file instanceof import_obsidian25.TFile)) + return; + const folder = file.parent; + if (!(folder instanceof import_obsidian25.TFolder)) + return; + const folderNote = getFolderNote(this.plugin, folder.path); + if (!(folderNote instanceof import_obsidian25.TFile)) + return; + openFolderNote(this.plugin, folderNote); + } + }); + this.plugin.addCommand({ + id: "insert-folder-overview-fn", + name: "Insert folder overview", + editorCheckCallback: (checking, editor) => { + const line = editor.getCursor().line; + const lineText = editor.getLine(line); + if (lineText.trim() === "" || lineText.trim() === ">") { + if (!checking) { + let json = Object.assign({}, this.plugin.settings.defaultOverview); + json.id = crypto.randomUUID(); + const yaml = (0, import_obsidian25.stringifyYaml)(json); + if (lineText.trim() === "") { + editor.replaceSelection(`\`\`\`folder-overview +${yaml}\`\`\` +`); + } else if (lineText.trim() === ">") { + const lines = yaml.split("\n"); + const newLines = lines.map((line2) => { + return `> ${line2}`; + }); + editor.replaceSelection(`\`\`\`folder-overview +${newLines.join("\n")}\`\`\` +`); + } + } + return true; + } + return false; + } + }); + this.plugin.addCommand({ + id: "create-folder-note-from-selected-text", + name: "Create folder note from selected text", + editorCheckCallback: (checking, editor, view) => { + const text = editor.getSelection().trim(); + const line = editor.getCursor().line; + const file = view.file; + if (!(file instanceof import_obsidian25.TFile)) + return false; + if (text && text.trim() !== "") { + if (checking) { + return true; + } + const blacklist = ["*", "\\", '"', "/", "<", ">", "?", "|", ":"]; + for (const char of blacklist) { + if (text.includes(char)) { + new import_obsidian25.Notice('File name cannot contain any of the following characters: * " \\ / < > : | ?'); + return false; + } + } + if (text.endsWith(".")) { + new import_obsidian25.Notice("File name cannot end with a dot"); + return; + } + let folder; + const folderPath = getFolderPathFromString(file.path); + if (folderPath === "") { + folder = this.plugin.app.vault.getAbstractFileByPath(text); + if (folder instanceof import_obsidian25.TFolder) { + new import_obsidian25.Notice("Folder note already exists"); + return false; + } else { + this.plugin.app.vault.createFolder(text); + createFolderNote(this.plugin, text, false); + } + } else { + folder = this.plugin.app.vault.getAbstractFileByPath(folderPath + "/" + text); + if (folder instanceof import_obsidian25.TFolder) { + new import_obsidian25.Notice("Folder note already exists"); + return false; + } + if (this.plugin.settings.storageLocation === "parentFolder") { + if (this.app.vault.getAbstractFileByPath(folderPath + "/" + text + this.plugin.settings.folderNoteType)) { + new import_obsidian25.Notice("File already exists"); + return false; + } + } + this.plugin.app.vault.createFolder(folderPath + "/" + text); + createFolderNote(this.plugin, folderPath + "/" + text, false); + } + const fileName = this.plugin.settings.folderNoteName.replace("{{folder_name}}", text); + if (fileName !== text) { + editor.replaceSelection(`[[${fileName}]]`); + } else { + editor.replaceSelection(`[[${fileName}|${text}]]`); + } + return true; + } + return false; + } + }); + } + fileCommands() { + this.plugin.registerEvent(this.app.workspace.on("file-menu", (menu, file) => { + var _a, _b, _c; + let folder = file.parent; + if (file instanceof import_obsidian25.TFile) { + if (this.plugin.settings.storageLocation === "insideFolder") { + folder = file.parent; + } else { + const fileName = extractFolderName(this.plugin.settings.folderNoteName, file.basename); + if (fileName) { + if (((_a = file.parent) == null ? void 0 : _a.path) === "" || ((_b = file.parent) == null ? void 0 : _b.path) === "/") { + folder = this.plugin.app.vault.getAbstractFileByPath(fileName); + } else { + folder = this.plugin.app.vault.getAbstractFileByPath(((_c = file.parent) == null ? void 0 : _c.path) + "/" + fileName); + } + } + } + if (folder instanceof import_obsidian25.TFolder) { + const folderNote = getFolderNote(this.plugin, folder.path); + if ((folderNote == null ? void 0 : folderNote.path) === file.path) { + return; + } + } else if (file.parent instanceof import_obsidian25.TFolder) { + folder = file.parent; + } + } + menu.addItem((item) => { + if (import_obsidian25.Platform.isDesktop && !import_obsidian25.Platform.isTablet && this.plugin.settings.useSubmenus) { + item.setTitle("Folder Note Commands").setIcon("folder-edit"); + } + let subMenu; + if (!import_obsidian25.Platform.isDesktopApp || !import_obsidian25.Platform.isDesktop || import_obsidian25.Platform.isTablet || !this.plugin.settings.useSubmenus) { + subMenu = menu; + item.setDisabled(true); + } else { + subMenu = item.setSubmenu(); + } + if (file instanceof import_obsidian25.TFile) { + subMenu.addItem((item2) => { + item2.setTitle("Create folder note").setIcon("edit").onClick(async () => { + if (!folder) + return; + let newPath = folder.path + "/" + file.basename; + if (folder.path === "" || folder.path === "/") { + newPath = file.basename; + } + if (this.plugin.app.vault.getAbstractFileByPath(newPath)) { + return new import_obsidian25.Notice("Folder already exists"); + } + const automaticallyCreateFolderNote = this.plugin.settings.autoCreate; + this.plugin.settings.autoCreate = false; + this.plugin.saveSettings(); + await this.plugin.app.vault.createFolder(newPath); + const newFolder = this.plugin.app.vault.getAbstractFileByPath(newPath); + if (!(newFolder instanceof import_obsidian25.TFolder)) + return; + await createFolderNote(this.plugin, newFolder.path, true, "." + file.extension, false, file); + this.plugin.settings.autoCreate = automaticallyCreateFolderNote; + this.plugin.saveSettings(); + }); + }); + if (getFolderPathFromString(file.path) === "") + return; + if (!(folder instanceof import_obsidian25.TFolder)) + return; + subMenu.addItem((item2) => { + item2.setTitle(`Turn into folder note for ${folder == null ? void 0 : folder.name}`).setIcon("edit").onClick(() => { + if (!folder || !(folder instanceof import_obsidian25.TFolder)) + return; + const folderNote2 = getFolderNote(this.plugin, folder.path); + turnIntoFolderNote(this.plugin, file, folder, folderNote2); + }); + }); + } + if (!(file instanceof import_obsidian25.TFolder)) + return; + if (this.plugin.settings.excludeFolders.find((folder2) => folder2.path === file.path)) { + subMenu.addItem((item2) => { + item2.setTitle("Remove folder from excluded folders").setIcon("trash").onClick(() => { + this.plugin.settings.excludeFolders = this.plugin.settings.excludeFolders.filter((folder2) => folder2.path !== file.path); + this.plugin.saveSettings(); + new import_obsidian25.Notice("Successfully removed folder from excluded folders"); + }); + }); + return; + } + subMenu.addItem((item2) => { + item2.setTitle("Exclude folder from folder notes").setIcon("x-circle").onClick(() => { + const excludedFolder = new ExcludedFolder(file.path, this.plugin.settings.excludeFolders.length, this.plugin); + this.plugin.settings.excludeFolders.push(excludedFolder); + this.plugin.saveSettings(); + new import_obsidian25.Notice("Successfully excluded folder from folder notes"); + }); + }); + if (!(file instanceof import_obsidian25.TFolder)) + return; + const folderNote = getFolderNote(this.plugin, file.path); + if (folderNote instanceof import_obsidian25.TFile) { + subMenu.addItem((item2) => { + item2.setTitle("Delete folder note").setIcon("trash").onClick(() => { + deleteFolderNote(this.plugin, folderNote, true); + }); + }); + subMenu.addItem((item2) => { + item2.setTitle("Open folder note").setIcon("chevron-right-square").onClick(() => { + openFolderNote(this.plugin, folderNote); + }); + }); + subMenu.addItem((item2) => { + item2.setTitle("Copy Obsidian URL").setIcon("link").onClick(() => { + this.app.copyObsidianUrl(folderNote); + }); + }); + } else { + subMenu.addItem((item2) => { + item2.setTitle("Create markdown folder note").setIcon("edit").onClick(() => { + createFolderNote(this.plugin, file.path, true, ".md"); + }); + }); + this.plugin.settings.supportedFileTypes.forEach((fileType) => { + if (fileType === "md") + return; + subMenu.addItem((item2) => { + item2.setTitle(`Create ${fileType} folder note`).setIcon("edit").onClick(() => { + createFolderNote(this.plugin, file.path, true, "." + fileType); + }); + }); + }); + } + }); + })); + } + editorCommands() { + this.plugin.registerEvent(this.plugin.app.workspace.on("editor-menu", (menu, editor, view) => { + const text = editor.getSelection().trim(); + const line = editor.getCursor().line; + const lineText = editor.getLine(line); + if (lineText.trim() === "" || lineText.trim() === ">") { + menu.addItem((item) => { + item.setTitle("Create folder overview").setIcon("edit").onClick(() => { + let json = Object.assign({}, this.plugin.settings.defaultOverview); + json.id = crypto.randomUUID(); + const yaml = (0, import_obsidian25.stringifyYaml)(json); + if (lineText.trim() === "") { + editor.replaceSelection(`\`\`\`folder-overview +${yaml}\`\`\` +`); + } else if (lineText.trim() === ">") { + const lines = yaml.split("\n"); + const newLines = lines.map((line2) => { + return `> ${line2}`; + }); + editor.replaceSelection(`\`\`\`folder-overview +${newLines.join("\n")}\`\`\` +`); + } + }); + }); + } + if (!text || text.trim() === "") + return; + menu.addItem((item) => { + item.setTitle("Create folder note").setIcon("edit").onClick(() => { + const file = view.file; + if (!(file instanceof import_obsidian25.TFile)) + return; + const blacklist = ["*", "\\", '"', "/", "<", ">", "?", "|", ":"]; + for (const char of blacklist) { + if (text.includes(char)) { + new import_obsidian25.Notice('File name cannot contain any of the following characters: * " \\ / < > : | ?'); + return; + } + } + if (text.endsWith(".")) { + new import_obsidian25.Notice("File name cannot end with a dot"); + return; + } + let folder; + const folderPath = getFolderPathFromString(file.path); + const fileName = this.plugin.settings.folderNoteName.replace("{{folder_name}}", text); + if (folderPath === "") { + folder = this.plugin.app.vault.getAbstractFileByPath(text); + if (folder instanceof import_obsidian25.TFolder) { + return new import_obsidian25.Notice("Folder note already exists"); + } else { + this.plugin.app.vault.createFolder(text); + createFolderNote(this.plugin, text, false); + } + } else { + folder = this.plugin.app.vault.getAbstractFileByPath(folderPath + "/" + text); + if (folder instanceof import_obsidian25.TFolder) { + return new import_obsidian25.Notice("Folder note already exists"); + } + if (this.plugin.settings.storageLocation === "parentFolder") { + if (this.app.vault.getAbstractFileByPath(folderPath + "/" + fileName + this.plugin.settings.folderNoteType)) { + return new import_obsidian25.Notice("File already exists"); + } + } + this.plugin.app.vault.createFolder(folderPath + "/" + text); + createFolderNote(this.plugin, folderPath + "/" + text, false); + } + if (fileName !== text) { + editor.replaceSelection(`[[${fileName}]]`); + } else { + editor.replaceSelection(`[[${fileName}|${text}]]`); + } + }); + }); + })); + } +}; + +// src/events/handleClick.ts +var import_obsidian26 = require("obsidian"); +async function handleViewHeaderClick(event, plugin) { + if (!(event.target instanceof HTMLElement)) + return; + if (!plugin.settings.openFolderNoteOnClickInPath) + return; + const folderPath = event.target.getAttribute("data-path"); + if (!folderPath) { + return; + } + const excludedFolder = getExcludedFolder(plugin, folderPath); + if (excludedFolder == null ? void 0 : excludedFolder.disableFolderNote) { + event.target.onclick = null; + event.target.click(); + return; + } else if ((excludedFolder == null ? void 0 : excludedFolder.enableCollapsing) || plugin.settings.enableCollapsing) { + event.target.onclick = null; + event.target.click(); + } + const folderNote = getFolderNote(plugin, folderPath); + if (folderNote) { + return openFolderNote(plugin, folderNote, event); + } else if (event.altKey || import_obsidian26.Keymap.isModEvent(event) === "tab") { + if (plugin.settings.altKey && event.altKey || plugin.settings.ctrlKey && import_obsidian26.Keymap.isModEvent(event) === "tab") { + await createFolderNote(plugin, folderPath, true, void 0, true); + addCSSClassToTitleEL(folderPath, "has-folder-note"); + removeCSSClassFromEL(folderPath, "has-not-folder-note"); + return; + } + } + event.target.onclick = null; + event.target.click(); +} +async function handleFolderClick(event, plugin) { + var _a, _b, _c; + if (!(event.target instanceof HTMLElement)) + return; + if (!event || !event.target) + return; + event.stopImmediatePropagation(); + const folderPath = (_a = event.target.parentElement) == null ? void 0 : _a.getAttribute("data-path"); + if (!folderPath) { + return; + } + const excludedFolder = getExcludedFolder(plugin, folderPath); + if (excludedFolder == null ? void 0 : excludedFolder.disableFolderNote) { + event.target.onclick = null; + event.target.click(); + return; + } else if ((excludedFolder == null ? void 0 : excludedFolder.enableCollapsing) || plugin.settings.enableCollapsing) { + event.target.onclick = null; + event.target.click(); + } + const folderNote = getFolderNote(plugin, folderPath); + if (folderNote) { + if (plugin.settings.openByClick) { + return openFolderNote(plugin, folderNote, event); + } else if (plugin.settings.openWithCtrl && import_obsidian26.Keymap.isModEvent(event) === "tab") { + return openFolderNote(plugin, folderNote, event); + } else if (plugin.settings.openWithAlt && event.altKey) { + return openFolderNote(plugin, folderNote, event); + } else { + if (plugin.settings.enableCollapsing) + return; + (_b = event.target.parentElement) == null ? void 0 : _b.click(); + return; + } + } else if (event.altKey || import_obsidian26.Keymap.isModEvent(event) === "tab") { + if (plugin.settings.altKey && event.altKey || plugin.settings.ctrlKey && import_obsidian26.Keymap.isModEvent(event) === "tab") { + await createFolderNote(plugin, folderPath, true, void 0, true); + addCSSClassToTitleEL(folderPath, "has-folder-note"); + removeCSSClassFromEL(folderPath, "has-not-folder-note"); + return; + } + } else if (!folderNote) { + if (plugin.settings.enableCollapsing) + return; + return (_c = event.target.parentElement) == null ? void 0 : _c.click(); + } + event.target.onclick = null; + event.target.click(); +} + +// src/events/MutationObserver.ts +var import_obsidian27 = require("obsidian"); +async function addObserver(plugin) { + plugin.observer = new MutationObserver((mutations) => { + mutations.forEach((rec) => { + if (rec.type === "childList") { + rec.target.querySelectorAll("div.nav-folder-title-content").forEach((element) => { + var _a; + if (element.onclick) + return; + if (import_obsidian27.Platform.isMobile && plugin.settings.disableOpenFolderNoteOnClick) + return; + const folderPath = ((_a = element.parentElement) == null ? void 0 : _a.getAttribute("data-path")) || ""; + const apply = applyCSSClassesToFolder(folderPath, plugin); + element.addEventListener("auxclick", (event) => { + if (event.button == 1) { + handleFolderClick(event, plugin); + } + }, { capture: true }); + element.onclick = (event) => handleFolderClick(event, plugin); + plugin.registerDomEvent(element, "pointerover", (event) => { + var _a2, _b; + plugin.hoveredElement = element; + plugin.mouseEvent = event; + if (!import_obsidian27.Keymap.isModEvent(event)) + return; + if (!(event.target instanceof HTMLElement)) + return; + const folderPath2 = ((_b = (_a2 = event == null ? void 0 : event.target) == null ? void 0 : _a2.parentElement) == null ? void 0 : _b.getAttribute("data-path")) || ""; + const folderNote = getFolderNote(plugin, folderPath2); + if (!folderNote) + return; + plugin.app.workspace.trigger("hover-link", { + event, + source: "preview", + hoverParent: { + file: folderNote + }, + targetEl: event.target, + linktext: folderNote == null ? void 0 : folderNote.basename, + sourcePath: folderNote == null ? void 0 : folderNote.path + }); + plugin.hoverLinkTriggered = true; + }); + plugin.registerDomEvent(element, "pointerout", () => { + plugin.hoveredElement = null; + plugin.mouseEvent = null; + plugin.hoverLinkTriggered = false; + }); + }); + if (!plugin.settings.openFolderNoteOnClickInPath) { + return; + } + rec.target.querySelectorAll("span.view-header-breadcrumb").forEach((element) => { + var _a, _b; + const breadcrumbs = (_a = element.parentElement) == null ? void 0 : _a.querySelectorAll("span.view-header-breadcrumb"); + if (!breadcrumbs) + return; + let path = ""; + breadcrumbs.forEach((breadcrumb) => { + var _a2; + if (breadcrumb.hasAttribute("old-name")) { + path += breadcrumb.getAttribute("old-name") + "/"; + } else { + path += breadcrumb.innerText.trim() + "/"; + } + const folderPath = path.slice(0, -1); + breadcrumb.setAttribute("data-path", folderPath); + const folder = (_a2 = plugin.fmtpHandler) == null ? void 0 : _a2.modifiedFolders.get(folderPath); + if (folder && plugin.settings.frontMatterTitle.path && plugin.settings.frontMatterTitle.enabled) { + breadcrumb.setAttribute("old-name", folder.name || ""); + breadcrumb.innerText = folder.newName || ""; + } + const folderNote = getFolderNote(plugin, folderPath); + if (folderNote) { + breadcrumb.classList.add("has-folder-note"); + } + }); + (_b = element.parentElement) == null ? void 0 : _b.setAttribute("data-path", path.slice(0, -1)); + if (breadcrumbs.length > 0) { + breadcrumbs.forEach((breadcrumb) => { + if (breadcrumb.onclick) + return; + breadcrumb.onclick = (event) => handleViewHeaderClick(event, plugin); + }); + } + }); + } + }); + }); +} + +// src/events/handleRename.ts +var import_obsidian28 = require("obsidian"); +function handleRename(file, oldPath, plugin) { + if (!plugin.settings.syncFolderName) { + removeCSSClassFromEL(file.path, "has-folder-note"); + removeCSSClassFromEL(file.path, "is-folder-note"); + return; + } + const folder = file.parent; + const oldFolder = plugin.app.vault.getAbstractFileByPath(getFolderPathFromString(oldPath)); + if (folder instanceof import_obsidian28.TFolder) { + if (plugin.isEmptyFolderNoteFolder(folder)) { + addCSSClassToTitleEL(folder.path, "only-has-folder-note"); + } else { + removeCSSClassFromEL(folder.path, "only-has-folder-note"); + } + } + if (oldFolder instanceof import_obsidian28.TFolder) { + if (plugin.isEmptyFolderNoteFolder(oldFolder)) { + addCSSClassToTitleEL(oldFolder.path, "only-has-folder-note"); + } else { + removeCSSClassFromEL(oldFolder.path, "only-has-folder-note"); + } + } + if (file instanceof import_obsidian28.TFolder) { + plugin.tabManager.updateTab(file.path); + return handleFolderRename(file, oldPath, plugin); + } else if (file instanceof import_obsidian28.TFile) { + return handleFileRename(file, oldPath, plugin); + } +} +function handleFolderRename(file, oldPath, plugin) { + const fileName = plugin.settings.folderNoteName.replace("{{folder_name}}", file.name); + const folder = plugin.app.vault.getAbstractFileByPath(file.path); + const folderNote = getFolderNote(plugin, oldPath); + if (!(folderNote instanceof import_obsidian28.TFile)) + return; + if (!(folder instanceof import_obsidian28.TFolder)) + return; + const excludedFolders = plugin.settings.excludeFolders.filter((excludedFolder2) => excludedFolder2.path.includes(oldPath)); + excludedFolders.forEach((excludedFolder2) => { + if (excludedFolder2.path === oldPath) { + excludedFolder2.path = folder.path; + return; + } + const folders = excludedFolder2.path.split("/"); + if (folders.length < 1) { + folders.push(excludedFolder2.path); + } + folders[folders.indexOf(folder.name)] = folder.name; + excludedFolder2.path = folders.join("/"); + }); + plugin.saveSettings(); + const excludedFolder = getExcludedFolder(plugin, file.path); + if ((excludedFolder == null ? void 0 : excludedFolder.disableSync) && !folderNote) { + return removeCSSClassFromEL(file.path, "has-folder-note"); + } + let newPath = ""; + if (plugin.settings.storageLocation === "parentFolder") { + const parentFolderPath = getFolderPathFromString(file.path); + const oldParentFolderPath = getFolderPathFromString(oldPath); + if (parentFolderPath !== oldParentFolderPath) { + if (!plugin.settings.syncMove) { + return; + } + newPath = `${parentFolderPath}/${fileName}.${folderNote.extension}`; + } else if (parentFolderPath.trim() === "") { + folderNote.path = `${folderNote.name}`; + newPath = `${fileName}.${folderNote.extension}`; + } else { + folderNote.path = `${parentFolderPath}/${folderNote.name}`; + newPath = `${parentFolderPath}/${fileName}.${folderNote.extension}`; + } + } else { + folderNote.path = `${file.path}/${folderNote.name}`; + newPath = `${file.path}/${fileName}.${folderNote.extension}`; + } + plugin.app.fileManager.renameFile(folderNote, newPath); +} +function handleFileRename(file, oldPath, plugin) { + const oldFileName = removeExtension(getFileNameFromPathString(oldPath)); + const oldFolder = getFolderNoteFolder(plugin, oldPath, oldFileName); + const folderName = extractFolderName(plugin.settings.folderNoteName, file.basename) || file.basename; + const oldFolderName = extractFolderName(plugin.settings.folderNoteName, oldFileName) || oldFileName; + const newFolder = getFolderNoteFolder(plugin, file, file.basename); + let excludedFolder = getExcludedFolder(plugin, (newFolder == null ? void 0 : newFolder.path) || ""); + const folderNote = getFolderNote(plugin, oldPath, plugin.settings.storageLocation, file); + if ((excludedFolder == null ? void 0 : excludedFolder.disableSync) && folderName === (newFolder == null ? void 0 : newFolder.name)) { + addCSSClassToTitleEL(file.path, "is-folder-note"); + addCSSClassToTitleEL(newFolder.path, "has-folder-note"); + return; + } else if (excludedFolder == null ? void 0 : excludedFolder.disableSync) { + removeCSSClassFromEL(file.path, "is-folder-note"); + removeCSSClassFromEL((newFolder == null ? void 0 : newFolder.path) || "", "has-folder-note"); + return; + } + if (folderName === (newFolder == null ? void 0 : newFolder.name) && folderNote) { + new import_obsidian28.Notice("Folder with same name already exists!"); + let excludedFolderExisted = true; + let disabledSync = false; + if (!excludedFolder) { + excludedFolderExisted = false; + excludedFolder = new ExcludedFolder((oldFolder == null ? void 0 : oldFolder.path) || "", plugin.settings.excludeFolders.length, plugin); + addExcludedFolder(plugin, excludedFolder); + } else if (!excludedFolder.disableSync) { + disabledSync = false; + excludedFolder.disableSync = true; + updateExcludedFolder(plugin, excludedFolder, excludedFolder); + } + return plugin.app.fileManager.renameFile(file, oldPath).then(() => { + if (!excludedFolder) { + return; + } + if (!excludedFolderExisted) { + deleteExcludedFolder(plugin, excludedFolder); + } else if (!disabledSync) { + excludedFolder.disableSync = false; + updateExcludedFolder(plugin, excludedFolder, excludedFolder); + } + }); + } + if (folderName === (newFolder == null ? void 0 : newFolder.name)) { + addCSSClassToTitleEL(file.path, "is-folder-note"); + removeCSSClassFromEL(oldFolder == null ? void 0 : oldFolder.path, "has-folder-note"); + addCSSClassToTitleEL(newFolder.path, "has-folder-note"); + return; + } + if (!oldFolder) + return; + if (oldFolderName === oldFolder.name && (newFolder == null ? void 0 : newFolder.path) === oldFolder.path) { + return renameFolderOnFileRename(file, oldPath, oldFolder, plugin); + } else if (folderNote && oldFolderName === oldFolder.name) { + return renameFolderOnFileRename(file, oldPath, oldFolder, plugin); + } + if (oldFolder.name === oldFileName && (newFolder == null ? void 0 : newFolder.path) !== oldFolder.path) { + removeCSSClassFromEL(oldFolder.path, "has-folder-note"); + removeCSSClassFromEL(file.path, "is-folder-note"); + removeCSSClassFromEL(oldPath, "is-folder-note"); + } +} +async function renameFolderOnFileRename(file, oldPath, oldFolder, plugin) { + var _a, _b; + const newFolderName = extractFolderName(plugin.settings.folderNoteName, file.basename); + if (!newFolderName) { + removeCSSClassFromEL(oldFolder.path, "has-folder-note"); + removeCSSClassFromEL(file.path, "is-folder-note"); + return; + } else if (newFolderName === oldFolder.name) { + addCSSClassToTitleEL(oldFolder.path, "has-folder-note"); + addCSSClassToTitleEL(file.path, "is-folder-note"); + return; + } + let newFolderPath = ""; + if (plugin.settings.storageLocation === "insideFolder") { + if (((_a = oldFolder.parent) == null ? void 0 : _a.path) === "/") { + newFolderPath = `${newFolderName}`; + } else { + newFolderPath = ((_b = oldFolder.parent) == null ? void 0 : _b.path) + "/" + newFolderName; + } + } else { + const parentFolderPath = getFolderPathFromString(file.path); + if (parentFolderPath.trim() === "" || parentFolderPath.trim() === "/") { + newFolderPath = `${newFolderName}`; + } else { + newFolderPath = `${parentFolderPath}/${newFolderName}`; + } + } + if (plugin.app.vault.getAbstractFileByPath(newFolderPath)) { + await plugin.app.fileManager.renameFile(file, oldPath); + return new import_obsidian28.Notice("A folder with the same name already exists"); + } + plugin.app.fileManager.renameFile(oldFolder, newFolderPath); +} + +// src/events/handleCreate.ts +var import_obsidian29 = require("obsidian"); +function handleCreate(file, plugin) { + if (!plugin.app.workspace.layoutReady) + return; + const folder = file.parent; + if (folder instanceof import_obsidian29.TFolder) { + if (plugin.isEmptyFolderNoteFolder(folder)) { + addCSSClassToTitleEL(folder.path, "only-has-folder-note"); + } else { + removeCSSClassFromEL(folder.path, "only-has-folder-note"); + } + } + if (file instanceof import_obsidian29.TFile) { + const folder2 = getFolder2(plugin, file); + if (!(folder2 instanceof import_obsidian29.TFolder)) { + return; + } + const folderNote2 = getFolderNote(plugin, folder2.path); + if (folderNote2 && folderNote2.path === file.path) { + addCSSClassToTitleEL(folder2.path, "has-folder-note"); + addCSSClassToTitleEL(file.path, "is-folder-note"); + return; + } + } + if (!plugin.app.workspace.layoutReady) + return; + if (!(file instanceof import_obsidian29.TFolder)) + return; + if (!plugin.settings.autoCreate) + return; + const excludedFolder = getExcludedFolder(plugin, file.path); + if (excludedFolder == null ? void 0 : excludedFolder.disableAutoCreate) + return; + const folderNote = getFolderNote(plugin, file.path); + if (folderNote) + return; + createFolderNote(plugin, file.path, true, void 0, true); + addCSSClassToTitleEL(file.path, "has-folder-note"); +} + +// src/events/TabManager.ts +var import_obsidian30 = require("obsidian"); +var TabManager = class { + constructor(plugin) { + this.plugin = plugin; + this.app = plugin.app; + } + resetTabs() { + if (!this.isEnabled()) + return; + this.app.workspace.iterateAllLeaves((leaf) => { + var _a; + if (!(leaf.view instanceof import_obsidian30.EditableFileView)) + return; + const file = (_a = leaf.view) == null ? void 0 : _a.file; + if (!file) + return; + leaf.tabHeaderInnerTitleEl.setText(file.basename); + }); + } + updateTabs() { + if (!this.isEnabled()) + return; + this.app.workspace.iterateAllLeaves((leaf) => { + var _a; + if (!(leaf.view instanceof import_obsidian30.EditableFileView)) + return; + const file = (_a = leaf.view) == null ? void 0 : _a.file; + if (!file) + return; + const folder = getFolder2(this.plugin, file); + if (!folder) + return; + leaf.tabHeaderInnerTitleEl.setText(folder.name); + }); + } + updateTab(folderPath) { + if (!this.isEnabled()) + return; + const folder = this.app.vault.getAbstractFileByPath(folderPath); + if (!(folder instanceof import_obsidian30.TFolder)) + return; + const folderNote = getFolderNote(this.plugin, folder.path); + if (!folderNote) + return; + this.app.workspace.iterateAllLeaves((leaf) => { + var _a; + if (!(leaf.view instanceof import_obsidian30.EditableFileView)) + return; + const file = (_a = leaf.view) == null ? void 0 : _a.file; + if (!file) + return; + if (file.path === folderNote.path) { + leaf.tabHeaderInnerTitleEl.setText(folder.name); + } + }); + } + isEnabled() { + if (this.plugin.settings.folderNoteName == "{{folder_name}}") + return false; + return this.plugin.settings.tabManagerEnabled; + } +}; + +// src/functions/ListComponent.ts +var import_obsidian31 = require("obsidian"); +var ListComponent = class { + constructor(containerEl) { + this.containerEl = containerEl; + this.controlEl = containerEl.querySelector(".setting-item-control") || containerEl; + this.listEl = this.controlEl.createDiv("setting-command-hotkeys"); + } + addModal(modal) { + this.modal = modal; + this.values = modal.yaml.includeTypes || []; + return this; + } + addSettings(settings) { + this.settings = settings; + return this; + } + setValues(values) { + this.listEl.empty(); + this.values = values; + if (this.modal) { + this.modal.yaml.includeTypes = values; + } + if (values.length !== 0) { + values.forEach((value) => { + this.addElement(value); + }); + } + if (this.modal && this.modal.defaultSettings) { + this.modal.plugin.saveSettings(); + return this; + } else if (this.settings) { + this.settings.plugin.settings.supportedFileTypes = values; + this.settings.plugin.saveSettings(); + return this; + } + if (!this.modal) + return this; + updateYaml(this.modal.plugin, this.modal.ctx, this.modal.el, this.modal.yaml); + return this; + } + addElement(value) { + this.listEl.createSpan("setting-hotkey", (span) => { + if (value.toLocaleLowerCase() === "md") { + span.innerText = "markdown"; + } else { + span.innerText = value; + } + const removeSpan = span.createEl("span", { cls: "ofn-list-item-remove setting-hotkey-icon" }); + const svg = ''; + const svgElement = removeSpan.createEl("span", { cls: "ofn-list-item-remove-icon" }); + svgElement.innerHTML = svg; + removeSpan.onClickEvent((e) => { + this.removeValue(value); + span.remove(); + }); + }); + } + async addValue(value) { + this.values.push(value); + this.addElement(value); + if (this.settings) { + this.settings.plugin.settings.supportedFileTypes = this.values; + this.settings.plugin.saveSettings(); + } + if (!this.modal) + return this; + this.modal.yaml.includeTypes = this.values; + return this; + } + addResetButton() { + const resetButton = this.controlEl.createEl("span", { cls: "clickable-icon setting-restore-hotkey-button" }); + const svg = ''; + resetButton.innerHTML = svg; + resetButton.onClickEvent((e) => { + if (this.modal) { + this.modal.plugin.loadSettings(); + this.setValues(this.modal.plugin.settings.defaultOverview.includeTypes || []); + this.modal.display(); + } else if (this.settings) { + this.setValues(["md", "canvas"]); + this.settings.display(); + } + }); + return this; + } + removeValue(value) { + if (value === "all") { + if (this.modal) { + this.modal.plugin.loadSettings(); + this.setValues(this.modal.plugin.settings.defaultOverview.includeTypes || []); + this.modal.display(); + } else if (this.settings) { + this.setValues(["md", "canvas"]); + this.settings.display(); + } + } else { + this.values = this.values.filter((v) => v !== value); + this.setValues(this.values); + if (this.modal) { + this.modal.display(); + } else if (this.settings) { + this.settings.display(); + } + } + } +}; +function createList(cb) { + const list = new ListComponent(this.settingEl); + cb(list); + return list; +} +import_obsidian31.Setting.prototype.createList = createList; + +// src/events/handleDelete.ts +var import_obsidian32 = require("obsidian"); +function handleDelete(file, plugin) { + const folder = plugin.app.vault.getAbstractFileByPath(getFolderPathFromString(file.path)); + if (folder instanceof import_obsidian32.TFolder) { + if (plugin.isEmptyFolderNoteFolder(folder)) { + addCSSClassToTitleEL(folder.path, "only-has-folder-note"); + } else { + removeCSSClassFromEL(folder.path, "only-has-folder-note"); + } + } + if (file instanceof import_obsidian32.TFile) { + const folder2 = getFolder2(plugin, file); + if (!folder2) { + return; + } + const folderNote2 = getFolderNote(plugin, folder2.path); + if (folderNote2) { + return; + } + removeCSSClassFromEL(folder2.path, "has-folder-note"); + removeCSSClassFromEL(folder2.path, "only-has-folder-note"); + } + if (!(file instanceof import_obsidian32.TFolder)) { + return; + } + const folderNote = getFolderNote(plugin, file.path); + if (!folderNote) { + return; + } + removeCSSClassFromEL(folderNote.path, "is-folder-note"); + if (!plugin.settings.syncDelete) { + return; + } + deleteFolderNote(plugin, folderNote, false); +} + +// src/main.ts +var FolderNotesPlugin = class extends import_obsidian33.Plugin { + constructor() { + super(...arguments); + this.fmtpHandler = null; + this.hoveredElement = null; + this.mouseEvent = null; + this.hoverLinkTriggered = false; + this.settingsOpened = false; + } + async onload() { + console.log("loading folder notes plugin"); + await this.loadSettings(); + this.settingsTab = new SettingsTab(this.app, this); + this.addSettingTab(this.settingsTab); + this.saveSettings(); + document.body.classList.add("folder-notes-plugin"); + if (this.settings.hideFolderNote) { + document.body.classList.add("hide-folder-note"); + } + if (this.settings.underlineFolder) { + document.body.classList.add("folder-note-underline"); + } + if (this.settings.boldName) { + document.body.classList.add("folder-note-bold"); + } + if (this.settings.cursiveName) { + document.body.classList.add("folder-note-cursive"); + } + if (this.settings.boldNameInPath) { + document.body.classList.add("folder-note-bold-path"); + } + if (this.settings.cursiveNameInPath) { + document.body.classList.add("folder-note-cursive-path"); + } + if (this.settings.underlineFolderInPath) { + document.body.classList.add("folder-note-underline-path"); + } + if (this.settings.stopWhitespaceCollapsing) { + document.body.classList.add("fn-whitespace-stop-collapsing"); + } + if (this.settings.hideCollapsingIcon) { + document.body.classList.add("fn-hide-collapse-icon"); + } + if ((0, import_obsidian33.requireApiVersion)("1.7.2")) { + document.body.classList.add("version-1-7-2"); + } + new Commands(this.app, this).registerCommands(); + this.app.workspace.onLayoutReady(() => { + if (this.settings.frontMatterTitle.enabled) { + this.fmtpHandler = new FrontMatterTitlePluginHandler(this); + } + this.tabManager = new TabManager(this); + this.tabManager.updateTabs(); + }); + await addObserver(this); + this.observer.observe(document.body, { + childList: true, + subtree: true + }); + this.registerDomEvent(window, "keydown", (event) => { + var _a; + const hoveredElement = this.hoveredElement; + if (this.hoverLinkTriggered) + return; + if (!hoveredElement) + return; + if (!import_obsidian33.Keymap.isModEvent(event)) + return; + const folderPath = ((_a = hoveredElement == null ? void 0 : hoveredElement.parentElement) == null ? void 0 : _a.getAttribute("data-path")) || ""; + const folderNote = getFolderNote(this, folderPath); + if (!folderNote) + return; + this.app.workspace.trigger("hover-link", { + event: this.mouseEvent, + source: "preview", + hoverParent: { + file: folderNote + }, + targetEl: hoveredElement, + linktext: folderNote == null ? void 0 : folderNote.basename, + sourcePath: folderNote == null ? void 0 : folderNote.path + }); + this.hoverLinkTriggered = true; + }); + this.registerEvent(this.app.vault.on("create", (file) => { + handleCreate(file, this); + })); + this.registerEvent(this.app.workspace.on("file-open", (openFile) => { + if (this.activeFolderDom) { + this.activeFolderDom.removeClass("fn-is-active"); + this.activeFolderDom = null; + } + if (!openFile || !openFile.basename) { + return; + } + const folder = getFolder2(this, openFile); + if (!folder) { + return; + } + const folderNote = getFolderNote(this, folder.path); + if (!folderNote) { + return; + } + if (folderNote.path !== openFile.path) { + return; + } + this.activeFolderDom = getEl(folder.path); + if (this.activeFolderDom) + this.activeFolderDom.addClass("fn-is-active"); + })); + this.registerEvent(this.app.vault.on("rename", (file, oldPath) => { + handleRename(file, oldPath, this); + })); + this.registerEvent(this.app.vault.on("delete", (file) => { + handleDelete(file, this); + })); + this.registerMarkdownCodeBlockProcessor("folder-overview", (source, el, ctx) => { + this.handleOverviewBlock(source, el, ctx); + }); + if (this.app.workspace.layoutReady) { + loadFileClasses(void 0, this); + this.registerEvent(this.app.workspace.on("layout-change", () => { + var _a; + loadFileClasses(void 0, this); + (_a = this.tabManager) == null ? void 0 : _a.updateTabs(); + })); + } else { + this.app.workspace.onLayoutReady(async () => { + loadFileClasses(void 0, this); + this.registerEvent(this.app.workspace.on("layout-change", () => { + var _a; + loadFileClasses(void 0, this); + (_a = this.tabManager) == null ? void 0 : _a.updateTabs(); + })); + }); + } + } + handleOverviewBlock(source, el, ctx) { + const observer = new MutationObserver(() => { + var _a; + const editButton = (_a = el.parentElement) == null ? void 0 : _a.childNodes.item(1); + if (editButton) { + editButton.addEventListener("click", (e) => { + e.stopImmediatePropagation(); + e.preventDefault(); + e.stopPropagation(); + new FolderOverviewSettings(this.app, this, (0, import_obsidian33.parseYaml)(source), ctx, el).open(); + }, { capture: true }); + } + }); + observer.observe(el, { + childList: true, + subtree: true + }); + try { + const folderOverview = new FolderOverview(this, ctx, source, el); + folderOverview.create(this, (0, import_obsidian33.parseYaml)(source), el, ctx); + } catch (e) { + new import_obsidian33.Notice("Error creating folder overview (folder notes plugin) - check console for more details"); + console.error(e); + } + } + isEmptyFolderNoteFolder(folder) { + var _a; + let attachmentFolderPath = this.app.vault.getConfig("attachmentFolderPath"); + const cleanAttachmentFolderPath = (attachmentFolderPath == null ? void 0 : attachmentFolderPath.replace("./", "")) || ""; + const attachmentsAreInRootFolder = attachmentFolderPath === "./" || attachmentFolderPath === ""; + const threshold = this.settings.storageLocation === "insideFolder" ? 1 : 0; + if (folder.children.length == threshold) { + return true; + } else if (folder.children.length > threshold) { + if (attachmentsAreInRootFolder) { + return false; + } else if (this.settings.ignoreAttachmentFolder && this.app.vault.getAbstractFileByPath(`${folder.path}/${cleanAttachmentFolderPath}`)) { + const folderPath = `${folder.path}/${cleanAttachmentFolderPath}`; + const attachmentFolder = this.app.vault.getAbstractFileByPath(folderPath); + if (attachmentFolder instanceof import_obsidian33.TFolder && folder.children.length <= threshold + 1) { + if (!folder.collapsed) { + (_a = getEl(folder.path)) == null ? void 0 : _a.click(); + } + } + return folder.children.length <= threshold + 1; + } else { + return false; + } + } + return true; + } + async changeName(folder, name, replacePath, waitForCreate = false, count = 0) { + if (!name) + name = folder.name; + let fileExplorerItem = getEl(folder.path); + if (!fileExplorerItem) { + if (waitForCreate && count < 5) { + await new Promise((r) => setTimeout(r, 500)); + this.changeName(folder, name, replacePath, waitForCreate, count + 1); + return; + } + return; + } + fileExplorerItem = fileExplorerItem.querySelector("div.nav-folder-title-content"); + if (!fileExplorerItem) { + return; + } + if (this.settings.frontMatterTitle.explorer && this.settings.frontMatterTitle.enabled) { + fileExplorerItem.innerText = name; + fileExplorerItem.setAttribute("old-name", folder.name); + } else { + fileExplorerItem.innerText = folder.name; + fileExplorerItem.removeAttribute("old-name"); + } + if (replacePath) { + this.updateBreadcrumbs(); + } + } + updateBreadcrumbs(remove) { + if (!this.settings.frontMatterTitle.path && !remove) { + return; + } + const viewHeaderItems = document.querySelectorAll("span.view-header-breadcrumb"); + const files = this.app.vault.getAllLoadedFiles().filter((file) => file instanceof import_obsidian33.TFolder); + viewHeaderItems.forEach((item) => { + if (!item.hasAttribute("data-path")) { + return; + } + const path = item.getAttribute("data-path"); + const folder = files.find((file) => file.path === path); + if (!(folder instanceof import_obsidian33.TFolder)) { + return; + } + if (remove) { + item.textContent = folder.name; + item.removeAttribute("old-name"); + } else { + item.textContent = folder.newName || folder.name; + item.setAttribute("old-name", folder.name); + item.setAttribute("data-path", folder.path); + } + }); + } + reloadHandlers() { + document.querySelectorAll("div.nav-folder-title-content").forEach((element) => { + if (element.onclick) + return; + element.onclick = (event) => handleFolderClick(event, this); + }); + } + onunload() { + console.log("unloading folder notes plugin"); + this.observer.disconnect(); + document.body.classList.remove("folder-notes-plugin"); + document.body.classList.remove("folder-note-underline"); + document.body.classList.remove("hide-folder-note"); + document.body.classList.remove("fn-whitespace-stop-collapsing"); + if (this.activeFolderDom) { + this.activeFolderDom.removeClass("is-active"); + } + if (this.fmtpHandler) { + this.fmtpHandler.deleteEvent(); + } + } + async loadSettings() { + const data = await this.loadData(); + if (data) { + if (data.allowWhitespaceCollapsing === true) { + data.stopWhitespaceCollapsing = false; + delete data.allowWhitespaceCollapsing; + } else if (data.allowWhitespaceCollapsing === false) { + data.stopWhitespaceCollapsing = true; + delete data.allowWhitespaceCollapsing; + } + } + this.settings = Object.assign({}, DEFAULT_SETTINGS, data); + if (!data) { + return; + } + const overview = data.defaultOverview; + if (!overview) { + return; + } + this.settings.defaultOverview = Object.assign({}, DEFAULT_SETTINGS.defaultOverview, overview); + } + async saveSettings(reloadStyles) { + await this.saveData(this.settings); + if (!this.settingsOpened || reloadStyles === true) { + loadFileClasses(true, this); + } + } +}; diff --git a/.obsidian/plugins/folder-notes/manifest.json b/.obsidian/plugins/folder-notes/manifest.json new file mode 100644 index 0000000..8dbeb6e --- /dev/null +++ b/.obsidian/plugins/folder-notes/manifest.json @@ -0,0 +1,12 @@ +{ + "id": "folder-notes", + "name": "Folder notes", + "version": "1.7.32", + "minAppVersion": "0.15.0", + "description": "Create notes within folders that can be accessed without collapsing the folder, similar to the functionality offered in Notion.", + "author": "Lost Paul", + "authorUrl": "https://github.com/LostPaul", + "fundingUrl": "https://ko-fi.com/paul305844", + "helpUrl": "https://lostpaul.github.io/obsidian-folder-notes/", + "isDesktopOnly": false +} diff --git a/.obsidian/plugins/folder-notes/styles.css b/.obsidian/plugins/folder-notes/styles.css new file mode 100644 index 0000000..d0d1d61 --- /dev/null +++ b/.obsidian/plugins/folder-notes/styles.css @@ -0,0 +1,273 @@ +.fn-whitespace-stop-collapsing .nav-folder-title-content { + flex-grow: 1 !important; + display: flex; + padding-bottom: 4px !important; + padding-top: 4px !important; +} + +.version-1-7-2.fn-whitespace-stop-collapsing .nav-files-container .collapse-icon { + padding-top: 4px !important; +} + +.mod-rtl .fn-whitespace-stop-collapsing .nav-folder-title-content { + padding-left: 8px !important; +} + +.fn-whitespace-stop-collapsing .nav-folder-title { + padding-bottom: 0 !important; + padding-top: 0 !important; +} + +body:not(.mod-rtl).fn-whitespace-stop-collapsing .nav-folder-title { + padding-right: 0 !important; +} + +.mod-rtl.fn-whitespace-stop-collapsing .nav-folder-title { + padding-left: 0 !important; +} + +.fn-whitespace-stop-collapsing .nav-folder-collapse-indicator { + margin-top: 4px !important; +} + +body:not(.is-grabbing) .tree-item-self.fn-is-active:hover, +body:not(.disable-folder-highlight) .tree-item-self.fn-is-active { + color: var(--nav-item-color-active); + background-color: var(--nav-item-background-active); + font-weight: var(--nav-item-weight-active); +} + +.has-folder-note .nav-folder-title-content:hover, +.has-folder-note.view-header-breadcrumb:hover { + cursor: pointer; +} + + +.hide-folder-note .is-folder-note { + display: none; +} + +.hide-folder .folder-name { + display: none; +} + +.nav-folder-collapse-indicator:hover { + cursor: pointer; +} + +.fn-excluded-folder-heading { + margin-top: 0 !important; + border-top: 1px solid var(--background-modifier-border); +} + +.add-exclude-folder-item { + padding-bottom: 0 !important; +} + +.fn-exclude-folder-list { + padding-bottom: 0 !important; +} + +.fn-exclude-folder-list.setting-item { + border-top: 0 !important; + border-bottom: 0 !important; +} + +.fn-exclude-folder-list .setting-item-control { + display: flex; + justify-content: flex-start !important; +} + +.fn-exclude-folder-list .setting-item-info { + display: none !important; +} + +.fn-exclude-folder-list .search-input-container { + width: 100%; +} + + +.fn-confirmation-modal { + padding-bottom: 0; +} + +:not(.is-phone) .fn-confirmation-modal-button { + margin-right: 0.7rem; + +} + +:not(.is-phone) .fn-delete-confirmation-modal-buttons { + display: flex; + align-items: center; + margin-top: 10px; +} + +.fn-delete-confirmation-modal-buttons span:hover, +.fn-delete-confirmation-modal-buttons input:hover { + cursor: pointer; +} + +:not(.is-phone) .fn-delete-confirmation-modal-buttons .fn-confirmation-modal-button { + margin-left: auto; +} + +:not(.is-phone) .fn-delete-confirmation-modal-buttons input[type="checkbox"] { + margin-right: 5px; +} + +.is-phone .fn-delete-confirmation-modal-buttons { + display: flex; + flex-direction: column; + align-items: center; +} + +.is-phone .fn-delete-confirmation-modal-buttons .fn-confirmation-modal-button { + margin-top: 10px; +} + +/* Folder overview */ + +.fn-folder-overview-collapse-icon { + display: block !important; +} + +.fn-has-no-files .collapse-icon { + display: none !important; +} + +.folder-overview-list { + margin-top: 0 !important; + margin-bottom: 0 !important; + padding-bottom: 1.200 !important; + padding-top: 1.200 !important; +} + +.folder-overview-list-item { + display: flex; +} + + +.folder-overview-list::marker { + color: var(--text-faint); +} + +.folder-list::marker { + color: var(--text-normal) !important; +} + +.folder-overview-grid { + display: grid; + grid-gap: 20px; + grid-template-columns: repeat(3, 1fr); +} + +.folder-overview-grid-item-article article { + padding: 15px; + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.folder-overview-grid-item-article a { + text-decoration: none !important; +} + +.folder-overview-grid-item-article h1 { + font-size: 1.2rem; +} + + +.folder-overview-grid-item { + flex: 1 1 auto; + margin-right: 1.200rem; + margin-bottom: 1.200rem; +} + +.fn-confirmation-modal .setting-item { + border-top: 0 !important; + padding-top: 0 !important; +} + +.pointer-cursor { + cursor: pointer !important; +} + + +/* Setting tab style */ +.fn-settings-tab-bar { + display: flex; + flex-direction: row; + padding-bottom: 1rem; +} + +.fn-settings-tab { + display: flex; + flex-direction: row; + align-items: center; + gap: var(--size-4-2); + padding: 10px; + border: 1px solid var(--background-modifier-border) +} + +.fn-settings-tab-active { + background-color: var(--color-accent); + color: var(--text-on-accent); +} + +.fn-settings-tab-name { + font-weight: bold; +} + +.fn-settings-tab-icon { + display: flex; +} + +/* File explorer & path styles */ + +.folder-note-underline .has-folder-note .nav-folder-title-content { + text-decoration-line: underline; + text-decoration-color: var(--text-faint); + text-decoration-thickness: 2px; + text-underline-offset: 1px; +} + +.folder-note-underline-path .has-folder-note.view-header-breadcrumb { + text-decoration-line: underline; + text-decoration-color: var(--text-faint); + text-decoration-thickness: 1px; + text-underline-offset: 2px; +} + +.folder-note-bold .has-folder-note .nav-folder-title-content, +.folder-note-bold-path .has-folder-note.view-header-breadcrumb { + font-weight: bold; +} + +.folder-note-cursive .has-folder-note .nav-folder-title-content, +.folder-note-cursive-path .has-folder-note.view-header-breadcrumb { + font-style: italic; +} + +.fn-hide-collapse-icon .has-folder-note.only-has-folder-note .tree-item-icon { + display: none; +} + +.fn-hide-empty-collapse-icon .fn-empty-folder .tree-item-icon { + display: none; +} + + +/* .fn-suggestion-container { + position: absolute; + overflow: hidden; + display: flex; + flex-direction: column; + background-color: var(--background-primary); + max-width: 500px; + max-height: 300px; + border-radius: var(--radius-m); + border: 1px solid var(--background-modifier-border); + box-shadow: var(--shadow-s); + z-index: var(--layer-notice); +} */ \ No newline at end of file diff --git a/.obsidian/plugins/table-editor-obsidian/data.json b/.obsidian/plugins/table-editor-obsidian/data.json new file mode 100644 index 0000000..9009465 --- /dev/null +++ b/.obsidian/plugins/table-editor-obsidian/data.json @@ -0,0 +1,6 @@ +{ + "formatType": "normal", + "showRibbonIcon": true, + "bindEnter": true, + "bindTab": true +} \ No newline at end of file diff --git a/.obsidian/plugins/table-editor-obsidian/main.js b/.obsidian/plugins/table-editor-obsidian/main.js new file mode 100644 index 0000000..8a03689 --- /dev/null +++ b/.obsidian/plugins/table-editor-obsidian/main.js @@ -0,0 +1,14109 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +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 __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +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); + +// node_modules/@tgrosinger/md-advanced-tables/lib/point.js +var require_point = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/point.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.Point = void 0; + var Point2 = class { + /** + * Creates a new `Point` object. + * + * @param row - Row of the point, starts from 0. + * @param column - Column of the point, starts from 0. + */ + constructor(row, column) { + this.row = row; + this.column = column; + } + /** + * Checks if the point is equal to another point. + */ + equals(point) { + return this.row === point.row && this.column === point.column; + } + }; + exports.Point = Point2; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/range.js +var require_range = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/range.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.Range = void 0; + var Range2 = class { + /** + * Creates a new `Range` object. + * + * @param start - The start point of the range. + * @param end - The end point of the range. + */ + constructor(start, end) { + this.start = start; + this.end = end; + } + }; + exports.Range = Range2; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/focus.js +var require_focus = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/focus.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.Focus = void 0; + var Focus = class _Focus { + /** + * Creates a new `Focus` object. + * + * @param row - Row of the focused cell. + * @param column - Column of the focused cell. + * @param offset - Raw offset in the cell. + */ + constructor(row, column, offset) { + this.row = row; + this.column = column; + this.offset = offset; + } + /** + * Checks if two focuses point the same cell. + * Offsets are ignored. + */ + posEquals(focus) { + return this.row === focus.row && this.column === focus.column; + } + /** + * Creates a copy of the focus object by setting its row to the specified value. + * + * @param row - Row of the focused cell. + * @returns A new focus object with the specified row. + */ + setRow(row) { + return new _Focus(row, this.column, this.offset); + } + /** + * Creates a copy of the focus object by setting its column to the specified value. + * + * @param column - Column of the focused cell. + * @returns A new focus object with the specified column. + */ + setColumn(column) { + return new _Focus(this.row, column, this.offset); + } + /** + * Creates a copy of the focus object by setting its offset to the specified value. + * + * @param offset - Offset in the focused cell. + * @returns A new focus object with the specified offset. + */ + setOffset(offset) { + return new _Focus(this.row, this.column, offset); + } + }; + exports.Focus = Focus; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/alignment.js +var require_alignment = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/alignment.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.HeaderAlignment = exports.DefaultAlignment = exports.Alignment = void 0; + var Alignment2; + (function(Alignment3) { + Alignment3["NONE"] = "none"; + Alignment3["LEFT"] = "left"; + Alignment3["RIGHT"] = "right"; + Alignment3["CENTER"] = "center"; + })(Alignment2 || (exports.Alignment = Alignment2 = {})); + var DefaultAlignment; + (function(DefaultAlignment2) { + DefaultAlignment2["LEFT"] = "left"; + DefaultAlignment2["RIGHT"] = "right"; + DefaultAlignment2["CENTER"] = "center"; + })(DefaultAlignment || (exports.DefaultAlignment = DefaultAlignment = {})); + var HeaderAlignment; + (function(HeaderAlignment2) { + HeaderAlignment2["FOLLOW"] = "follow"; + HeaderAlignment2["LEFT"] = "left"; + HeaderAlignment2["RIGHT"] = "right"; + HeaderAlignment2["CENTER"] = "center"; + })(HeaderAlignment || (exports.HeaderAlignment = HeaderAlignment = {})); + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/table-cell.js +var require_table_cell = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/table-cell.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.TableCell = void 0; + var alignment_1 = require_alignment(); + var TableCell = class { + /** + * Creates a new `TableCell` object. + * + * @param rawContent - Raw content of the cell. + */ + constructor(rawContent) { + this.rawContent = rawContent; + this.content = rawContent.trim(); + this.paddingLeft = this.content === "" ? this.rawContent === "" ? 0 : 1 : this.rawContent.length - this.rawContent.trimLeft().length; + this.paddingRight = this.rawContent.length - this.content.length - this.paddingLeft; + } + /** + * Convers the cell to a text representation. + * + * @returns The raw content of the cell. + */ + toText() { + return this.rawContent; + } + /** + * Checks if the cell is a delimiter i.e. it only contains hyphens `-` with optional one + * leading and trailing colons `:`. + * + * @returns `true` if the cell is a delimiter. + */ + isDelimiter() { + return /^\s*:?-+:?\s*$/.test(this.rawContent); + } + /** + * Returns the alignment the cell represents. + * + * @returns The alignment the cell represents; `undefined` if the cell is not a delimiter. + */ + getAlignment() { + if (!this.isDelimiter()) { + return void 0; + } + if (this.content[0] === ":") { + if (this.content[this.content.length - 1] === ":") { + return alignment_1.Alignment.CENTER; + } + return alignment_1.Alignment.LEFT; + } + if (this.content[this.content.length - 1] === ":") { + return alignment_1.Alignment.RIGHT; + } + return alignment_1.Alignment.NONE; + } + /** + * Computes a relative position in the trimmed content from that in the raw content. + * + * @param rawOffset - Relative position in the raw content. + * @returns - Relative position in the trimmed content. + */ + computeContentOffset(rawOffset) { + if (this.content === "") { + return 0; + } + if (rawOffset < this.paddingLeft) { + return 0; + } + if (rawOffset < this.paddingLeft + this.content.length) { + return rawOffset - this.paddingLeft; + } + return this.content.length; + } + /** + * Computes a relative position in the raw content from that in the trimmed content. + * + * @param contentOffset - Relative position in the trimmed content. + * @returns - Relative position in the raw content. + */ + computeRawOffset(contentOffset) { + return contentOffset + this.paddingLeft; + } + }; + exports.TableCell = TableCell; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/table-row.js +var require_table_row = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/table-row.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.TableRow = void 0; + var table_cell_1 = require_table_cell(); + var TableRow = class _TableRow { + /** + * Creates a new `TableRow` objec. + * + * @param cells - Cells that the row contains. + * @param marginLeft - Margin string at the left of the row. + * @param marginRight - Margin string at the right of the row. + */ + constructor(cells, marginLeft, marginRight) { + this._cells = cells.slice(); + this.marginLeft = marginLeft; + this.marginRight = marginRight; + } + /** + * Gets the number of the cells in the row. + */ + getWidth() { + return this._cells.length; + } + /** + * Returns the cells that the row contains. + */ + getCells() { + return this._cells.slice(); + } + /** + * Gets a cell at the specified index. + * + * @param index - Index. + * @returns The cell at the specified index if exists; `undefined` if no cell is found. + */ + getCellAt(index) { + return this._cells[index]; + } + /** + * Sets a cell in the row to a new value, returning a copy of the row + * with the modified value. + * + * If an invalid index is provided, the row will be unchanged. + */ + setCellAt(index, value) { + const cells = this.getCells(); + cells[index] = new table_cell_1.TableCell(value); + return new _TableRow(cells, this.marginLeft, this.marginRight); + } + /** + * Convers the row to a text representation. + */ + toText() { + if (this._cells.length === 0) { + return this.marginLeft; + } + const cells = this._cells.map((cell) => cell.toText()).join("|"); + return `${this.marginLeft}|${cells}|${this.marginRight}`; + } + /** + * Checks if the row is a delimiter or not. + * + * @returns `true` if the row is a delimiter i.e. all the cells contained are delimiters. + */ + isDelimiter() { + return this._cells.every((cell) => cell.isDelimiter()); + } + }; + exports.TableRow = TableRow; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/neverthrow/neverthrow.js +var require_neverthrow = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/neverthrow/neverthrow.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.Err = exports.Ok = exports.err = exports.ok = void 0; + var ok = (value) => new Ok(value); + exports.ok = ok; + var err = (err2) => new Err(err2); + exports.err = err; + var Ok = class { + constructor(value) { + this.value = value; + this.match = (ok2, _err) => ok2(this.value); + } + isOk() { + return true; + } + isErr() { + return !this.isOk(); + } + map(f) { + return (0, exports.ok)(f(this.value)); + } + mapErr(_f) { + return (0, exports.ok)(this.value); + } + // add info on how this is really useful for converting a + // Result, E1> + // into a Result + andThen(f) { + return f(this.value); + } + unwrapOr(_v) { + return this.value; + } + _unsafeUnwrap() { + return this.value; + } + _unsafeUnwrapErr() { + throw new Error("Called `_unsafeUnwrapErr` on an Ok"); + } + }; + exports.Ok = Ok; + var Err = class { + constructor(error) { + this.error = error; + this.match = (_ok, err2) => err2(this.error); + } + isOk() { + return false; + } + isErr() { + return !this.isOk(); + } + map(_f) { + return (0, exports.err)(this.error); + } + mapErr(f) { + return (0, exports.err)(f(this.error)); + } + andThen(_f) { + return (0, exports.err)(this.error); + } + unwrapOr(v) { + return v; + } + _unsafeUnwrap() { + throw new Error("Called `_unsafeUnwrap` on an Err"); + } + _unsafeUnwrapErr() { + return this.error; + } + }; + exports.Err = Err; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/calc/ast_utils.js +var require_ast_utils = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/calc/ast_utils.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.prettyPrintAST = exports.checkChildLength = exports.checkType = exports.errRelativeReferenceIndex = exports.errIndex0 = void 0; + exports.errIndex0 = new Error("Index 0 used to create a reference"); + exports.errRelativeReferenceIndex = new Error("Can not use relative reference where absolute reference is required"); + var checkType = (ast, ...expectedTypes) => { + if (expectedTypes.indexOf(ast.type) >= 0) { + return; + } + return new Error(`Formula element '${ast.text}' is a ${ast.type} but expected one of ${expectedTypes} in this position.`); + }; + exports.checkType = checkType; + var checkChildLength = (ast, len) => { + if (ast.children.length === len) { + return; + } + return new Error(`Formula element '${ast.text}' was expected to have ${len} elements, but had ${ast.children.length}`); + }; + exports.checkChildLength = checkChildLength; + var prettyPrintAST = (token, level = 0) => { + console.log(" ".repeat(level) + `|-${token.type}${token.children.length === 0 ? "=" + token.text : ""}`); + if (token.children) { + token.children.forEach((c) => { + (0, exports.prettyPrintAST)(c, level + 1); + }); + } + }; + exports.prettyPrintAST = prettyPrintAST; + } +}); + +// node_modules/decimal.js/decimal.js +var require_decimal = __commonJS({ + "node_modules/decimal.js/decimal.js"(exports, module2) { + (function(globalScope) { + "use strict"; + var EXP_LIMIT = 9e15, MAX_DIGITS = 1e9, NUMERALS = "0123456789abcdef", LN10 = "2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058", PI = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789", DEFAULTS = { + // These values must be integers within the stated ranges (inclusive). + // Most of these values can be changed at run-time using the `Decimal.config` method. + // The maximum number of significant digits of the result of a calculation or base conversion. + // E.g. `Decimal.config({ precision: 20 });` + precision: 20, + // 1 to MAX_DIGITS + // The rounding mode used when rounding to `precision`. + // + // ROUND_UP 0 Away from zero. + // ROUND_DOWN 1 Towards zero. + // ROUND_CEIL 2 Towards +Infinity. + // ROUND_FLOOR 3 Towards -Infinity. + // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up. + // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. + // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. + // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. + // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. + // + // E.g. + // `Decimal.rounding = 4;` + // `Decimal.rounding = Decimal.ROUND_HALF_UP;` + rounding: 4, + // 0 to 8 + // The modulo mode used when calculating the modulus: a mod n. + // The quotient (q = a / n) is calculated according to the corresponding rounding mode. + // The remainder (r) is calculated as: r = a - n * q. + // + // UP 0 The remainder is positive if the dividend is negative, else is negative. + // DOWN 1 The remainder has the same sign as the dividend (JavaScript %). + // FLOOR 3 The remainder has the same sign as the divisor (Python %). + // HALF_EVEN 6 The IEEE 754 remainder function. + // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive. + // + // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian + // division (9) are commonly used for the modulus operation. The other rounding modes can also + // be used, but they may not give useful results. + modulo: 1, + // 0 to 9 + // The exponent value at and beneath which `toString` returns exponential notation. + // JavaScript numbers: -7 + toExpNeg: -7, + // 0 to -EXP_LIMIT + // The exponent value at and above which `toString` returns exponential notation. + // JavaScript numbers: 21 + toExpPos: 21, + // 0 to EXP_LIMIT + // The minimum exponent value, beneath which underflow to zero occurs. + // JavaScript numbers: -324 (5e-324) + minE: -EXP_LIMIT, + // -1 to -EXP_LIMIT + // The maximum exponent value, above which overflow to Infinity occurs. + // JavaScript numbers: 308 (1.7976931348623157e+308) + maxE: EXP_LIMIT, + // 1 to EXP_LIMIT + // Whether to use cryptographically-secure random number generation, if available. + crypto: false + // true/false + }, Decimal, inexact, noConflict, quadrant, external = true, decimalError = "[DecimalError] ", invalidArgument = decimalError + "Invalid argument: ", precisionLimitExceeded = decimalError + "Precision limit exceeded", cryptoUnavailable = decimalError + "crypto unavailable", tag = "[object Decimal]", mathfloor = Math.floor, mathpow = Math.pow, isBinary = /^0b([01]+(\.[01]*)?|\.[01]+)(p[+-]?\d+)?$/i, isHex = /^0x([0-9a-f]+(\.[0-9a-f]*)?|\.[0-9a-f]+)(p[+-]?\d+)?$/i, isOctal = /^0o([0-7]+(\.[0-7]*)?|\.[0-7]+)(p[+-]?\d+)?$/i, isDecimal = /^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, BASE = 1e7, LOG_BASE = 7, MAX_SAFE_INTEGER = 9007199254740991, LN10_PRECISION = LN10.length - 1, PI_PRECISION = PI.length - 1, P = { toStringTag: tag }; + P.absoluteValue = P.abs = function() { + var x = new this.constructor(this); + if (x.s < 0) x.s = 1; + return finalise(x); + }; + P.ceil = function() { + return finalise(new this.constructor(this), this.e + 1, 2); + }; + P.clampedTo = P.clamp = function(min2, max2) { + var k, x = this, Ctor = x.constructor; + min2 = new Ctor(min2); + max2 = new Ctor(max2); + if (!min2.s || !max2.s) return new Ctor(NaN); + if (min2.gt(max2)) throw Error(invalidArgument + max2); + k = x.cmp(min2); + return k < 0 ? min2 : x.cmp(max2) > 0 ? max2 : new Ctor(x); + }; + P.comparedTo = P.cmp = function(y) { + var i, j, xdL, ydL, x = this, xd = x.d, yd = (y = new x.constructor(y)).d, xs = x.s, ys = y.s; + if (!xd || !yd) { + return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1; + } + if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0; + if (xs !== ys) return xs; + if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1; + xdL = xd.length; + ydL = yd.length; + for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) { + if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1; + } + return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1; + }; + P.cosine = P.cos = function() { + var pr, rm, x = this, Ctor = x.constructor; + if (!x.d) return new Ctor(NaN); + if (!x.d[0]) return new Ctor(1); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE; + Ctor.rounding = 1; + x = cosine(Ctor, toLessThanHalfPi(Ctor, x)); + Ctor.precision = pr; + Ctor.rounding = rm; + return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true); + }; + P.cubeRoot = P.cbrt = function() { + var e, m, n, r, rep, s, sd, t, t3, t3plusx, x = this, Ctor = x.constructor; + if (!x.isFinite() || x.isZero()) return new Ctor(x); + external = false; + s = x.s * mathpow(x.s * x, 1 / 3); + if (!s || Math.abs(s) == 1 / 0) { + n = digitsToString(x.d); + e = x.e; + if (s = (e - n.length + 1) % 3) n += s == 1 || s == -2 ? "0" : "00"; + s = mathpow(n, 1 / 3); + e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2)); + if (s == 1 / 0) { + n = "5e" + e; + } else { + n = s.toExponential(); + n = n.slice(0, n.indexOf("e") + 1) + e; + } + r = new Ctor(n); + r.s = x.s; + } else { + r = new Ctor(s.toString()); + } + sd = (e = Ctor.precision) + 3; + for (; ; ) { + t = r; + t3 = t.times(t).times(t); + t3plusx = t3.plus(x); + r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1); + if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) { + n = n.slice(sd - 3, sd + 1); + if (n == "9999" || !rep && n == "4999") { + if (!rep) { + finalise(t, e + 1, 0); + if (t.times(t).times(t).eq(x)) { + r = t; + break; + } + } + sd += 4; + rep = 1; + } else { + if (!+n || !+n.slice(1) && n.charAt(0) == "5") { + finalise(r, e + 1, 1); + m = !r.times(r).times(r).eq(x); + } + break; + } + } + } + external = true; + return finalise(r, e, Ctor.rounding, m); + }; + P.decimalPlaces = P.dp = function() { + var w, d = this.d, n = NaN; + if (d) { + w = d.length - 1; + n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE; + w = d[w]; + if (w) for (; w % 10 == 0; w /= 10) n--; + if (n < 0) n = 0; + } + return n; + }; + P.dividedBy = P.div = function(y) { + return divide(this, new this.constructor(y)); + }; + P.dividedToIntegerBy = P.divToInt = function(y) { + var x = this, Ctor = x.constructor; + return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding); + }; + P.equals = P.eq = function(y) { + return this.cmp(y) === 0; + }; + P.floor = function() { + return finalise(new this.constructor(this), this.e + 1, 3); + }; + P.greaterThan = P.gt = function(y) { + return this.cmp(y) > 0; + }; + P.greaterThanOrEqualTo = P.gte = function(y) { + var k = this.cmp(y); + return k == 1 || k === 0; + }; + P.hyperbolicCosine = P.cosh = function() { + var k, n, pr, rm, len, x = this, Ctor = x.constructor, one = new Ctor(1); + if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN); + if (x.isZero()) return one; + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + 4; + Ctor.rounding = 1; + len = x.d.length; + if (len < 32) { + k = Math.ceil(len / 3); + n = (1 / tinyPow(4, k)).toString(); + } else { + k = 16; + n = "2.3283064365386962890625e-10"; + } + x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true); + var cosh2_x, i = k, d8 = new Ctor(8); + for (; i--; ) { + cosh2_x = x.times(x); + x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8)))); + } + return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true); + }; + P.hyperbolicSine = P.sinh = function() { + var k, pr, rm, len, x = this, Ctor = x.constructor; + if (!x.isFinite() || x.isZero()) return new Ctor(x); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + 4; + Ctor.rounding = 1; + len = x.d.length; + if (len < 3) { + x = taylorSeries(Ctor, 2, x, x, true); + } else { + k = 1.4 * Math.sqrt(len); + k = k > 16 ? 16 : k | 0; + x = x.times(1 / tinyPow(5, k)); + x = taylorSeries(Ctor, 2, x, x, true); + var sinh2_x, d5 = new Ctor(5), d16 = new Ctor(16), d20 = new Ctor(20); + for (; k--; ) { + sinh2_x = x.times(x); + x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20)))); + } + } + Ctor.precision = pr; + Ctor.rounding = rm; + return finalise(x, pr, rm, true); + }; + P.hyperbolicTangent = P.tanh = function() { + var pr, rm, x = this, Ctor = x.constructor; + if (!x.isFinite()) return new Ctor(x.s); + if (x.isZero()) return new Ctor(x); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 7; + Ctor.rounding = 1; + return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm); + }; + P.inverseCosine = P.acos = function() { + var halfPi, x = this, Ctor = x.constructor, k = x.abs().cmp(1), pr = Ctor.precision, rm = Ctor.rounding; + if (k !== -1) { + return k === 0 ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0) : new Ctor(NaN); + } + if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5); + Ctor.precision = pr + 6; + Ctor.rounding = 1; + x = x.asin(); + halfPi = getPi(Ctor, pr + 4, rm).times(0.5); + Ctor.precision = pr; + Ctor.rounding = rm; + return halfPi.minus(x); + }; + P.inverseHyperbolicCosine = P.acosh = function() { + var pr, rm, x = this, Ctor = x.constructor; + if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN); + if (!x.isFinite()) return new Ctor(x); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4; + Ctor.rounding = 1; + external = false; + x = x.times(x).minus(1).sqrt().plus(x); + external = true; + Ctor.precision = pr; + Ctor.rounding = rm; + return x.ln(); + }; + P.inverseHyperbolicSine = P.asinh = function() { + var pr, rm, x = this, Ctor = x.constructor; + if (!x.isFinite() || x.isZero()) return new Ctor(x); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6; + Ctor.rounding = 1; + external = false; + x = x.times(x).plus(1).sqrt().plus(x); + external = true; + Ctor.precision = pr; + Ctor.rounding = rm; + return x.ln(); + }; + P.inverseHyperbolicTangent = P.atanh = function() { + var pr, rm, wpr, xsd, x = this, Ctor = x.constructor; + if (!x.isFinite()) return new Ctor(NaN); + if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN); + pr = Ctor.precision; + rm = Ctor.rounding; + xsd = x.sd(); + if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true); + Ctor.precision = wpr = xsd - x.e; + x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1); + Ctor.precision = pr + 4; + Ctor.rounding = 1; + x = x.ln(); + Ctor.precision = pr; + Ctor.rounding = rm; + return x.times(0.5); + }; + P.inverseSine = P.asin = function() { + var halfPi, k, pr, rm, x = this, Ctor = x.constructor; + if (x.isZero()) return new Ctor(x); + k = x.abs().cmp(1); + pr = Ctor.precision; + rm = Ctor.rounding; + if (k !== -1) { + if (k === 0) { + halfPi = getPi(Ctor, pr + 4, rm).times(0.5); + halfPi.s = x.s; + return halfPi; + } + return new Ctor(NaN); + } + Ctor.precision = pr + 6; + Ctor.rounding = 1; + x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan(); + Ctor.precision = pr; + Ctor.rounding = rm; + return x.times(2); + }; + P.inverseTangent = P.atan = function() { + var i, j, k, n, px, t, r, wpr, x2, x = this, Ctor = x.constructor, pr = Ctor.precision, rm = Ctor.rounding; + if (!x.isFinite()) { + if (!x.s) return new Ctor(NaN); + if (pr + 4 <= PI_PRECISION) { + r = getPi(Ctor, pr + 4, rm).times(0.5); + r.s = x.s; + return r; + } + } else if (x.isZero()) { + return new Ctor(x); + } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) { + r = getPi(Ctor, pr + 4, rm).times(0.25); + r.s = x.s; + return r; + } + Ctor.precision = wpr = pr + 10; + Ctor.rounding = 1; + k = Math.min(28, wpr / LOG_BASE + 2 | 0); + for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1)); + external = false; + j = Math.ceil(wpr / LOG_BASE); + n = 1; + x2 = x.times(x); + r = new Ctor(x); + px = x; + for (; i !== -1; ) { + px = px.times(x2); + t = r.minus(px.div(n += 2)); + px = px.times(x2); + r = t.plus(px.div(n += 2)); + if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--; ) ; + } + if (k) r = r.times(2 << k - 1); + external = true; + return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true); + }; + P.isFinite = function() { + return !!this.d; + }; + P.isInteger = P.isInt = function() { + return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2; + }; + P.isNaN = function() { + return !this.s; + }; + P.isNegative = P.isNeg = function() { + return this.s < 0; + }; + P.isPositive = P.isPos = function() { + return this.s > 0; + }; + P.isZero = function() { + return !!this.d && this.d[0] === 0; + }; + P.lessThan = P.lt = function(y) { + return this.cmp(y) < 0; + }; + P.lessThanOrEqualTo = P.lte = function(y) { + return this.cmp(y) < 1; + }; + P.logarithm = P.log = function(base) { + var isBase10, d, denominator, k, inf, num, sd, r, arg = this, Ctor = arg.constructor, pr = Ctor.precision, rm = Ctor.rounding, guard = 5; + if (base == null) { + base = new Ctor(10); + isBase10 = true; + } else { + base = new Ctor(base); + d = base.d; + if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN); + isBase10 = base.eq(10); + } + d = arg.d; + if (arg.s < 0 || !d || !d[0] || arg.eq(1)) { + return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0); + } + if (isBase10) { + if (d.length > 1) { + inf = true; + } else { + for (k = d[0]; k % 10 === 0; ) k /= 10; + inf = k !== 1; + } + } + external = false; + sd = pr + guard; + num = naturalLogarithm(arg, sd); + denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd); + r = divide(num, denominator, sd, 1); + if (checkRoundingDigits(r.d, k = pr, rm)) { + do { + sd += 10; + num = naturalLogarithm(arg, sd); + denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd); + r = divide(num, denominator, sd, 1); + if (!inf) { + if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) { + r = finalise(r, pr + 1, 0); + } + break; + } + } while (checkRoundingDigits(r.d, k += 10, rm)); + } + external = true; + return finalise(r, pr, rm); + }; + P.minus = P.sub = function(y) { + var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd, x = this, Ctor = x.constructor; + y = new Ctor(y); + if (!x.d || !y.d) { + if (!x.s || !y.s) y = new Ctor(NaN); + else if (x.d) y.s = -y.s; + else y = new Ctor(y.d || x.s !== y.s ? x : NaN); + return y; + } + if (x.s != y.s) { + y.s = -y.s; + return x.plus(y); + } + xd = x.d; + yd = y.d; + pr = Ctor.precision; + rm = Ctor.rounding; + if (!xd[0] || !yd[0]) { + if (yd[0]) y.s = -y.s; + else if (xd[0]) y = new Ctor(x); + else return new Ctor(rm === 3 ? -0 : 0); + return external ? finalise(y, pr, rm) : y; + } + e = mathfloor(y.e / LOG_BASE); + xe = mathfloor(x.e / LOG_BASE); + xd = xd.slice(); + k = xe - e; + if (k) { + xLTy = k < 0; + if (xLTy) { + d = xd; + k = -k; + len = yd.length; + } else { + d = yd; + e = xe; + len = xd.length; + } + i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2; + if (k > i) { + k = i; + d.length = 1; + } + d.reverse(); + for (i = k; i--; ) d.push(0); + d.reverse(); + } else { + i = xd.length; + len = yd.length; + xLTy = i < len; + if (xLTy) len = i; + for (i = 0; i < len; i++) { + if (xd[i] != yd[i]) { + xLTy = xd[i] < yd[i]; + break; + } + } + k = 0; + } + if (xLTy) { + d = xd; + xd = yd; + yd = d; + y.s = -y.s; + } + len = xd.length; + for (i = yd.length - len; i > 0; --i) xd[len++] = 0; + for (i = yd.length; i > k; ) { + if (xd[--i] < yd[i]) { + for (j = i; j && xd[--j] === 0; ) xd[j] = BASE - 1; + --xd[j]; + xd[i] += BASE; + } + xd[i] -= yd[i]; + } + for (; xd[--len] === 0; ) xd.pop(); + for (; xd[0] === 0; xd.shift()) --e; + if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0); + y.d = xd; + y.e = getBase10Exponent(xd, e); + return external ? finalise(y, pr, rm) : y; + }; + P.modulo = P.mod = function(y) { + var q, x = this, Ctor = x.constructor; + y = new Ctor(y); + if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN); + if (!y.d || x.d && !x.d[0]) { + return finalise(new Ctor(x), Ctor.precision, Ctor.rounding); + } + external = false; + if (Ctor.modulo == 9) { + q = divide(x, y.abs(), 0, 3, 1); + q.s *= y.s; + } else { + q = divide(x, y, 0, Ctor.modulo, 1); + } + q = q.times(y); + external = true; + return x.minus(q); + }; + P.naturalExponential = P.exp = function() { + return naturalExponential(this); + }; + P.naturalLogarithm = P.ln = function() { + return naturalLogarithm(this); + }; + P.negated = P.neg = function() { + var x = new this.constructor(this); + x.s = -x.s; + return finalise(x); + }; + P.plus = P.add = function(y) { + var carry, d, e, i, k, len, pr, rm, xd, yd, x = this, Ctor = x.constructor; + y = new Ctor(y); + if (!x.d || !y.d) { + if (!x.s || !y.s) y = new Ctor(NaN); + else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN); + return y; + } + if (x.s != y.s) { + y.s = -y.s; + return x.minus(y); + } + xd = x.d; + yd = y.d; + pr = Ctor.precision; + rm = Ctor.rounding; + if (!xd[0] || !yd[0]) { + if (!yd[0]) y = new Ctor(x); + return external ? finalise(y, pr, rm) : y; + } + k = mathfloor(x.e / LOG_BASE); + e = mathfloor(y.e / LOG_BASE); + xd = xd.slice(); + i = k - e; + if (i) { + if (i < 0) { + d = xd; + i = -i; + len = yd.length; + } else { + d = yd; + e = k; + len = xd.length; + } + k = Math.ceil(pr / LOG_BASE); + len = k > len ? k + 1 : len + 1; + if (i > len) { + i = len; + d.length = 1; + } + d.reverse(); + for (; i--; ) d.push(0); + d.reverse(); + } + len = xd.length; + i = yd.length; + if (len - i < 0) { + i = len; + d = yd; + yd = xd; + xd = d; + } + for (carry = 0; i; ) { + carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0; + xd[i] %= BASE; + } + if (carry) { + xd.unshift(carry); + ++e; + } + for (len = xd.length; xd[--len] == 0; ) xd.pop(); + y.d = xd; + y.e = getBase10Exponent(xd, e); + return external ? finalise(y, pr, rm) : y; + }; + P.precision = P.sd = function(z) { + var k, x = this; + if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z); + if (x.d) { + k = getPrecision(x.d); + if (z && x.e + 1 > k) k = x.e + 1; + } else { + k = NaN; + } + return k; + }; + P.round = function() { + var x = this, Ctor = x.constructor; + return finalise(new Ctor(x), x.e + 1, Ctor.rounding); + }; + P.sine = P.sin = function() { + var pr, rm, x = this, Ctor = x.constructor; + if (!x.isFinite()) return new Ctor(NaN); + if (x.isZero()) return new Ctor(x); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE; + Ctor.rounding = 1; + x = sine(Ctor, toLessThanHalfPi(Ctor, x)); + Ctor.precision = pr; + Ctor.rounding = rm; + return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true); + }; + P.squareRoot = P.sqrt = function() { + var m, n, sd, r, rep, t, x = this, d = x.d, e = x.e, s = x.s, Ctor = x.constructor; + if (s !== 1 || !d || !d[0]) { + return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0); + } + external = false; + s = Math.sqrt(+x); + if (s == 0 || s == 1 / 0) { + n = digitsToString(d); + if ((n.length + e) % 2 == 0) n += "0"; + s = Math.sqrt(n); + e = mathfloor((e + 1) / 2) - (e < 0 || e % 2); + if (s == 1 / 0) { + n = "5e" + e; + } else { + n = s.toExponential(); + n = n.slice(0, n.indexOf("e") + 1) + e; + } + r = new Ctor(n); + } else { + r = new Ctor(s.toString()); + } + sd = (e = Ctor.precision) + 3; + for (; ; ) { + t = r; + r = t.plus(divide(x, t, sd + 2, 1)).times(0.5); + if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) { + n = n.slice(sd - 3, sd + 1); + if (n == "9999" || !rep && n == "4999") { + if (!rep) { + finalise(t, e + 1, 0); + if (t.times(t).eq(x)) { + r = t; + break; + } + } + sd += 4; + rep = 1; + } else { + if (!+n || !+n.slice(1) && n.charAt(0) == "5") { + finalise(r, e + 1, 1); + m = !r.times(r).eq(x); + } + break; + } + } + } + external = true; + return finalise(r, e, Ctor.rounding, m); + }; + P.tangent = P.tan = function() { + var pr, rm, x = this, Ctor = x.constructor; + if (!x.isFinite()) return new Ctor(NaN); + if (x.isZero()) return new Ctor(x); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 10; + Ctor.rounding = 1; + x = x.sin(); + x.s = 1; + x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0); + Ctor.precision = pr; + Ctor.rounding = rm; + return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true); + }; + P.times = P.mul = function(y) { + var carry, e, i, k, r, rL, t, xdL, ydL, x = this, Ctor = x.constructor, xd = x.d, yd = (y = new Ctor(y)).d; + y.s *= x.s; + if (!xd || !xd[0] || !yd || !yd[0]) { + return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd ? NaN : !xd || !yd ? y.s / 0 : y.s * 0); + } + e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE); + xdL = xd.length; + ydL = yd.length; + if (xdL < ydL) { + r = xd; + xd = yd; + yd = r; + rL = xdL; + xdL = ydL; + ydL = rL; + } + r = []; + rL = xdL + ydL; + for (i = rL; i--; ) r.push(0); + for (i = ydL; --i >= 0; ) { + carry = 0; + for (k = xdL + i; k > i; ) { + t = r[k] + yd[i] * xd[k - i - 1] + carry; + r[k--] = t % BASE | 0; + carry = t / BASE | 0; + } + r[k] = (r[k] + carry) % BASE | 0; + } + for (; !r[--rL]; ) r.pop(); + if (carry) ++e; + else r.shift(); + y.d = r; + y.e = getBase10Exponent(r, e); + return external ? finalise(y, Ctor.precision, Ctor.rounding) : y; + }; + P.toBinary = function(sd, rm) { + return toStringBinary(this, 2, sd, rm); + }; + P.toDecimalPlaces = P.toDP = function(dp, rm) { + var x = this, Ctor = x.constructor; + x = new Ctor(x); + if (dp === void 0) return x; + checkInt32(dp, 0, MAX_DIGITS); + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + return finalise(x, dp + x.e + 1, rm); + }; + P.toExponential = function(dp, rm) { + var str, x = this, Ctor = x.constructor; + if (dp === void 0) { + str = finiteToString(x, true); + } else { + checkInt32(dp, 0, MAX_DIGITS); + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + x = finalise(new Ctor(x), dp + 1, rm); + str = finiteToString(x, true, dp + 1); + } + return x.isNeg() && !x.isZero() ? "-" + str : str; + }; + P.toFixed = function(dp, rm) { + var str, y, x = this, Ctor = x.constructor; + if (dp === void 0) { + str = finiteToString(x); + } else { + checkInt32(dp, 0, MAX_DIGITS); + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + y = finalise(new Ctor(x), dp + x.e + 1, rm); + str = finiteToString(y, false, dp + y.e + 1); + } + return x.isNeg() && !x.isZero() ? "-" + str : str; + }; + P.toFraction = function(maxD) { + var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r, x = this, xd = x.d, Ctor = x.constructor; + if (!xd) return new Ctor(x); + n1 = d0 = new Ctor(1); + d1 = n0 = new Ctor(0); + d = new Ctor(d1); + e = d.e = getPrecision(xd) - x.e - 1; + k = e % LOG_BASE; + d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k); + if (maxD == null) { + maxD = e > 0 ? d : n1; + } else { + n = new Ctor(maxD); + if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n); + maxD = n.gt(d) ? e > 0 ? d : n1 : n; + } + external = false; + n = new Ctor(digitsToString(xd)); + pr = Ctor.precision; + Ctor.precision = e = xd.length * LOG_BASE * 2; + for (; ; ) { + q = divide(n, d, 0, 1, 1); + d2 = d0.plus(q.times(d1)); + if (d2.cmp(maxD) == 1) break; + d0 = d1; + d1 = d2; + d2 = n1; + n1 = n0.plus(q.times(d2)); + n0 = d2; + d2 = d; + d = n.minus(q.times(d2)); + n = d2; + } + d2 = divide(maxD.minus(d0), d1, 0, 1, 1); + n0 = n0.plus(d2.times(n1)); + d0 = d0.plus(d2.times(d1)); + n0.s = n1.s = x.s; + r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0]; + Ctor.precision = pr; + external = true; + return r; + }; + P.toHexadecimal = P.toHex = function(sd, rm) { + return toStringBinary(this, 16, sd, rm); + }; + P.toNearest = function(y, rm) { + var x = this, Ctor = x.constructor; + x = new Ctor(x); + if (y == null) { + if (!x.d) return x; + y = new Ctor(1); + rm = Ctor.rounding; + } else { + y = new Ctor(y); + if (rm === void 0) { + rm = Ctor.rounding; + } else { + checkInt32(rm, 0, 8); + } + if (!x.d) return y.s ? x : y; + if (!y.d) { + if (y.s) y.s = x.s; + return y; + } + } + if (y.d[0]) { + external = false; + x = divide(x, y, 0, rm, 1).times(y); + external = true; + finalise(x); + } else { + y.s = x.s; + x = y; + } + return x; + }; + P.toNumber = function() { + return +this; + }; + P.toOctal = function(sd, rm) { + return toStringBinary(this, 8, sd, rm); + }; + P.toPower = P.pow = function(y) { + var e, k, pr, r, rm, s, x = this, Ctor = x.constructor, yn = +(y = new Ctor(y)); + if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn)); + x = new Ctor(x); + if (x.eq(1)) return x; + pr = Ctor.precision; + rm = Ctor.rounding; + if (y.eq(1)) return finalise(x, pr, rm); + e = mathfloor(y.e / LOG_BASE); + if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) { + r = intPow(Ctor, x, k, pr); + return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm); + } + s = x.s; + if (s < 0) { + if (e < y.d.length - 1) return new Ctor(NaN); + if ((y.d[e] & 1) == 0) s = 1; + if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) { + x.s = s; + return x; + } + } + k = mathpow(+x, yn); + e = k == 0 || !isFinite(k) ? mathfloor(yn * (Math.log("0." + digitsToString(x.d)) / Math.LN10 + x.e + 1)) : new Ctor(k + "").e; + if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0); + external = false; + Ctor.rounding = x.s = 1; + k = Math.min(12, (e + "").length); + r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr); + if (r.d) { + r = finalise(r, pr + 5, 1); + if (checkRoundingDigits(r.d, pr, rm)) { + e = pr + 10; + r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1); + if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) { + r = finalise(r, pr + 1, 0); + } + } + } + r.s = s; + external = true; + Ctor.rounding = rm; + return finalise(r, pr, rm); + }; + P.toPrecision = function(sd, rm) { + var str, x = this, Ctor = x.constructor; + if (sd === void 0) { + str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + } else { + checkInt32(sd, 1, MAX_DIGITS); + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + x = finalise(new Ctor(x), sd, rm); + str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd); + } + return x.isNeg() && !x.isZero() ? "-" + str : str; + }; + P.toSignificantDigits = P.toSD = function(sd, rm) { + var x = this, Ctor = x.constructor; + if (sd === void 0) { + sd = Ctor.precision; + rm = Ctor.rounding; + } else { + checkInt32(sd, 1, MAX_DIGITS); + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + } + return finalise(new Ctor(x), sd, rm); + }; + P.toString = function() { + var x = this, Ctor = x.constructor, str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + return x.isNeg() && !x.isZero() ? "-" + str : str; + }; + P.truncated = P.trunc = function() { + return finalise(new this.constructor(this), this.e + 1, 1); + }; + P.valueOf = P.toJSON = function() { + var x = this, Ctor = x.constructor, str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + return x.isNeg() ? "-" + str : str; + }; + function digitsToString(d) { + var i, k, ws, indexOfLastWord = d.length - 1, str = "", w = d[0]; + if (indexOfLastWord > 0) { + str += w; + for (i = 1; i < indexOfLastWord; i++) { + ws = d[i] + ""; + k = LOG_BASE - ws.length; + if (k) str += getZeroString(k); + str += ws; + } + w = d[i]; + ws = w + ""; + k = LOG_BASE - ws.length; + if (k) str += getZeroString(k); + } else if (w === 0) { + return "0"; + } + for (; w % 10 === 0; ) w /= 10; + return str + w; + } + function checkInt32(i, min2, max2) { + if (i !== ~~i || i < min2 || i > max2) { + throw Error(invalidArgument + i); + } + } + function checkRoundingDigits(d, i, rm, repeating) { + var di, k, r, rd; + for (k = d[0]; k >= 10; k /= 10) --i; + if (--i < 0) { + i += LOG_BASE; + di = 0; + } else { + di = Math.ceil((i + 1) / LOG_BASE); + i %= LOG_BASE; + } + k = mathpow(10, LOG_BASE - i); + rd = d[di] % k | 0; + if (repeating == null) { + if (i < 3) { + if (i == 0) rd = rd / 100 | 0; + else if (i == 1) rd = rd / 10 | 0; + r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 5e4 || rd == 0; + } else { + r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) && (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 || (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0; + } + } else { + if (i < 4) { + if (i == 0) rd = rd / 1e3 | 0; + else if (i == 1) rd = rd / 100 | 0; + else if (i == 2) rd = rd / 10 | 0; + r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999; + } else { + r = ((repeating || rm < 4) && rd + 1 == k || !repeating && rm > 3 && rd + 1 == k / 2) && (d[di + 1] / k / 1e3 | 0) == mathpow(10, i - 3) - 1; + } + } + return r; + } + function convertBase(str, baseIn, baseOut) { + var j, arr = [0], arrL, i = 0, strL = str.length; + for (; i < strL; ) { + for (arrL = arr.length; arrL--; ) arr[arrL] *= baseIn; + arr[0] += NUMERALS.indexOf(str.charAt(i++)); + for (j = 0; j < arr.length; j++) { + if (arr[j] > baseOut - 1) { + if (arr[j + 1] === void 0) arr[j + 1] = 0; + arr[j + 1] += arr[j] / baseOut | 0; + arr[j] %= baseOut; + } + } + } + return arr.reverse(); + } + function cosine(Ctor, x) { + var k, len, y; + if (x.isZero()) return x; + len = x.d.length; + if (len < 32) { + k = Math.ceil(len / 3); + y = (1 / tinyPow(4, k)).toString(); + } else { + k = 16; + y = "2.3283064365386962890625e-10"; + } + Ctor.precision += k; + x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1)); + for (var i = k; i--; ) { + var cos2x = x.times(x); + x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1); + } + Ctor.precision -= k; + return x; + } + var divide = /* @__PURE__ */ function() { + function multiplyInteger(x, k, base) { + var temp, carry = 0, i = x.length; + for (x = x.slice(); i--; ) { + temp = x[i] * k + carry; + x[i] = temp % base | 0; + carry = temp / base | 0; + } + if (carry) x.unshift(carry); + return x; + } + function compare(a, b, aL, bL) { + var i, r; + if (aL != bL) { + r = aL > bL ? 1 : -1; + } else { + for (i = r = 0; i < aL; i++) { + if (a[i] != b[i]) { + r = a[i] > b[i] ? 1 : -1; + break; + } + } + } + return r; + } + function subtract(a, b, aL, base) { + var i = 0; + for (; aL--; ) { + a[aL] -= i; + i = a[aL] < b[aL] ? 1 : 0; + a[aL] = i * base + a[aL] - b[aL]; + } + for (; !a[0] && a.length > 1; ) a.shift(); + } + return function(x, y, pr, rm, dp, base) { + var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, yL, yz, Ctor = x.constructor, sign2 = x.s == y.s ? 1 : -1, xd = x.d, yd = y.d; + if (!xd || !xd[0] || !yd || !yd[0]) { + return new Ctor( + // Return NaN if either NaN, or both Infinity or 0. + !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN : ( + // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0. + xd && xd[0] == 0 || !yd ? sign2 * 0 : sign2 / 0 + ) + ); + } + if (base) { + logBase = 1; + e = x.e - y.e; + } else { + base = BASE; + logBase = LOG_BASE; + e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase); + } + yL = yd.length; + xL = xd.length; + q = new Ctor(sign2); + qd = q.d = []; + for (i = 0; yd[i] == (xd[i] || 0); i++) ; + if (yd[i] > (xd[i] || 0)) e--; + if (pr == null) { + sd = pr = Ctor.precision; + rm = Ctor.rounding; + } else if (dp) { + sd = pr + (x.e - y.e) + 1; + } else { + sd = pr; + } + if (sd < 0) { + qd.push(1); + more = true; + } else { + sd = sd / logBase + 2 | 0; + i = 0; + if (yL == 1) { + k = 0; + yd = yd[0]; + sd++; + for (; (i < xL || k) && sd--; i++) { + t = k * base + (xd[i] || 0); + qd[i] = t / yd | 0; + k = t % yd | 0; + } + more = k || i < xL; + } else { + k = base / (yd[0] + 1) | 0; + if (k > 1) { + yd = multiplyInteger(yd, k, base); + xd = multiplyInteger(xd, k, base); + yL = yd.length; + xL = xd.length; + } + xi = yL; + rem = xd.slice(0, yL); + remL = rem.length; + for (; remL < yL; ) rem[remL++] = 0; + yz = yd.slice(); + yz.unshift(0); + yd0 = yd[0]; + if (yd[1] >= base / 2) ++yd0; + do { + k = 0; + cmp = compare(yd, rem, yL, remL); + if (cmp < 0) { + rem0 = rem[0]; + if (yL != remL) rem0 = rem0 * base + (rem[1] || 0); + k = rem0 / yd0 | 0; + if (k > 1) { + if (k >= base) k = base - 1; + prod = multiplyInteger(yd, k, base); + prodL = prod.length; + remL = rem.length; + cmp = compare(prod, rem, prodL, remL); + if (cmp == 1) { + k--; + subtract(prod, yL < prodL ? yz : yd, prodL, base); + } + } else { + if (k == 0) cmp = k = 1; + prod = yd.slice(); + } + prodL = prod.length; + if (prodL < remL) prod.unshift(0); + subtract(rem, prod, remL, base); + if (cmp == -1) { + remL = rem.length; + cmp = compare(yd, rem, yL, remL); + if (cmp < 1) { + k++; + subtract(rem, yL < remL ? yz : yd, remL, base); + } + } + remL = rem.length; + } else if (cmp === 0) { + k++; + rem = [0]; + } + qd[i++] = k; + if (cmp && rem[0]) { + rem[remL++] = xd[xi] || 0; + } else { + rem = [xd[xi]]; + remL = 1; + } + } while ((xi++ < xL || rem[0] !== void 0) && sd--); + more = rem[0] !== void 0; + } + if (!qd[0]) qd.shift(); + } + if (logBase == 1) { + q.e = e; + inexact = more; + } else { + for (i = 1, k = qd[0]; k >= 10; k /= 10) i++; + q.e = i + e * logBase - 1; + finalise(q, dp ? pr + q.e + 1 : pr, rm, more); + } + return q; + }; + }(); + function finalise(x, sd, rm, isTruncated) { + var digits, i, j, k, rd, roundUp, w, xd, xdi, Ctor = x.constructor; + out: if (sd != null) { + xd = x.d; + if (!xd) return x; + for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++; + i = sd - digits; + if (i < 0) { + i += LOG_BASE; + j = sd; + w = xd[xdi = 0]; + rd = w / mathpow(10, digits - j - 1) % 10 | 0; + } else { + xdi = Math.ceil((i + 1) / LOG_BASE); + k = xd.length; + if (xdi >= k) { + if (isTruncated) { + for (; k++ <= xdi; ) xd.push(0); + w = rd = 0; + digits = 1; + i %= LOG_BASE; + j = i - LOG_BASE + 1; + } else { + break out; + } + } else { + w = k = xd[xdi]; + for (digits = 1; k >= 10; k /= 10) digits++; + i %= LOG_BASE; + j = i - LOG_BASE + digits; + rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0; + } + } + isTruncated = isTruncated || sd < 0 || xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1)); + roundUp = rm < 4 ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 && // Check whether the digit to the left of the rounding digit is odd. + (i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10 & 1 || rm == (x.s < 0 ? 8 : 7)); + if (sd < 1 || !xd[0]) { + xd.length = 0; + if (roundUp) { + sd -= x.e + 1; + xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE); + x.e = -sd || 0; + } else { + xd[0] = x.e = 0; + } + return x; + } + if (i == 0) { + xd.length = xdi; + k = 1; + xdi--; + } else { + xd.length = xdi + 1; + k = mathpow(10, LOG_BASE - i); + xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0; + } + if (roundUp) { + for (; ; ) { + if (xdi == 0) { + for (i = 1, j = xd[0]; j >= 10; j /= 10) i++; + j = xd[0] += k; + for (k = 1; j >= 10; j /= 10) k++; + if (i != k) { + x.e++; + if (xd[0] == BASE) xd[0] = 1; + } + break; + } else { + xd[xdi] += k; + if (xd[xdi] != BASE) break; + xd[xdi--] = 0; + k = 1; + } + } + } + for (i = xd.length; xd[--i] === 0; ) xd.pop(); + } + if (external) { + if (x.e > Ctor.maxE) { + x.d = null; + x.e = NaN; + } else if (x.e < Ctor.minE) { + x.e = 0; + x.d = [0]; + } + } + return x; + } + function finiteToString(x, isExp, sd) { + if (!x.isFinite()) return nonFiniteToString(x); + var k, e = x.e, str = digitsToString(x.d), len = str.length; + if (isExp) { + if (sd && (k = sd - len) > 0) { + str = str.charAt(0) + "." + str.slice(1) + getZeroString(k); + } else if (len > 1) { + str = str.charAt(0) + "." + str.slice(1); + } + str = str + (x.e < 0 ? "e" : "e+") + x.e; + } else if (e < 0) { + str = "0." + getZeroString(-e - 1) + str; + if (sd && (k = sd - len) > 0) str += getZeroString(k); + } else if (e >= len) { + str += getZeroString(e + 1 - len); + if (sd && (k = sd - e - 1) > 0) str = str + "." + getZeroString(k); + } else { + if ((k = e + 1) < len) str = str.slice(0, k) + "." + str.slice(k); + if (sd && (k = sd - len) > 0) { + if (e + 1 === len) str += "."; + str += getZeroString(k); + } + } + return str; + } + function getBase10Exponent(digits, e) { + var w = digits[0]; + for (e *= LOG_BASE; w >= 10; w /= 10) e++; + return e; + } + function getLn10(Ctor, sd, pr) { + if (sd > LN10_PRECISION) { + external = true; + if (pr) Ctor.precision = pr; + throw Error(precisionLimitExceeded); + } + return finalise(new Ctor(LN10), sd, 1, true); + } + function getPi(Ctor, sd, rm) { + if (sd > PI_PRECISION) throw Error(precisionLimitExceeded); + return finalise(new Ctor(PI), sd, rm, true); + } + function getPrecision(digits) { + var w = digits.length - 1, len = w * LOG_BASE + 1; + w = digits[w]; + if (w) { + for (; w % 10 == 0; w /= 10) len--; + for (w = digits[0]; w >= 10; w /= 10) len++; + } + return len; + } + function getZeroString(k) { + var zs = ""; + for (; k--; ) zs += "0"; + return zs; + } + function intPow(Ctor, x, n, pr) { + var isTruncated, r = new Ctor(1), k = Math.ceil(pr / LOG_BASE + 4); + external = false; + for (; ; ) { + if (n % 2) { + r = r.times(x); + if (truncate(r.d, k)) isTruncated = true; + } + n = mathfloor(n / 2); + if (n === 0) { + n = r.d.length - 1; + if (isTruncated && r.d[n] === 0) ++r.d[n]; + break; + } + x = x.times(x); + truncate(x.d, k); + } + external = true; + return r; + } + function isOdd(n) { + return n.d[n.d.length - 1] & 1; + } + function maxOrMin(Ctor, args, ltgt) { + var y, x = new Ctor(args[0]), i = 0; + for (; ++i < args.length; ) { + y = new Ctor(args[i]); + if (!y.s) { + x = y; + break; + } else if (x[ltgt](y)) { + x = y; + } + } + return x; + } + function naturalExponential(x, sd) { + var denominator, guard, j, pow2, sum2, t, wpr, rep = 0, i = 0, k = 0, Ctor = x.constructor, rm = Ctor.rounding, pr = Ctor.precision; + if (!x.d || !x.d[0] || x.e > 17) { + return new Ctor(x.d ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0 : x.s ? x.s < 0 ? 0 : x : 0 / 0); + } + if (sd == null) { + external = false; + wpr = pr; + } else { + wpr = sd; + } + t = new Ctor(0.03125); + while (x.e > -2) { + x = x.times(t); + k += 5; + } + guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0; + wpr += guard; + denominator = pow2 = sum2 = new Ctor(1); + Ctor.precision = wpr; + for (; ; ) { + pow2 = finalise(pow2.times(x), wpr, 1); + denominator = denominator.times(++i); + t = sum2.plus(divide(pow2, denominator, wpr, 1)); + if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum2.d).slice(0, wpr)) { + j = k; + while (j--) sum2 = finalise(sum2.times(sum2), wpr, 1); + if (sd == null) { + if (rep < 3 && checkRoundingDigits(sum2.d, wpr - guard, rm, rep)) { + Ctor.precision = wpr += 10; + denominator = pow2 = t = new Ctor(1); + i = 0; + rep++; + } else { + return finalise(sum2, Ctor.precision = pr, rm, external = true); + } + } else { + Ctor.precision = pr; + return sum2; + } + } + sum2 = t; + } + } + function naturalLogarithm(y, sd) { + var c, c0, denominator, e, numerator, rep, sum2, t, wpr, x1, x2, n = 1, guard = 10, x = y, xd = x.d, Ctor = x.constructor, rm = Ctor.rounding, pr = Ctor.precision; + if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) { + return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x); + } + if (sd == null) { + external = false; + wpr = pr; + } else { + wpr = sd; + } + Ctor.precision = wpr += guard; + c = digitsToString(xd); + c0 = c.charAt(0); + if (Math.abs(e = x.e) < 15e14) { + while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) { + x = x.times(y); + c = digitsToString(x.d); + c0 = c.charAt(0); + n++; + } + e = x.e; + if (c0 > 1) { + x = new Ctor("0." + c); + e++; + } else { + x = new Ctor(c0 + "." + c.slice(1)); + } + } else { + t = getLn10(Ctor, wpr + 2, pr).times(e + ""); + x = naturalLogarithm(new Ctor(c0 + "." + c.slice(1)), wpr - guard).plus(t); + Ctor.precision = pr; + return sd == null ? finalise(x, pr, rm, external = true) : x; + } + x1 = x; + sum2 = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1); + x2 = finalise(x.times(x), wpr, 1); + denominator = 3; + for (; ; ) { + numerator = finalise(numerator.times(x2), wpr, 1); + t = sum2.plus(divide(numerator, new Ctor(denominator), wpr, 1)); + if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum2.d).slice(0, wpr)) { + sum2 = sum2.times(2); + if (e !== 0) sum2 = sum2.plus(getLn10(Ctor, wpr + 2, pr).times(e + "")); + sum2 = divide(sum2, new Ctor(n), wpr, 1); + if (sd == null) { + if (checkRoundingDigits(sum2.d, wpr - guard, rm, rep)) { + Ctor.precision = wpr += guard; + t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1); + x2 = finalise(x.times(x), wpr, 1); + denominator = rep = 1; + } else { + return finalise(sum2, Ctor.precision = pr, rm, external = true); + } + } else { + Ctor.precision = pr; + return sum2; + } + } + sum2 = t; + denominator += 2; + } + } + function nonFiniteToString(x) { + return String(x.s * x.s / 0); + } + function parseDecimal(x, str) { + var e, i, len; + if ((e = str.indexOf(".")) > -1) str = str.replace(".", ""); + if ((i = str.search(/e/i)) > 0) { + if (e < 0) e = i; + e += +str.slice(i + 1); + str = str.substring(0, i); + } else if (e < 0) { + e = str.length; + } + for (i = 0; str.charCodeAt(i) === 48; i++) ; + for (len = str.length; str.charCodeAt(len - 1) === 48; --len) ; + str = str.slice(i, len); + if (str) { + len -= i; + x.e = e = e - i - 1; + x.d = []; + i = (e + 1) % LOG_BASE; + if (e < 0) i += LOG_BASE; + if (i < len) { + if (i) x.d.push(+str.slice(0, i)); + for (len -= LOG_BASE; i < len; ) x.d.push(+str.slice(i, i += LOG_BASE)); + str = str.slice(i); + i = LOG_BASE - str.length; + } else { + i -= len; + } + for (; i--; ) str += "0"; + x.d.push(+str); + if (external) { + if (x.e > x.constructor.maxE) { + x.d = null; + x.e = NaN; + } else if (x.e < x.constructor.minE) { + x.e = 0; + x.d = [0]; + } + } + } else { + x.e = 0; + x.d = [0]; + } + return x; + } + function parseOther(x, str) { + var base, Ctor, divisor, i, isFloat, len, p, xd, xe; + if (str.indexOf("_") > -1) { + str = str.replace(/(\d)_(?=\d)/g, "$1"); + if (isDecimal.test(str)) return parseDecimal(x, str); + } else if (str === "Infinity" || str === "NaN") { + if (!+str) x.s = NaN; + x.e = NaN; + x.d = null; + return x; + } + if (isHex.test(str)) { + base = 16; + str = str.toLowerCase(); + } else if (isBinary.test(str)) { + base = 2; + } else if (isOctal.test(str)) { + base = 8; + } else { + throw Error(invalidArgument + str); + } + i = str.search(/p/i); + if (i > 0) { + p = +str.slice(i + 1); + str = str.substring(2, i); + } else { + str = str.slice(2); + } + i = str.indexOf("."); + isFloat = i >= 0; + Ctor = x.constructor; + if (isFloat) { + str = str.replace(".", ""); + len = str.length; + i = len - i; + divisor = intPow(Ctor, new Ctor(base), i, i * 2); + } + xd = convertBase(str, base, BASE); + xe = xd.length - 1; + for (i = xe; xd[i] === 0; --i) xd.pop(); + if (i < 0) return new Ctor(x.s * 0); + x.e = getBase10Exponent(xd, xe); + x.d = xd; + external = false; + if (isFloat) x = divide(x, divisor, len * 4); + if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p)); + external = true; + return x; + } + function sine(Ctor, x) { + var k, len = x.d.length; + if (len < 3) { + return x.isZero() ? x : taylorSeries(Ctor, 2, x, x); + } + k = 1.4 * Math.sqrt(len); + k = k > 16 ? 16 : k | 0; + x = x.times(1 / tinyPow(5, k)); + x = taylorSeries(Ctor, 2, x, x); + var sin2_x, d5 = new Ctor(5), d16 = new Ctor(16), d20 = new Ctor(20); + for (; k--; ) { + sin2_x = x.times(x); + x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20)))); + } + return x; + } + function taylorSeries(Ctor, n, x, y, isHyperbolic) { + var j, t, u, x2, i = 1, pr = Ctor.precision, k = Math.ceil(pr / LOG_BASE); + external = false; + x2 = x.times(x); + u = new Ctor(y); + for (; ; ) { + t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1); + u = isHyperbolic ? y.plus(t) : y.minus(t); + y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1); + t = u.plus(y); + if (t.d[k] !== void 0) { + for (j = k; t.d[j] === u.d[j] && j--; ) ; + if (j == -1) break; + } + j = u; + u = y; + y = t; + t = j; + i++; + } + external = true; + t.d.length = k + 1; + return t; + } + function tinyPow(b, e) { + var n = b; + while (--e) n *= b; + return n; + } + function toLessThanHalfPi(Ctor, x) { + var t, isNeg = x.s < 0, pi = getPi(Ctor, Ctor.precision, 1), halfPi = pi.times(0.5); + x = x.abs(); + if (x.lte(halfPi)) { + quadrant = isNeg ? 4 : 1; + return x; + } + t = x.divToInt(pi); + if (t.isZero()) { + quadrant = isNeg ? 3 : 2; + } else { + x = x.minus(t.times(pi)); + if (x.lte(halfPi)) { + quadrant = isOdd(t) ? isNeg ? 2 : 3 : isNeg ? 4 : 1; + return x; + } + quadrant = isOdd(t) ? isNeg ? 1 : 4 : isNeg ? 3 : 2; + } + return x.minus(pi).abs(); + } + function toStringBinary(x, baseOut, sd, rm) { + var base, e, i, k, len, roundUp, str, xd, y, Ctor = x.constructor, isExp = sd !== void 0; + if (isExp) { + checkInt32(sd, 1, MAX_DIGITS); + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + } else { + sd = Ctor.precision; + rm = Ctor.rounding; + } + if (!x.isFinite()) { + str = nonFiniteToString(x); + } else { + str = finiteToString(x); + i = str.indexOf("."); + if (isExp) { + base = 2; + if (baseOut == 16) { + sd = sd * 4 - 3; + } else if (baseOut == 8) { + sd = sd * 3 - 2; + } + } else { + base = baseOut; + } + if (i >= 0) { + str = str.replace(".", ""); + y = new Ctor(1); + y.e = str.length - i; + y.d = convertBase(finiteToString(y), 10, base); + y.e = y.d.length; + } + xd = convertBase(str, 10, base); + e = len = xd.length; + for (; xd[--len] == 0; ) xd.pop(); + if (!xd[0]) { + str = isExp ? "0p+0" : "0"; + } else { + if (i < 0) { + e--; + } else { + x = new Ctor(x); + x.d = xd; + x.e = e; + x = divide(x, y, sd, rm, 0, base); + xd = x.d; + e = x.e; + roundUp = inexact; + } + i = xd[sd]; + k = base / 2; + roundUp = roundUp || xd[sd + 1] !== void 0; + roundUp = rm < 4 ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2)) : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 || rm === (x.s < 0 ? 8 : 7)); + xd.length = sd; + if (roundUp) { + for (; ++xd[--sd] > base - 1; ) { + xd[sd] = 0; + if (!sd) { + ++e; + xd.unshift(1); + } + } + } + for (len = xd.length; !xd[len - 1]; --len) ; + for (i = 0, str = ""; i < len; i++) str += NUMERALS.charAt(xd[i]); + if (isExp) { + if (len > 1) { + if (baseOut == 16 || baseOut == 8) { + i = baseOut == 16 ? 4 : 3; + for (--len; len % i; len++) str += "0"; + xd = convertBase(str, base, baseOut); + for (len = xd.length; !xd[len - 1]; --len) ; + for (i = 1, str = "1."; i < len; i++) str += NUMERALS.charAt(xd[i]); + } else { + str = str.charAt(0) + "." + str.slice(1); + } + } + str = str + (e < 0 ? "p" : "p+") + e; + } else if (e < 0) { + for (; ++e; ) str = "0" + str; + str = "0." + str; + } else { + if (++e > len) for (e -= len; e--; ) str += "0"; + else if (e < len) str = str.slice(0, e) + "." + str.slice(e); + } + } + str = (baseOut == 16 ? "0x" : baseOut == 2 ? "0b" : baseOut == 8 ? "0o" : "") + str; + } + return x.s < 0 ? "-" + str : str; + } + function truncate(arr, len) { + if (arr.length > len) { + arr.length = len; + return true; + } + } + function abs(x) { + return new this(x).abs(); + } + function acos(x) { + return new this(x).acos(); + } + function acosh(x) { + return new this(x).acosh(); + } + function add(x, y) { + return new this(x).plus(y); + } + function asin(x) { + return new this(x).asin(); + } + function asinh(x) { + return new this(x).asinh(); + } + function atan(x) { + return new this(x).atan(); + } + function atanh(x) { + return new this(x).atanh(); + } + function atan2(y, x) { + y = new this(y); + x = new this(x); + var r, pr = this.precision, rm = this.rounding, wpr = pr + 4; + if (!y.s || !x.s) { + r = new this(NaN); + } else if (!y.d && !x.d) { + r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75); + r.s = y.s; + } else if (!x.d || y.isZero()) { + r = x.s < 0 ? getPi(this, pr, rm) : new this(0); + r.s = y.s; + } else if (!y.d || x.isZero()) { + r = getPi(this, wpr, 1).times(0.5); + r.s = y.s; + } else if (x.s < 0) { + this.precision = wpr; + this.rounding = 1; + r = this.atan(divide(y, x, wpr, 1)); + x = getPi(this, wpr, 1); + this.precision = pr; + this.rounding = rm; + r = y.s < 0 ? r.minus(x) : r.plus(x); + } else { + r = this.atan(divide(y, x, wpr, 1)); + } + return r; + } + function cbrt(x) { + return new this(x).cbrt(); + } + function ceil(x) { + return finalise(x = new this(x), x.e + 1, 2); + } + function clamp(x, min2, max2) { + return new this(x).clamp(min2, max2); + } + function config(obj) { + if (!obj || typeof obj !== "object") throw Error(decimalError + "Object expected"); + var i, p, v, useDefaults = obj.defaults === true, ps = [ + "precision", + 1, + MAX_DIGITS, + "rounding", + 0, + 8, + "toExpNeg", + -EXP_LIMIT, + 0, + "toExpPos", + 0, + EXP_LIMIT, + "maxE", + 0, + EXP_LIMIT, + "minE", + -EXP_LIMIT, + 0, + "modulo", + 0, + 9 + ]; + for (i = 0; i < ps.length; i += 3) { + if (p = ps[i], useDefaults) this[p] = DEFAULTS[p]; + if ((v = obj[p]) !== void 0) { + if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v; + else throw Error(invalidArgument + p + ": " + v); + } + } + if (p = "crypto", useDefaults) this[p] = DEFAULTS[p]; + if ((v = obj[p]) !== void 0) { + if (v === true || v === false || v === 0 || v === 1) { + if (v) { + if (typeof crypto != "undefined" && crypto && (crypto.getRandomValues || crypto.randomBytes)) { + this[p] = true; + } else { + throw Error(cryptoUnavailable); + } + } else { + this[p] = false; + } + } else { + throw Error(invalidArgument + p + ": " + v); + } + } + return this; + } + function cos(x) { + return new this(x).cos(); + } + function cosh(x) { + return new this(x).cosh(); + } + function clone(obj) { + var i, p, ps; + function Decimal2(v) { + var e, i2, t, x = this; + if (!(x instanceof Decimal2)) return new Decimal2(v); + x.constructor = Decimal2; + if (isDecimalInstance(v)) { + x.s = v.s; + if (external) { + if (!v.d || v.e > Decimal2.maxE) { + x.e = NaN; + x.d = null; + } else if (v.e < Decimal2.minE) { + x.e = 0; + x.d = [0]; + } else { + x.e = v.e; + x.d = v.d.slice(); + } + } else { + x.e = v.e; + x.d = v.d ? v.d.slice() : v.d; + } + return; + } + t = typeof v; + if (t === "number") { + if (v === 0) { + x.s = 1 / v < 0 ? -1 : 1; + x.e = 0; + x.d = [0]; + return; + } + if (v < 0) { + v = -v; + x.s = -1; + } else { + x.s = 1; + } + if (v === ~~v && v < 1e7) { + for (e = 0, i2 = v; i2 >= 10; i2 /= 10) e++; + if (external) { + if (e > Decimal2.maxE) { + x.e = NaN; + x.d = null; + } else if (e < Decimal2.minE) { + x.e = 0; + x.d = [0]; + } else { + x.e = e; + x.d = [v]; + } + } else { + x.e = e; + x.d = [v]; + } + return; + } else if (v * 0 !== 0) { + if (!v) x.s = NaN; + x.e = NaN; + x.d = null; + return; + } + return parseDecimal(x, v.toString()); + } else if (t !== "string") { + throw Error(invalidArgument + v); + } + if ((i2 = v.charCodeAt(0)) === 45) { + v = v.slice(1); + x.s = -1; + } else { + if (i2 === 43) v = v.slice(1); + x.s = 1; + } + return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v); + } + Decimal2.prototype = P; + Decimal2.ROUND_UP = 0; + Decimal2.ROUND_DOWN = 1; + Decimal2.ROUND_CEIL = 2; + Decimal2.ROUND_FLOOR = 3; + Decimal2.ROUND_HALF_UP = 4; + Decimal2.ROUND_HALF_DOWN = 5; + Decimal2.ROUND_HALF_EVEN = 6; + Decimal2.ROUND_HALF_CEIL = 7; + Decimal2.ROUND_HALF_FLOOR = 8; + Decimal2.EUCLID = 9; + Decimal2.config = Decimal2.set = config; + Decimal2.clone = clone; + Decimal2.isDecimal = isDecimalInstance; + Decimal2.abs = abs; + Decimal2.acos = acos; + Decimal2.acosh = acosh; + Decimal2.add = add; + Decimal2.asin = asin; + Decimal2.asinh = asinh; + Decimal2.atan = atan; + Decimal2.atanh = atanh; + Decimal2.atan2 = atan2; + Decimal2.cbrt = cbrt; + Decimal2.ceil = ceil; + Decimal2.clamp = clamp; + Decimal2.cos = cos; + Decimal2.cosh = cosh; + Decimal2.div = div; + Decimal2.exp = exp; + Decimal2.floor = floor; + Decimal2.hypot = hypot; + Decimal2.ln = ln; + Decimal2.log = log; + Decimal2.log10 = log10; + Decimal2.log2 = log2; + Decimal2.max = max; + Decimal2.min = min; + Decimal2.mod = mod; + Decimal2.mul = mul; + Decimal2.pow = pow; + Decimal2.random = random; + Decimal2.round = round; + Decimal2.sign = sign; + Decimal2.sin = sin; + Decimal2.sinh = sinh; + Decimal2.sqrt = sqrt; + Decimal2.sub = sub; + Decimal2.sum = sum; + Decimal2.tan = tan; + Decimal2.tanh = tanh; + Decimal2.trunc = trunc; + if (obj === void 0) obj = {}; + if (obj) { + if (obj.defaults !== true) { + ps = ["precision", "rounding", "toExpNeg", "toExpPos", "maxE", "minE", "modulo", "crypto"]; + for (i = 0; i < ps.length; ) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p]; + } + } + Decimal2.config(obj); + return Decimal2; + } + function div(x, y) { + return new this(x).div(y); + } + function exp(x) { + return new this(x).exp(); + } + function floor(x) { + return finalise(x = new this(x), x.e + 1, 3); + } + function hypot() { + var i, n, t = new this(0); + external = false; + for (i = 0; i < arguments.length; ) { + n = new this(arguments[i++]); + if (!n.d) { + if (n.s) { + external = true; + return new this(1 / 0); + } + t = n; + } else if (t.d) { + t = t.plus(n.times(n)); + } + } + external = true; + return t.sqrt(); + } + function isDecimalInstance(obj) { + return obj instanceof Decimal || obj && obj.toStringTag === tag || false; + } + function ln(x) { + return new this(x).ln(); + } + function log(x, y) { + return new this(x).log(y); + } + function log2(x) { + return new this(x).log(2); + } + function log10(x) { + return new this(x).log(10); + } + function max() { + return maxOrMin(this, arguments, "lt"); + } + function min() { + return maxOrMin(this, arguments, "gt"); + } + function mod(x, y) { + return new this(x).mod(y); + } + function mul(x, y) { + return new this(x).mul(y); + } + function pow(x, y) { + return new this(x).pow(y); + } + function random(sd) { + var d, e, k, n, i = 0, r = new this(1), rd = []; + if (sd === void 0) sd = this.precision; + else checkInt32(sd, 1, MAX_DIGITS); + k = Math.ceil(sd / LOG_BASE); + if (!this.crypto) { + for (; i < k; ) rd[i++] = Math.random() * 1e7 | 0; + } else if (crypto.getRandomValues) { + d = crypto.getRandomValues(new Uint32Array(k)); + for (; i < k; ) { + n = d[i]; + if (n >= 429e7) { + d[i] = crypto.getRandomValues(new Uint32Array(1))[0]; + } else { + rd[i++] = n % 1e7; + } + } + } else if (crypto.randomBytes) { + d = crypto.randomBytes(k *= 4); + for (; i < k; ) { + n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 127) << 24); + if (n >= 214e7) { + crypto.randomBytes(4).copy(d, i); + } else { + rd.push(n % 1e7); + i += 4; + } + } + i = k / 4; + } else { + throw Error(cryptoUnavailable); + } + k = rd[--i]; + sd %= LOG_BASE; + if (k && sd) { + n = mathpow(10, LOG_BASE - sd); + rd[i] = (k / n | 0) * n; + } + for (; rd[i] === 0; i--) rd.pop(); + if (i < 0) { + e = 0; + rd = [0]; + } else { + e = -1; + for (; rd[0] === 0; e -= LOG_BASE) rd.shift(); + for (k = 1, n = rd[0]; n >= 10; n /= 10) k++; + if (k < LOG_BASE) e -= LOG_BASE - k; + } + r.e = e; + r.d = rd; + return r; + } + function round(x) { + return finalise(x = new this(x), x.e + 1, this.rounding); + } + function sign(x) { + x = new this(x); + return x.d ? x.d[0] ? x.s : 0 * x.s : x.s || NaN; + } + function sin(x) { + return new this(x).sin(); + } + function sinh(x) { + return new this(x).sinh(); + } + function sqrt(x) { + return new this(x).sqrt(); + } + function sub(x, y) { + return new this(x).sub(y); + } + function sum() { + var i = 0, args = arguments, x = new this(args[i]); + external = false; + for (; x.s && ++i < args.length; ) x = x.plus(args[i]); + external = true; + return finalise(x, this.precision, this.rounding); + } + function tan(x) { + return new this(x).tan(); + } + function tanh(x) { + return new this(x).tanh(); + } + function trunc(x) { + return finalise(x = new this(x), x.e + 1, 1); + } + Decimal = clone(DEFAULTS); + Decimal.prototype.constructor = Decimal; + Decimal["default"] = Decimal.Decimal = Decimal; + LN10 = new Decimal(LN10); + PI = new Decimal(PI); + if (typeof define == "function" && define.amd) { + define(function() { + return Decimal; + }); + } else if (typeof module2 != "undefined" && module2.exports) { + if (typeof Symbol == "function" && typeof Symbol.iterator == "symbol") { + P[Symbol["for"]("nodejs.util.inspect.custom")] = P.toString; + P[Symbol.toStringTag] = "Decimal"; + } + module2.exports = Decimal; + } else { + if (!globalScope) { + globalScope = typeof self != "undefined" && self && self.self == self ? self : window; + } + noConflict = globalScope.Decimal; + Decimal.noConflict = function() { + globalScope.Decimal = noConflict; + return Decimal; + }; + globalScope.Decimal = Decimal; + } + })(exports); + } +}); + +// node_modules/lodash/lodash.js +var require_lodash = __commonJS({ + "node_modules/lodash/lodash.js"(exports, module2) { + (function() { + var undefined2; + var VERSION = "4.17.21"; + var LARGE_ARRAY_SIZE = 200; + var CORE_ERROR_TEXT = "Unsupported core-js use. Try https://npms.io/search?q=ponyfill.", FUNC_ERROR_TEXT = "Expected a function", INVALID_TEMPL_VAR_ERROR_TEXT = "Invalid `variable` option passed into `_.template`"; + var HASH_UNDEFINED = "__lodash_hash_undefined__"; + var MAX_MEMOIZE_SIZE = 500; + var PLACEHOLDER = "__lodash_placeholder__"; + var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4; + var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; + var WRAP_BIND_FLAG = 1, WRAP_BIND_KEY_FLAG = 2, WRAP_CURRY_BOUND_FLAG = 4, WRAP_CURRY_FLAG = 8, WRAP_CURRY_RIGHT_FLAG = 16, WRAP_PARTIAL_FLAG = 32, WRAP_PARTIAL_RIGHT_FLAG = 64, WRAP_ARY_FLAG = 128, WRAP_REARG_FLAG = 256, WRAP_FLIP_FLAG = 512; + var DEFAULT_TRUNC_LENGTH = 30, DEFAULT_TRUNC_OMISSION = "..."; + var HOT_COUNT = 800, HOT_SPAN = 16; + var LAZY_FILTER_FLAG = 1, LAZY_MAP_FLAG = 2, LAZY_WHILE_FLAG = 3; + var INFINITY = 1 / 0, MAX_SAFE_INTEGER = 9007199254740991, MAX_INTEGER = 17976931348623157e292, NAN = 0 / 0; + var MAX_ARRAY_LENGTH = 4294967295, MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; + var wrapFlags = [ + ["ary", WRAP_ARY_FLAG], + ["bind", WRAP_BIND_FLAG], + ["bindKey", WRAP_BIND_KEY_FLAG], + ["curry", WRAP_CURRY_FLAG], + ["curryRight", WRAP_CURRY_RIGHT_FLAG], + ["flip", WRAP_FLIP_FLAG], + ["partial", WRAP_PARTIAL_FLAG], + ["partialRight", WRAP_PARTIAL_RIGHT_FLAG], + ["rearg", WRAP_REARG_FLAG] + ]; + var argsTag = "[object Arguments]", arrayTag = "[object Array]", asyncTag = "[object AsyncFunction]", boolTag = "[object Boolean]", dateTag = "[object Date]", domExcTag = "[object DOMException]", errorTag = "[object Error]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", mapTag = "[object Map]", numberTag = "[object Number]", nullTag = "[object Null]", objectTag = "[object Object]", promiseTag = "[object Promise]", proxyTag = "[object Proxy]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag = "[object Symbol]", undefinedTag = "[object Undefined]", weakMapTag = "[object WeakMap]", weakSetTag = "[object WeakSet]"; + var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]"; + var reEmptyStringLeading = /\b__p \+= '';/g, reEmptyStringMiddle = /\b(__p \+=) '' \+/g, reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, reUnescapedHtml = /[&<>"']/g, reHasEscapedHtml = RegExp(reEscapedHtml.source), reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + var reEscape = /<%-([\s\S]+?)%>/g, reEvaluate = /<%([\s\S]+?)%>/g, reInterpolate = /<%=([\s\S]+?)%>/g; + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar.source); + var reTrimStart = /^\s+/; + var reWhitespace = /\s/; + var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, reSplitDetails = /,? & /; + var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; + var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/; + var reEscapeChar = /\\(\\)?/g; + var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; + var reFlags = /\w*$/; + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + var reIsBinary = /^0b[01]+$/i; + var reIsHostCtor = /^\[object .+?Constructor\]$/; + var reIsOctal = /^0o[0-7]+$/i; + var reIsUint = /^(?:0|[1-9]\d*)$/; + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + var reNoMatch = /($^)/; + var reUnescapedString = /['\n\r\u2028\u2029\\]/g; + var rsAstralRange = "\\ud800-\\udfff", rsComboMarksRange = "\\u0300-\\u036f", reComboHalfMarksRange = "\\ufe20-\\ufe2f", rsComboSymbolsRange = "\\u20d0-\\u20ff", rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsDingbatRange = "\\u2700-\\u27bf", rsLowerRange = "a-z\\xdf-\\xf6\\xf8-\\xff", rsMathOpRange = "\\xac\\xb1\\xd7\\xf7", rsNonCharRange = "\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf", rsPunctuationRange = "\\u2000-\\u206f", rsSpaceRange = " \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000", rsUpperRange = "A-Z\\xc0-\\xd6\\xd8-\\xde", rsVarRange = "\\ufe0e\\ufe0f", rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + var rsApos = "['\u2019]", rsAstral = "[" + rsAstralRange + "]", rsBreak = "[" + rsBreakRange + "]", rsCombo = "[" + rsComboRange + "]", rsDigits = "\\d+", rsDingbat = "[" + rsDingbatRange + "]", rsLower = "[" + rsLowerRange + "]", rsMisc = "[^" + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + "]", rsFitz = "\\ud83c[\\udffb-\\udfff]", rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")", rsNonAstral = "[^" + rsAstralRange + "]", rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}", rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]", rsUpper = "[" + rsUpperRange + "]", rsZWJ = "\\u200d"; + var rsMiscLower = "(?:" + rsLower + "|" + rsMisc + ")", rsMiscUpper = "(?:" + rsUpper + "|" + rsMisc + ")", rsOptContrLower = "(?:" + rsApos + "(?:d|ll|m|re|s|t|ve))?", rsOptContrUpper = "(?:" + rsApos + "(?:D|LL|M|RE|S|T|VE))?", reOptMod = rsModifier + "?", rsOptVar = "[" + rsVarRange + "]?", rsOptJoin = "(?:" + rsZWJ + "(?:" + [rsNonAstral, rsRegional, rsSurrPair].join("|") + ")" + rsOptVar + reOptMod + ")*", rsOrdLower = "\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])", rsOrdUpper = "\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])", rsSeq = rsOptVar + reOptMod + rsOptJoin, rsEmoji = "(?:" + [rsDingbat, rsRegional, rsSurrPair].join("|") + ")" + rsSeq, rsSymbol = "(?:" + [rsNonAstral + rsCombo + "?", rsCombo, rsRegional, rsSurrPair, rsAstral].join("|") + ")"; + var reApos = RegExp(rsApos, "g"); + var reComboMark = RegExp(rsCombo, "g"); + var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + rsSymbol + rsSeq, "g"); + var reUnicodeWord = RegExp([ + rsUpper + "?" + rsLower + "+" + rsOptContrLower + "(?=" + [rsBreak, rsUpper, "$"].join("|") + ")", + rsMiscUpper + "+" + rsOptContrUpper + "(?=" + [rsBreak, rsUpper + rsMiscLower, "$"].join("|") + ")", + rsUpper + "?" + rsMiscLower + "+" + rsOptContrLower, + rsUpper + "+" + rsOptContrUpper, + rsOrdUpper, + rsOrdLower, + rsDigits, + rsEmoji + ].join("|"), "g"); + var reHasUnicode = RegExp("[" + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + "]"); + var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + var contextProps = [ + "Array", + "Buffer", + "DataView", + "Date", + "Error", + "Float32Array", + "Float64Array", + "Function", + "Int8Array", + "Int16Array", + "Int32Array", + "Map", + "Math", + "Object", + "Promise", + "RegExp", + "Set", + "String", + "Symbol", + "TypeError", + "Uint8Array", + "Uint8ClampedArray", + "Uint16Array", + "Uint32Array", + "WeakMap", + "_", + "clearTimeout", + "isFinite", + "parseInt", + "setTimeout" + ]; + var templateCounter = -1; + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false; + var deburredLetters = { + // Latin-1 Supplement block. + "\xC0": "A", + "\xC1": "A", + "\xC2": "A", + "\xC3": "A", + "\xC4": "A", + "\xC5": "A", + "\xE0": "a", + "\xE1": "a", + "\xE2": "a", + "\xE3": "a", + "\xE4": "a", + "\xE5": "a", + "\xC7": "C", + "\xE7": "c", + "\xD0": "D", + "\xF0": "d", + "\xC8": "E", + "\xC9": "E", + "\xCA": "E", + "\xCB": "E", + "\xE8": "e", + "\xE9": "e", + "\xEA": "e", + "\xEB": "e", + "\xCC": "I", + "\xCD": "I", + "\xCE": "I", + "\xCF": "I", + "\xEC": "i", + "\xED": "i", + "\xEE": "i", + "\xEF": "i", + "\xD1": "N", + "\xF1": "n", + "\xD2": "O", + "\xD3": "O", + "\xD4": "O", + "\xD5": "O", + "\xD6": "O", + "\xD8": "O", + "\xF2": "o", + "\xF3": "o", + "\xF4": "o", + "\xF5": "o", + "\xF6": "o", + "\xF8": "o", + "\xD9": "U", + "\xDA": "U", + "\xDB": "U", + "\xDC": "U", + "\xF9": "u", + "\xFA": "u", + "\xFB": "u", + "\xFC": "u", + "\xDD": "Y", + "\xFD": "y", + "\xFF": "y", + "\xC6": "Ae", + "\xE6": "ae", + "\xDE": "Th", + "\xFE": "th", + "\xDF": "ss", + // Latin Extended-A block. + "\u0100": "A", + "\u0102": "A", + "\u0104": "A", + "\u0101": "a", + "\u0103": "a", + "\u0105": "a", + "\u0106": "C", + "\u0108": "C", + "\u010A": "C", + "\u010C": "C", + "\u0107": "c", + "\u0109": "c", + "\u010B": "c", + "\u010D": "c", + "\u010E": "D", + "\u0110": "D", + "\u010F": "d", + "\u0111": "d", + "\u0112": "E", + "\u0114": "E", + "\u0116": "E", + "\u0118": "E", + "\u011A": "E", + "\u0113": "e", + "\u0115": "e", + "\u0117": "e", + "\u0119": "e", + "\u011B": "e", + "\u011C": "G", + "\u011E": "G", + "\u0120": "G", + "\u0122": "G", + "\u011D": "g", + "\u011F": "g", + "\u0121": "g", + "\u0123": "g", + "\u0124": "H", + "\u0126": "H", + "\u0125": "h", + "\u0127": "h", + "\u0128": "I", + "\u012A": "I", + "\u012C": "I", + "\u012E": "I", + "\u0130": "I", + "\u0129": "i", + "\u012B": "i", + "\u012D": "i", + "\u012F": "i", + "\u0131": "i", + "\u0134": "J", + "\u0135": "j", + "\u0136": "K", + "\u0137": "k", + "\u0138": "k", + "\u0139": "L", + "\u013B": "L", + "\u013D": "L", + "\u013F": "L", + "\u0141": "L", + "\u013A": "l", + "\u013C": "l", + "\u013E": "l", + "\u0140": "l", + "\u0142": "l", + "\u0143": "N", + "\u0145": "N", + "\u0147": "N", + "\u014A": "N", + "\u0144": "n", + "\u0146": "n", + "\u0148": "n", + "\u014B": "n", + "\u014C": "O", + "\u014E": "O", + "\u0150": "O", + "\u014D": "o", + "\u014F": "o", + "\u0151": "o", + "\u0154": "R", + "\u0156": "R", + "\u0158": "R", + "\u0155": "r", + "\u0157": "r", + "\u0159": "r", + "\u015A": "S", + "\u015C": "S", + "\u015E": "S", + "\u0160": "S", + "\u015B": "s", + "\u015D": "s", + "\u015F": "s", + "\u0161": "s", + "\u0162": "T", + "\u0164": "T", + "\u0166": "T", + "\u0163": "t", + "\u0165": "t", + "\u0167": "t", + "\u0168": "U", + "\u016A": "U", + "\u016C": "U", + "\u016E": "U", + "\u0170": "U", + "\u0172": "U", + "\u0169": "u", + "\u016B": "u", + "\u016D": "u", + "\u016F": "u", + "\u0171": "u", + "\u0173": "u", + "\u0174": "W", + "\u0175": "w", + "\u0176": "Y", + "\u0177": "y", + "\u0178": "Y", + "\u0179": "Z", + "\u017B": "Z", + "\u017D": "Z", + "\u017A": "z", + "\u017C": "z", + "\u017E": "z", + "\u0132": "IJ", + "\u0133": "ij", + "\u0152": "Oe", + "\u0153": "oe", + "\u0149": "'n", + "\u017F": "s" + }; + var htmlEscapes = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'" + }; + var htmlUnescapes = { + "&": "&", + "<": "<", + ">": ">", + """: '"', + "'": "'" + }; + var stringEscapes = { + "\\": "\\", + "'": "'", + "\n": "n", + "\r": "r", + "\u2028": "u2028", + "\u2029": "u2029" + }; + var freeParseFloat = parseFloat, freeParseInt = parseInt; + var freeGlobal = typeof global == "object" && global && global.Object === Object && global; + var freeSelf = typeof self == "object" && self && self.Object === Object && self; + var root = freeGlobal || freeSelf || Function("return this")(); + var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports; + var freeModule = freeExports && typeof module2 == "object" && module2 && !module2.nodeType && module2; + var moduleExports = freeModule && freeModule.exports === freeExports; + var freeProcess = moduleExports && freeGlobal.process; + var nodeUtil = function() { + try { + var types = freeModule && freeModule.require && freeModule.require("util").types; + if (types) { + return types; + } + return freeProcess && freeProcess.binding && freeProcess.binding("util"); + } catch (e) { + } + }(); + var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, nodeIsDate = nodeUtil && nodeUtil.isDate, nodeIsMap = nodeUtil && nodeUtil.isMap, nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, nodeIsSet = nodeUtil && nodeUtil.isSet, nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + function apply(func, thisArg, args) { + switch (args.length) { + case 0: + return func.call(thisArg); + case 1: + return func.call(thisArg, args[0]); + case 2: + return func.call(thisArg, args[0], args[1]); + case 3: + return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); + } + function arrayAggregator(array, setter, iteratee, accumulator) { + var index = -1, length = array == null ? 0 : array.length; + while (++index < length) { + var value = array[index]; + setter(accumulator, value, iteratee(value), array); + } + return accumulator; + } + function arrayEach(array, iteratee) { + var index = -1, length = array == null ? 0 : array.length; + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; + } + function arrayEachRight(array, iteratee) { + var length = array == null ? 0 : array.length; + while (length--) { + if (iteratee(array[length], length, array) === false) { + break; + } + } + return array; + } + function arrayEvery(array, predicate) { + var index = -1, length = array == null ? 0 : array.length; + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; + } + function arrayFilter(array, predicate) { + var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; + } + function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; + } + function arrayIncludesWith(array, value, comparator) { + var index = -1, length = array == null ? 0 : array.length; + while (++index < length) { + if (comparator(value, array[index])) { + return true; + } + } + return false; + } + function arrayMap(array, iteratee) { + var index = -1, length = array == null ? 0 : array.length, result = Array(length); + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + function arrayPush(array, values) { + var index = -1, length = values.length, offset = array.length; + while (++index < length) { + array[offset + index] = values[index]; + } + return array; + } + function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; + } + function arrayReduceRight(array, iteratee, accumulator, initAccum) { + var length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[--length]; + } + while (length--) { + accumulator = iteratee(accumulator, array[length], length, array); + } + return accumulator; + } + function arraySome(array, predicate) { + var index = -1, length = array == null ? 0 : array.length; + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; + } + var asciiSize = baseProperty("length"); + function asciiToArray(string) { + return string.split(""); + } + function asciiWords(string) { + return string.match(reAsciiWord) || []; + } + function baseFindKey(collection, predicate, eachFunc) { + var result; + eachFunc(collection, function(value, key, collection2) { + if (predicate(value, key, collection2)) { + result = key; + return false; + } + }); + return result; + } + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, index = fromIndex + (fromRight ? 1 : -1); + while (fromRight ? index-- : ++index < length) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; + } + function baseIndexOf(array, value, fromIndex) { + return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex); + } + function baseIndexOfWith(array, value, fromIndex, comparator) { + var index = fromIndex - 1, length = array.length; + while (++index < length) { + if (comparator(array[index], value)) { + return index; + } + } + return -1; + } + function baseIsNaN(value) { + return value !== value; + } + function baseMean(array, iteratee) { + var length = array == null ? 0 : array.length; + return length ? baseSum(array, iteratee) / length : NAN; + } + function baseProperty(key) { + return function(object) { + return object == null ? undefined2 : object[key]; + }; + } + function basePropertyOf(object) { + return function(key) { + return object == null ? undefined2 : object[key]; + }; + } + function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection2) { + accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index, collection2); + }); + return accumulator; + } + function baseSortBy(array, comparer) { + var length = array.length; + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; + } + function baseSum(array, iteratee) { + var result, index = -1, length = array.length; + while (++index < length) { + var current = iteratee(array[index]); + if (current !== undefined2) { + result = result === undefined2 ? current : result + current; + } + } + return result; + } + function baseTimes(n, iteratee) { + var index = -1, result = Array(n); + while (++index < n) { + result[index] = iteratee(index); + } + return result; + } + function baseToPairs(object, props) { + return arrayMap(props, function(key) { + return [key, object[key]]; + }); + } + function baseTrim(string) { + return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "") : string; + } + function baseUnary(func) { + return function(value) { + return func(value); + }; + } + function baseValues(object, props) { + return arrayMap(props, function(key) { + return object[key]; + }); + } + function cacheHas(cache, key) { + return cache.has(key); + } + function charsStartIndex(strSymbols, chrSymbols) { + var index = -1, length = strSymbols.length; + while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) { + } + return index; + } + function charsEndIndex(strSymbols, chrSymbols) { + var index = strSymbols.length; + while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) { + } + return index; + } + function countHolders(array, placeholder) { + var length = array.length, result = 0; + while (length--) { + if (array[length] === placeholder) { + ++result; + } + } + return result; + } + var deburrLetter = basePropertyOf(deburredLetters); + var escapeHtmlChar = basePropertyOf(htmlEscapes); + function escapeStringChar(chr) { + return "\\" + stringEscapes[chr]; + } + function getValue(object, key) { + return object == null ? undefined2 : object[key]; + } + function hasUnicode(string) { + return reHasUnicode.test(string); + } + function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); + } + function iteratorToArray(iterator) { + var data, result = []; + while (!(data = iterator.next()).done) { + result.push(data.value); + } + return result; + } + function mapToArray(map) { + var index = -1, result = Array(map.size); + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; + } + function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; + } + function replaceHolders(array, placeholder) { + var index = -1, length = array.length, resIndex = 0, result = []; + while (++index < length) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { + array[index] = PLACEHOLDER; + result[resIndex++] = index; + } + } + return result; + } + function setToArray(set) { + var index = -1, result = Array(set.size); + set.forEach(function(value) { + result[++index] = value; + }); + return result; + } + function setToPairs(set) { + var index = -1, result = Array(set.size); + set.forEach(function(value) { + result[++index] = [value, value]; + }); + return result; + } + function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, length = array.length; + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; + } + function strictLastIndexOf(array, value, fromIndex) { + var index = fromIndex + 1; + while (index--) { + if (array[index] === value) { + return index; + } + } + return index; + } + function stringSize(string) { + return hasUnicode(string) ? unicodeSize(string) : asciiSize(string); + } + function stringToArray(string) { + return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string); + } + function trimmedEndIndex(string) { + var index = string.length; + while (index-- && reWhitespace.test(string.charAt(index))) { + } + return index; + } + var unescapeHtmlChar = basePropertyOf(htmlUnescapes); + function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; + while (reUnicode.test(string)) { + ++result; + } + return result; + } + function unicodeToArray(string) { + return string.match(reUnicode) || []; + } + function unicodeWords(string) { + return string.match(reUnicodeWord) || []; + } + var runInContext = function runInContext2(context) { + context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); + var Array2 = context.Array, Date2 = context.Date, Error2 = context.Error, Function2 = context.Function, Math2 = context.Math, Object2 = context.Object, RegExp2 = context.RegExp, String2 = context.String, TypeError2 = context.TypeError; + var arrayProto = Array2.prototype, funcProto = Function2.prototype, objectProto = Object2.prototype; + var coreJsData = context["__core-js_shared__"]; + var funcToString = funcProto.toString; + var hasOwnProperty = objectProto.hasOwnProperty; + var idCounter = 0; + var maskSrcKey = function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ""); + return uid ? "Symbol(src)_1." + uid : ""; + }(); + var nativeObjectToString = objectProto.toString; + var objectCtorString = funcToString.call(Object2); + var oldDash = root._; + var reIsNative = RegExp2( + "^" + funcToString.call(hasOwnProperty).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$" + ); + var Buffer2 = moduleExports ? context.Buffer : undefined2, Symbol2 = context.Symbol, Uint8Array2 = context.Uint8Array, allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : undefined2, getPrototype = overArg(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol2 ? Symbol2.isConcatSpreadable : undefined2, symIterator = Symbol2 ? Symbol2.iterator : undefined2, symToStringTag = Symbol2 ? Symbol2.toStringTag : undefined2; + var defineProperty = function() { + try { + var func = getNative(Object2, "defineProperty"); + func({}, "", {}); + return func; + } catch (e) { + } + }(); + var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, ctxNow = Date2 && Date2.now !== root.Date.now && Date2.now, ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; + var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined2, nativeIsFinite = context.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object2.keys, Object2), nativeMax = Math2.max, nativeMin = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto.reverse; + var DataView = getNative(context, "DataView"), Map = getNative(context, "Map"), Promise2 = getNative(context, "Promise"), Set2 = getNative(context, "Set"), WeakMap = getNative(context, "WeakMap"), nativeCreate = getNative(Object2, "create"); + var metaMap = WeakMap && new WeakMap(); + var realNames = {}; + var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map), promiseCtorString = toSource(Promise2), setCtorString = toSource(Set2), weakMapCtorString = toSource(WeakMap); + var symbolProto = Symbol2 ? Symbol2.prototype : undefined2, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined2, symbolToString = symbolProto ? symbolProto.toString : undefined2; + function lodash(value) { + if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { + if (value instanceof LodashWrapper) { + return value; + } + if (hasOwnProperty.call(value, "__wrapped__")) { + return wrapperClone(value); + } + } + return new LodashWrapper(value); + } + var baseCreate = /* @__PURE__ */ function() { + function object() { + } + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result2 = new object(); + object.prototype = undefined2; + return result2; + }; + }(); + function baseLodash() { + } + function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + this.__index__ = 0; + this.__values__ = undefined2; + } + lodash.templateSettings = { + /** + * Used to detect `data` property values to be HTML-escaped. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + "escape": reEscape, + /** + * Used to detect code to be evaluated. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + "evaluate": reEvaluate, + /** + * Used to detect `data` property values to inject. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + "interpolate": reInterpolate, + /** + * Used to reference the data object in the template text. + * + * @memberOf _.templateSettings + * @type {string} + */ + "variable": "", + /** + * Used to import variables into the compiled template. + * + * @memberOf _.templateSettings + * @type {Object} + */ + "imports": { + /** + * A reference to the `lodash` function. + * + * @memberOf _.templateSettings.imports + * @type {Function} + */ + "_": lodash + } + }; + lodash.prototype = baseLodash.prototype; + lodash.prototype.constructor = lodash; + LodashWrapper.prototype = baseCreate(baseLodash.prototype); + LodashWrapper.prototype.constructor = LodashWrapper; + function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = MAX_ARRAY_LENGTH; + this.__views__ = []; + } + function lazyClone() { + var result2 = new LazyWrapper(this.__wrapped__); + result2.__actions__ = copyArray(this.__actions__); + result2.__dir__ = this.__dir__; + result2.__filtered__ = this.__filtered__; + result2.__iteratees__ = copyArray(this.__iteratees__); + result2.__takeCount__ = this.__takeCount__; + result2.__views__ = copyArray(this.__views__); + return result2; + } + function lazyReverse() { + if (this.__filtered__) { + var result2 = new LazyWrapper(this); + result2.__dir__ = -1; + result2.__filtered__ = true; + } else { + result2 = this.clone(); + result2.__dir__ *= -1; + } + return result2; + } + function lazyValue() { + var array = this.__wrapped__.value(), dir = this.__dir__, isArr = isArray(array), isRight = dir < 0, arrLength = isArr ? array.length : 0, view = getView(0, arrLength, this.__views__), start = view.start, end = view.end, length = end - start, index = isRight ? end : start - 1, iteratees = this.__iteratees__, iterLength = iteratees.length, resIndex = 0, takeCount = nativeMin(length, this.__takeCount__); + if (!isArr || !isRight && arrLength == length && takeCount == length) { + return baseWrapperValue(array, this.__actions__); + } + var result2 = []; + outer: + while (length-- && resIndex < takeCount) { + index += dir; + var iterIndex = -1, value = array[index]; + while (++iterIndex < iterLength) { + var data = iteratees[iterIndex], iteratee2 = data.iteratee, type = data.type, computed = iteratee2(value); + if (type == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; + } + } + } + result2[resIndex++] = value; + } + return result2; + } + LazyWrapper.prototype = baseCreate(baseLodash.prototype); + LazyWrapper.prototype.constructor = LazyWrapper; + function Hash(entries) { + var index = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; + } + function hashDelete(key) { + var result2 = this.has(key) && delete this.__data__[key]; + this.size -= result2 ? 1 : 0; + return result2; + } + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result2 = data[key]; + return result2 === HASH_UNDEFINED ? undefined2 : result2; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined2; + } + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? data[key] !== undefined2 : hasOwnProperty.call(data, key); + } + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = nativeCreate && value === undefined2 ? HASH_UNDEFINED : value; + return this; + } + Hash.prototype.clear = hashClear; + Hash.prototype["delete"] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + function ListCache(entries) { + var index = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + function listCacheDelete(key) { + var data = this.__data__, index = assocIndexOf(data, key); + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + function listCacheGet(key) { + var data = this.__data__, index = assocIndexOf(data, key); + return index < 0 ? undefined2 : data[index][1]; + } + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + function listCacheSet(key, value) { + var data = this.__data__, index = assocIndexOf(data, key); + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + ListCache.prototype.clear = listCacheClear; + ListCache.prototype["delete"] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + function MapCache(entries) { + var index = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + function mapCacheClear() { + this.size = 0; + this.__data__ = { + "hash": new Hash(), + "map": new (Map || ListCache)(), + "string": new Hash() + }; + } + function mapCacheDelete(key) { + var result2 = getMapData(this, key)["delete"](key); + this.size -= result2 ? 1 : 0; + return result2; + } + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + function mapCacheSet(key, value) { + var data = getMapData(this, key), size2 = data.size; + data.set(key, value); + this.size += data.size == size2 ? 0 : 1; + return this; + } + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype["delete"] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + function SetCache(values2) { + var index = -1, length = values2 == null ? 0 : values2.length; + this.__data__ = new MapCache(); + while (++index < length) { + this.add(values2[index]); + } + } + function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; + } + function setCacheHas(value) { + return this.__data__.has(value); + } + SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; + SetCache.prototype.has = setCacheHas; + function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; + } + function stackClear() { + this.__data__ = new ListCache(); + this.size = 0; + } + function stackDelete(key) { + var data = this.__data__, result2 = data["delete"](key); + this.size = data.size; + return result2; + } + function stackGet(key) { + return this.__data__.get(key); + } + function stackHas(key) { + return this.__data__.has(key); + } + function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; + } + Stack.prototype.clear = stackClear; + Stack.prototype["delete"] = stackDelete; + Stack.prototype.get = stackGet; + Stack.prototype.has = stackHas; + Stack.prototype.set = stackSet; + function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result2 = skipIndexes ? baseTimes(value.length, String2) : [], length = result2.length; + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && // Safari 9 has enumerable `arguments.length` in strict mode. + (key == "length" || // Node.js 0.10 has enumerable non-index properties on buffers. + isBuff && (key == "offset" || key == "parent") || // PhantomJS 2 has enumerable non-index properties on typed arrays. + isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || // Skip index properties. + isIndex(key, length)))) { + result2.push(key); + } + } + return result2; + } + function arraySample(array) { + var length = array.length; + return length ? array[baseRandom(0, length - 1)] : undefined2; + } + function arraySampleSize(array, n) { + return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); + } + function arrayShuffle(array) { + return shuffleSelf(copyArray(array)); + } + function assignMergeValue(object, key, value) { + if (value !== undefined2 && !eq(object[key], value) || value === undefined2 && !(key in object)) { + baseAssignValue(object, key, value); + } + } + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || value === undefined2 && !(key in object)) { + baseAssignValue(object, key, value); + } + } + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + function baseAggregator(collection, setter, iteratee2, accumulator) { + baseEach(collection, function(value, key, collection2) { + setter(accumulator, value, iteratee2(value), collection2); + }); + return accumulator; + } + function baseAssign(object, source) { + return object && copyObject(source, keys(source), object); + } + function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); + } + function baseAssignValue(object, key, value) { + if (key == "__proto__" && defineProperty) { + defineProperty(object, key, { + "configurable": true, + "enumerable": true, + "value": value, + "writable": true + }); + } else { + object[key] = value; + } + } + function baseAt(object, paths) { + var index = -1, length = paths.length, result2 = Array2(length), skip = object == null; + while (++index < length) { + result2[index] = skip ? undefined2 : get(object, paths[index]); + } + return result2; + } + function baseClamp(number, lower, upper) { + if (number === number) { + if (upper !== undefined2) { + number = number <= upper ? number : upper; + } + if (lower !== undefined2) { + number = number >= lower ? number : lower; + } + } + return number; + } + function baseClone(value, bitmask, customizer, key, object, stack) { + var result2, isDeep = bitmask & CLONE_DEEP_FLAG, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG; + if (customizer) { + result2 = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result2 !== undefined2) { + return result2; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result2 = initCloneArray(value); + if (!isDeep) { + return copyArray(value, result2); + } + } else { + var tag = getTag(value), isFunc = tag == funcTag || tag == genTag; + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } + if (tag == objectTag || tag == argsTag || isFunc && !object) { + result2 = isFlat || isFunc ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat ? copySymbolsIn(value, baseAssignIn(result2, value)) : copySymbols(value, baseAssign(result2, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result2 = initCloneByTag(value, tag, isDeep); + } + } + stack || (stack = new Stack()); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result2); + if (isSet(value)) { + value.forEach(function(subValue) { + result2.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); + }); + } else if (isMap(value)) { + value.forEach(function(subValue, key2) { + result2.set(key2, baseClone(subValue, bitmask, customizer, key2, value, stack)); + }); + } + var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys; + var props = isArr ? undefined2 : keysFunc(value); + arrayEach(props || value, function(subValue, key2) { + if (props) { + key2 = subValue; + subValue = value[key2]; + } + assignValue(result2, key2, baseClone(subValue, bitmask, customizer, key2, value, stack)); + }); + return result2; + } + function baseConforms(source) { + var props = keys(source); + return function(object) { + return baseConformsTo(object, source, props); + }; + } + function baseConformsTo(object, source, props) { + var length = props.length; + if (object == null) { + return !length; + } + object = Object2(object); + while (length--) { + var key = props[length], predicate = source[key], value = object[key]; + if (value === undefined2 && !(key in object) || !predicate(value)) { + return false; + } + } + return true; + } + function baseDelay(func, wait, args) { + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + return setTimeout(function() { + func.apply(undefined2, args); + }, wait); + } + function baseDifference(array, values2, iteratee2, comparator) { + var index = -1, includes2 = arrayIncludes, isCommon = true, length = array.length, result2 = [], valuesLength = values2.length; + if (!length) { + return result2; + } + if (iteratee2) { + values2 = arrayMap(values2, baseUnary(iteratee2)); + } + if (comparator) { + includes2 = arrayIncludesWith; + isCommon = false; + } else if (values2.length >= LARGE_ARRAY_SIZE) { + includes2 = cacheHas; + isCommon = false; + values2 = new SetCache(values2); + } + outer: + while (++index < length) { + var value = array[index], computed = iteratee2 == null ? value : iteratee2(value); + value = comparator || value !== 0 ? value : 0; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values2[valuesIndex] === computed) { + continue outer; + } + } + result2.push(value); + } else if (!includes2(values2, computed, comparator)) { + result2.push(value); + } + } + return result2; + } + var baseEach = createBaseEach(baseForOwn); + var baseEachRight = createBaseEach(baseForOwnRight, true); + function baseEvery(collection, predicate) { + var result2 = true; + baseEach(collection, function(value, index, collection2) { + result2 = !!predicate(value, index, collection2); + return result2; + }); + return result2; + } + function baseExtremum(array, iteratee2, comparator) { + var index = -1, length = array.length; + while (++index < length) { + var value = array[index], current = iteratee2(value); + if (current != null && (computed === undefined2 ? current === current && !isSymbol(current) : comparator(current, computed))) { + var computed = current, result2 = value; + } + } + return result2; + } + function baseFill(array, value, start, end) { + var length = array.length; + start = toInteger(start); + if (start < 0) { + start = -start > length ? 0 : length + start; + } + end = end === undefined2 || end > length ? length : toInteger(end); + if (end < 0) { + end += length; + } + end = start > end ? 0 : toLength(end); + while (start < end) { + array[start++] = value; + } + return array; + } + function baseFilter(collection, predicate) { + var result2 = []; + baseEach(collection, function(value, index, collection2) { + if (predicate(value, index, collection2)) { + result2.push(value); + } + }); + return result2; + } + function baseFlatten(array, depth, predicate, isStrict, result2) { + var index = -1, length = array.length; + predicate || (predicate = isFlattenable); + result2 || (result2 = []); + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + baseFlatten(value, depth - 1, predicate, isStrict, result2); + } else { + arrayPush(result2, value); + } + } else if (!isStrict) { + result2[result2.length] = value; + } + } + return result2; + } + var baseFor = createBaseFor(); + var baseForRight = createBaseFor(true); + function baseForOwn(object, iteratee2) { + return object && baseFor(object, iteratee2, keys); + } + function baseForOwnRight(object, iteratee2) { + return object && baseForRight(object, iteratee2, keys); + } + function baseFunctions(object, props) { + return arrayFilter(props, function(key) { + return isFunction(object[key]); + }); + } + function baseGet(object, path) { + path = castPath(path, object); + var index = 0, length = path.length; + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return index && index == length ? object : undefined2; + } + function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result2 = keysFunc(object); + return isArray(object) ? result2 : arrayPush(result2, symbolsFunc(object)); + } + function baseGetTag(value) { + if (value == null) { + return value === undefined2 ? undefinedTag : nullTag; + } + return symToStringTag && symToStringTag in Object2(value) ? getRawTag(value) : objectToString(value); + } + function baseGt(value, other) { + return value > other; + } + function baseHas(object, key) { + return object != null && hasOwnProperty.call(object, key); + } + function baseHasIn(object, key) { + return object != null && key in Object2(object); + } + function baseInRange(number, start, end) { + return number >= nativeMin(start, end) && number < nativeMax(start, end); + } + function baseIntersection(arrays, iteratee2, comparator) { + var includes2 = comparator ? arrayIncludesWith : arrayIncludes, length = arrays[0].length, othLength = arrays.length, othIndex = othLength, caches = Array2(othLength), maxLength = Infinity, result2 = []; + while (othIndex--) { + var array = arrays[othIndex]; + if (othIndex && iteratee2) { + array = arrayMap(array, baseUnary(iteratee2)); + } + maxLength = nativeMin(array.length, maxLength); + caches[othIndex] = !comparator && (iteratee2 || length >= 120 && array.length >= 120) ? new SetCache(othIndex && array) : undefined2; + } + array = arrays[0]; + var index = -1, seen = caches[0]; + outer: + while (++index < length && result2.length < maxLength) { + var value = array[index], computed = iteratee2 ? iteratee2(value) : value; + value = comparator || value !== 0 ? value : 0; + if (!(seen ? cacheHas(seen, computed) : includes2(result2, computed, comparator))) { + othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if (!(cache ? cacheHas(cache, computed) : includes2(arrays[othIndex], computed, comparator))) { + continue outer; + } + } + if (seen) { + seen.push(computed); + } + result2.push(value); + } + } + return result2; + } + function baseInverter(object, setter, iteratee2, accumulator) { + baseForOwn(object, function(value, key, object2) { + setter(accumulator, iteratee2(value), key, object2); + }); + return accumulator; + } + function baseInvoke(object, path, args) { + path = castPath(path, object); + object = parent(object, path); + var func = object == null ? object : object[toKey(last(path))]; + return func == null ? undefined2 : apply(func, object, args); + } + function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; + } + function baseIsArrayBuffer(value) { + return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; + } + function baseIsDate(value) { + return isObjectLike(value) && baseGetTag(value) == dateTag; + } + function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); + } + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other); + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; + var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag; + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } + if (isSameTag && !objIsObj) { + stack || (stack = new Stack()); + return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty.call(other, "__wrapped__"); + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other; + stack || (stack = new Stack()); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new Stack()); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); + } + function baseIsMap(value) { + return isObjectLike(value) && getTag(value) == mapTag; + } + function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, length = index, noCustomizer = !customizer; + if (object == null) { + return !length; + } + object = Object2(object); + while (index--) { + var data = matchData[index]; + if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], objValue = object[key], srcValue = data[1]; + if (noCustomizer && data[2]) { + if (objValue === undefined2 && !(key in object)) { + return false; + } + } else { + var stack = new Stack(); + if (customizer) { + var result2 = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result2 === undefined2 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result2)) { + return false; + } + } + } + return true; + } + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + function baseIsRegExp(value) { + return isObjectLike(value) && baseGetTag(value) == regexpTag; + } + function baseIsSet(value) { + return isObjectLike(value) && getTag(value) == setTag; + } + function baseIsTypedArray(value) { + return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; + } + function baseIteratee(value) { + if (typeof value == "function") { + return value; + } + if (value == null) { + return identity; + } + if (typeof value == "object") { + return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value); + } + return property(value); + } + function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result2 = []; + for (var key in Object2(object)) { + if (hasOwnProperty.call(object, key) && key != "constructor") { + result2.push(key); + } + } + return result2; + } + function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), result2 = []; + for (var key in object) { + if (!(key == "constructor" && (isProto || !hasOwnProperty.call(object, key)))) { + result2.push(key); + } + } + return result2; + } + function baseLt(value, other) { + return value < other; + } + function baseMap(collection, iteratee2) { + var index = -1, result2 = isArrayLike(collection) ? Array2(collection.length) : []; + baseEach(collection, function(value, key, collection2) { + result2[++index] = iteratee2(value, key, collection2); + }); + return result2; + } + function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || baseIsMatch(object, source, matchData); + }; + } + function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + return function(object) { + var objValue = get(object, path); + return objValue === undefined2 && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; + } + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + stack || (stack = new Stack()); + if (isObject(srcValue)) { + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } else { + var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + "", object, source, stack) : undefined2; + if (newValue === undefined2) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), srcValue = safeGet(source, key), stacked = stack.get(srcValue); + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer ? customizer(objValue, srcValue, key + "", object, source, stack) : undefined2; + var isCommon = newValue === undefined2; + if (isCommon) { + var isArr = isArray(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue); + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } else { + newValue = []; + } + } else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } else if (!isObject(objValue) || isFunction(objValue)) { + newValue = initCloneObject(srcValue); + } + } else { + isCommon = false; + } + } + if (isCommon) { + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack["delete"](srcValue); + } + assignMergeValue(object, key, newValue); + } + function baseNth(array, n) { + var length = array.length; + if (!length) { + return; + } + n += n < 0 ? length : 0; + return isIndex(n, length) ? array[n] : undefined2; + } + function baseOrderBy(collection, iteratees, orders) { + if (iteratees.length) { + iteratees = arrayMap(iteratees, function(iteratee2) { + if (isArray(iteratee2)) { + return function(value) { + return baseGet(value, iteratee2.length === 1 ? iteratee2[0] : iteratee2); + }; + } + return iteratee2; + }); + } else { + iteratees = [identity]; + } + var index = -1; + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + var result2 = baseMap(collection, function(value, key, collection2) { + var criteria = arrayMap(iteratees, function(iteratee2) { + return iteratee2(value); + }); + return { "criteria": criteria, "index": ++index, "value": value }; + }); + return baseSortBy(result2, function(object, other) { + return compareMultiple(object, other, orders); + }); + } + function basePick(object, paths) { + return basePickBy(object, paths, function(value, path) { + return hasIn(object, path); + }); + } + function basePickBy(object, paths, predicate) { + var index = -1, length = paths.length, result2 = {}; + while (++index < length) { + var path = paths[index], value = baseGet(object, path); + if (predicate(value, path)) { + baseSet(result2, castPath(path, object), value); + } + } + return result2; + } + function basePropertyDeep(path) { + return function(object) { + return baseGet(object, path); + }; + } + function basePullAll(array, values2, iteratee2, comparator) { + var indexOf2 = comparator ? baseIndexOfWith : baseIndexOf, index = -1, length = values2.length, seen = array; + if (array === values2) { + values2 = copyArray(values2); + } + if (iteratee2) { + seen = arrayMap(array, baseUnary(iteratee2)); + } + while (++index < length) { + var fromIndex = 0, value = values2[index], computed = iteratee2 ? iteratee2(value) : value; + while ((fromIndex = indexOf2(seen, computed, fromIndex, comparator)) > -1) { + if (seen !== array) { + splice.call(seen, fromIndex, 1); + } + splice.call(array, fromIndex, 1); + } + } + return array; + } + function basePullAt(array, indexes) { + var length = array ? indexes.length : 0, lastIndex = length - 1; + while (length--) { + var index = indexes[length]; + if (length == lastIndex || index !== previous) { + var previous = index; + if (isIndex(index)) { + splice.call(array, index, 1); + } else { + baseUnset(array, index); + } + } + } + return array; + } + function baseRandom(lower, upper) { + return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); + } + function baseRange(start, end, step, fromRight) { + var index = -1, length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), result2 = Array2(length); + while (length--) { + result2[fromRight ? length : ++index] = start; + start += step; + } + return result2; + } + function baseRepeat(string, n) { + var result2 = ""; + if (!string || n < 1 || n > MAX_SAFE_INTEGER) { + return result2; + } + do { + if (n % 2) { + result2 += string; + } + n = nativeFloor(n / 2); + if (n) { + string += string; + } + } while (n); + return result2; + } + function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ""); + } + function baseSample(collection) { + return arraySample(values(collection)); + } + function baseSampleSize(collection, n) { + var array = values(collection); + return shuffleSelf(array, baseClamp(n, 0, array.length)); + } + function baseSet(object, path, value, customizer) { + if (!isObject(object)) { + return object; + } + path = castPath(path, object); + var index = -1, length = path.length, lastIndex = length - 1, nested = object; + while (nested != null && ++index < length) { + var key = toKey(path[index]), newValue = value; + if (key === "__proto__" || key === "constructor" || key === "prototype") { + return object; + } + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined2; + if (newValue === undefined2) { + newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {}; + } + } + assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; + } + var baseSetData = !metaMap ? identity : function(func, data) { + metaMap.set(func, data); + return func; + }; + var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, "toString", { + "configurable": true, + "enumerable": false, + "value": constant(string), + "writable": true + }); + }; + function baseShuffle(collection) { + return shuffleSelf(values(collection)); + } + function baseSlice(array, start, end) { + var index = -1, length = array.length; + if (start < 0) { + start = -start > length ? 0 : length + start; + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start > end ? 0 : end - start >>> 0; + start >>>= 0; + var result2 = Array2(length); + while (++index < length) { + result2[index] = array[index + start]; + } + return result2; + } + function baseSome(collection, predicate) { + var result2; + baseEach(collection, function(value, index, collection2) { + result2 = predicate(value, index, collection2); + return !result2; + }); + return !!result2; + } + function baseSortedIndex(array, value, retHighest) { + var low = 0, high = array == null ? low : array.length; + if (typeof value == "number" && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = low + high >>> 1, computed = array[mid]; + if (computed !== null && !isSymbol(computed) && (retHighest ? computed <= value : computed < value)) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + return baseSortedIndexBy(array, value, identity, retHighest); + } + function baseSortedIndexBy(array, value, iteratee2, retHighest) { + var low = 0, high = array == null ? 0 : array.length; + if (high === 0) { + return 0; + } + value = iteratee2(value); + var valIsNaN = value !== value, valIsNull = value === null, valIsSymbol = isSymbol(value), valIsUndefined = value === undefined2; + while (low < high) { + var mid = nativeFloor((low + high) / 2), computed = iteratee2(array[mid]), othIsDefined = computed !== undefined2, othIsNull = computed === null, othIsReflexive = computed === computed, othIsSymbol = isSymbol(computed); + if (valIsNaN) { + var setLow = retHighest || othIsReflexive; + } else if (valIsUndefined) { + setLow = othIsReflexive && (retHighest || othIsDefined); + } else if (valIsNull) { + setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); + } else if (valIsSymbol) { + setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); + } else if (othIsNull || othIsSymbol) { + setLow = false; + } else { + setLow = retHighest ? computed <= value : computed < value; + } + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + return nativeMin(high, MAX_ARRAY_INDEX); + } + function baseSortedUniq(array, iteratee2) { + var index = -1, length = array.length, resIndex = 0, result2 = []; + while (++index < length) { + var value = array[index], computed = iteratee2 ? iteratee2(value) : value; + if (!index || !eq(computed, seen)) { + var seen = computed; + result2[resIndex++] = value === 0 ? 0 : value; + } + } + return result2; + } + function baseToNumber(value) { + if (typeof value == "number") { + return value; + } + if (isSymbol(value)) { + return NAN; + } + return +value; + } + function baseToString(value) { + if (typeof value == "string") { + return value; + } + if (isArray(value)) { + return arrayMap(value, baseToString) + ""; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ""; + } + var result2 = value + ""; + return result2 == "0" && 1 / value == -INFINITY ? "-0" : result2; + } + function baseUniq(array, iteratee2, comparator) { + var index = -1, includes2 = arrayIncludes, length = array.length, isCommon = true, result2 = [], seen = result2; + if (comparator) { + isCommon = false; + includes2 = arrayIncludesWith; + } else if (length >= LARGE_ARRAY_SIZE) { + var set2 = iteratee2 ? null : createSet(array); + if (set2) { + return setToArray(set2); + } + isCommon = false; + includes2 = cacheHas; + seen = new SetCache(); + } else { + seen = iteratee2 ? [] : result2; + } + outer: + while (++index < length) { + var value = array[index], computed = iteratee2 ? iteratee2(value) : value; + value = comparator || value !== 0 ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee2) { + seen.push(computed); + } + result2.push(value); + } else if (!includes2(seen, computed, comparator)) { + if (seen !== result2) { + seen.push(computed); + } + result2.push(value); + } + } + return result2; + } + function baseUnset(object, path) { + path = castPath(path, object); + object = parent(object, path); + return object == null || delete object[toKey(last(path))]; + } + function baseUpdate(object, path, updater, customizer) { + return baseSet(object, path, updater(baseGet(object, path)), customizer); + } + function baseWhile(array, predicate, isDrop, fromRight) { + var length = array.length, index = fromRight ? length : -1; + while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) { + } + return isDrop ? baseSlice(array, fromRight ? 0 : index, fromRight ? index + 1 : length) : baseSlice(array, fromRight ? index + 1 : 0, fromRight ? length : index); + } + function baseWrapperValue(value, actions) { + var result2 = value; + if (result2 instanceof LazyWrapper) { + result2 = result2.value(); + } + return arrayReduce(actions, function(result3, action) { + return action.func.apply(action.thisArg, arrayPush([result3], action.args)); + }, result2); + } + function baseXor(arrays, iteratee2, comparator) { + var length = arrays.length; + if (length < 2) { + return length ? baseUniq(arrays[0]) : []; + } + var index = -1, result2 = Array2(length); + while (++index < length) { + var array = arrays[index], othIndex = -1; + while (++othIndex < length) { + if (othIndex != index) { + result2[index] = baseDifference(result2[index] || array, arrays[othIndex], iteratee2, comparator); + } + } + } + return baseUniq(baseFlatten(result2, 1), iteratee2, comparator); + } + function baseZipObject(props, values2, assignFunc) { + var index = -1, length = props.length, valsLength = values2.length, result2 = {}; + while (++index < length) { + var value = index < valsLength ? values2[index] : undefined2; + assignFunc(result2, props[index], value); + } + return result2; + } + function castArrayLikeObject(value) { + return isArrayLikeObject(value) ? value : []; + } + function castFunction(value) { + return typeof value == "function" ? value : identity; + } + function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); + } + var castRest = baseRest; + function castSlice(array, start, end) { + var length = array.length; + end = end === undefined2 ? length : end; + return !start && end >= length ? array : baseSlice(array, start, end); + } + var clearTimeout = ctxClearTimeout || function(id) { + return root.clearTimeout(id); + }; + function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, result2 = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + buffer.copy(result2); + return result2; + } + function cloneArrayBuffer(arrayBuffer) { + var result2 = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array2(result2).set(new Uint8Array2(arrayBuffer)); + return result2; + } + function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); + } + function cloneRegExp(regexp) { + var result2 = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result2.lastIndex = regexp.lastIndex; + return result2; + } + function cloneSymbol(symbol) { + return symbolValueOf ? Object2(symbolValueOf.call(symbol)) : {}; + } + function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); + } + function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined2, valIsNull = value === null, valIsReflexive = value === value, valIsSymbol = isSymbol(value); + var othIsDefined = other !== undefined2, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol(other); + if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) { + return 1; + } + if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) { + return -1; + } + } + return 0; + } + function compareMultiple(object, other, orders) { + var index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length; + while (++index < length) { + var result2 = compareAscending(objCriteria[index], othCriteria[index]); + if (result2) { + if (index >= ordersLength) { + return result2; + } + var order = orders[index]; + return result2 * (order == "desc" ? -1 : 1); + } + } + return object.index - other.index; + } + function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, argsLength = args.length, holdersLength = holders.length, leftIndex = -1, leftLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result2 = Array2(leftLength + rangeLength), isUncurried = !isCurried; + while (++leftIndex < leftLength) { + result2[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result2[holders[argsIndex]] = args[argsIndex]; + } + } + while (rangeLength--) { + result2[leftIndex++] = args[argsIndex++]; + } + return result2; + } + function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, argsLength = args.length, holdersIndex = -1, holdersLength = holders.length, rightIndex = -1, rightLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result2 = Array2(rangeLength + rightLength), isUncurried = !isCurried; + while (++argsIndex < rangeLength) { + result2[argsIndex] = args[argsIndex]; + } + var offset = argsIndex; + while (++rightIndex < rightLength) { + result2[offset + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result2[offset + holders[holdersIndex]] = args[argsIndex++]; + } + } + return result2; + } + function copyArray(source, array) { + var index = -1, length = source.length; + array || (array = Array2(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; + } + function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + var index = -1, length = props.length; + while (++index < length) { + var key = props[index]; + var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined2; + if (newValue === undefined2) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; + } + function copySymbols(source, object) { + return copyObject(source, getSymbols(source), object); + } + function copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); + } + function createAggregator(setter, initializer) { + return function(collection, iteratee2) { + var func = isArray(collection) ? arrayAggregator : baseAggregator, accumulator = initializer ? initializer() : {}; + return func(collection, setter, getIteratee(iteratee2, 2), accumulator); + }; + } + function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : undefined2, guard = length > 2 ? sources[2] : undefined2; + customizer = assigner.length > 3 && typeof customizer == "function" ? (length--, customizer) : undefined2; + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined2 : customizer; + length = 1; + } + object = Object2(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); + } + function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee2) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee2); + } + var length = collection.length, index = fromRight ? length : -1, iterable = Object2(collection); + while (fromRight ? index-- : ++index < length) { + if (iteratee2(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; + } + function createBaseFor(fromRight) { + return function(object, iteratee2, keysFunc) { + var index = -1, iterable = Object2(object), props = keysFunc(object), length = props.length; + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee2(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; + } + function createBind(func, bitmask, thisArg) { + var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); + function wrapper() { + var fn = this && this !== root && this instanceof wrapper ? Ctor : func; + return fn.apply(isBind ? thisArg : this, arguments); + } + return wrapper; + } + function createCaseFirst(methodName) { + return function(string) { + string = toString(string); + var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined2; + var chr = strSymbols ? strSymbols[0] : string.charAt(0); + var trailing = strSymbols ? castSlice(strSymbols, 1).join("") : string.slice(1); + return chr[methodName]() + trailing; + }; + } + function createCompounder(callback) { + return function(string) { + return arrayReduce(words(deburr(string).replace(reApos, "")), callback, ""); + }; + } + function createCtor(Ctor) { + return function() { + var args = arguments; + switch (args.length) { + case 0: + return new Ctor(); + case 1: + return new Ctor(args[0]); + case 2: + return new Ctor(args[0], args[1]); + case 3: + return new Ctor(args[0], args[1], args[2]); + case 4: + return new Ctor(args[0], args[1], args[2], args[3]); + case 5: + return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: + return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: + return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = baseCreate(Ctor.prototype), result2 = Ctor.apply(thisBinding, args); + return isObject(result2) ? result2 : thisBinding; + }; + } + function createCurry(func, bitmask, arity) { + var Ctor = createCtor(func); + function wrapper() { + var length = arguments.length, args = Array2(length), index = length, placeholder = getHolder(wrapper); + while (index--) { + args[index] = arguments[index]; + } + var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder); + length -= holders.length; + if (length < arity) { + return createRecurry( + func, + bitmask, + createHybrid, + wrapper.placeholder, + undefined2, + args, + holders, + undefined2, + undefined2, + arity - length + ); + } + var fn = this && this !== root && this instanceof wrapper ? Ctor : func; + return apply(fn, this, args); + } + return wrapper; + } + function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object2(collection); + if (!isArrayLike(collection)) { + var iteratee2 = getIteratee(predicate, 3); + collection = keys(collection); + predicate = function(key) { + return iteratee2(iterable[key], key, iterable); + }; + } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee2 ? collection[index] : index] : undefined2; + }; + } + function createFlow(fromRight) { + return flatRest(function(funcs) { + var length = funcs.length, index = length, prereq = LodashWrapper.prototype.thru; + if (fromRight) { + funcs.reverse(); + } + while (index--) { + var func = funcs[index]; + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + if (prereq && !wrapper && getFuncName(func) == "wrapper") { + var wrapper = new LodashWrapper([], true); + } + } + index = wrapper ? index : length; + while (++index < length) { + func = funcs[index]; + var funcName = getFuncName(func), data = funcName == "wrapper" ? getData(func) : undefined2; + if (data && isLaziable(data[0]) && data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1) { + wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); + } else { + wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func); + } + } + return function() { + var args = arguments, value = args[0]; + if (wrapper && args.length == 1 && isArray(value)) { + return wrapper.plant(value).value(); + } + var index2 = 0, result2 = length ? funcs[index2].apply(this, args) : value; + while (++index2 < length) { + result2 = funcs[index2].call(this, result2); + } + return result2; + }; + }); + } + function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary2, arity) { + var isAry = bitmask & WRAP_ARY_FLAG, isBind = bitmask & WRAP_BIND_FLAG, isBindKey = bitmask & WRAP_BIND_KEY_FLAG, isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), isFlip = bitmask & WRAP_FLIP_FLAG, Ctor = isBindKey ? undefined2 : createCtor(func); + function wrapper() { + var length = arguments.length, args = Array2(length), index = length; + while (index--) { + args[index] = arguments[index]; + } + if (isCurried) { + var placeholder = getHolder(wrapper), holdersCount = countHolders(args, placeholder); + } + if (partials) { + args = composeArgs(args, partials, holders, isCurried); + } + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); + } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurry( + func, + bitmask, + createHybrid, + wrapper.placeholder, + thisArg, + args, + newHolders, + argPos, + ary2, + arity - length + ); + } + var thisBinding = isBind ? thisArg : this, fn = isBindKey ? thisBinding[func] : func; + length = args.length; + if (argPos) { + args = reorder(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } + if (isAry && ary2 < length) { + args.length = ary2; + } + if (this && this !== root && this instanceof wrapper) { + fn = Ctor || createCtor(fn); + } + return fn.apply(thisBinding, args); + } + return wrapper; + } + function createInverter(setter, toIteratee) { + return function(object, iteratee2) { + return baseInverter(object, setter, toIteratee(iteratee2), {}); + }; + } + function createMathOperation(operator, defaultValue) { + return function(value, other) { + var result2; + if (value === undefined2 && other === undefined2) { + return defaultValue; + } + if (value !== undefined2) { + result2 = value; + } + if (other !== undefined2) { + if (result2 === undefined2) { + return other; + } + if (typeof value == "string" || typeof other == "string") { + value = baseToString(value); + other = baseToString(other); + } else { + value = baseToNumber(value); + other = baseToNumber(other); + } + result2 = operator(value, other); + } + return result2; + }; + } + function createOver(arrayFunc) { + return flatRest(function(iteratees) { + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + return baseRest(function(args) { + var thisArg = this; + return arrayFunc(iteratees, function(iteratee2) { + return apply(iteratee2, thisArg, args); + }); + }); + }); + } + function createPadding(length, chars) { + chars = chars === undefined2 ? " " : baseToString(chars); + var charsLength = chars.length; + if (charsLength < 2) { + return charsLength ? baseRepeat(chars, length) : chars; + } + var result2 = baseRepeat(chars, nativeCeil(length / stringSize(chars))); + return hasUnicode(chars) ? castSlice(stringToArray(result2), 0, length).join("") : result2.slice(0, length); + } + function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); + function wrapper() { + var argsIndex = -1, argsLength = arguments.length, leftIndex = -1, leftLength = partials.length, args = Array2(leftLength + argsLength), fn = this && this !== root && this instanceof wrapper ? Ctor : func; + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return apply(fn, isBind ? thisArg : this, args); + } + return wrapper; + } + function createRange(fromRight) { + return function(start, end, step) { + if (step && typeof step != "number" && isIterateeCall(start, end, step)) { + end = step = undefined2; + } + start = toFinite(start); + if (end === undefined2) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + step = step === undefined2 ? start < end ? 1 : -1 : toFinite(step); + return baseRange(start, end, step, fromRight); + }; + } + function createRelationalOperation(operator) { + return function(value, other) { + if (!(typeof value == "string" && typeof other == "string")) { + value = toNumber(value); + other = toNumber(other); + } + return operator(value, other); + }; + } + function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary2, arity) { + var isCurry = bitmask & WRAP_CURRY_FLAG, newHolders = isCurry ? holders : undefined2, newHoldersRight = isCurry ? undefined2 : holders, newPartials = isCurry ? partials : undefined2, newPartialsRight = isCurry ? undefined2 : partials; + bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG; + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); + } + var newData = [ + func, + bitmask, + thisArg, + newPartials, + newHolders, + newPartialsRight, + newHoldersRight, + argPos, + ary2, + arity + ]; + var result2 = wrapFunc.apply(undefined2, newData); + if (isLaziable(func)) { + setData(result2, newData); + } + result2.placeholder = placeholder; + return setWrapToString(result2, func, bitmask); + } + function createRound(methodName) { + var func = Math2[methodName]; + return function(number, precision) { + number = toNumber(number); + precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); + if (precision && nativeIsFinite(number)) { + var pair = (toString(number) + "e").split("e"), value = func(pair[0] + "e" + (+pair[1] + precision)); + pair = (toString(value) + "e").split("e"); + return +(pair[0] + "e" + (+pair[1] - precision)); + } + return func(number); + }; + } + var createSet = !(Set2 && 1 / setToArray(new Set2([, -0]))[1] == INFINITY) ? noop : function(values2) { + return new Set2(values2); + }; + function createToPairs(keysFunc) { + return function(object) { + var tag = getTag(object); + if (tag == mapTag) { + return mapToArray(object); + } + if (tag == setTag) { + return setToPairs(object); + } + return baseToPairs(object, keysFunc(object)); + }; + } + function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary2, arity) { + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; + if (!isBindKey && typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); + partials = holders = undefined2; + } + ary2 = ary2 === undefined2 ? ary2 : nativeMax(toInteger(ary2), 0); + arity = arity === undefined2 ? arity : toInteger(arity); + length -= holders ? holders.length : 0; + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, holdersRight = holders; + partials = holders = undefined2; + } + var data = isBindKey ? undefined2 : getData(func); + var newData = [ + func, + bitmask, + thisArg, + partials, + holders, + partialsRight, + holdersRight, + argPos, + ary2, + arity + ]; + if (data) { + mergeData(newData, data); + } + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] === undefined2 ? isBindKey ? 0 : func.length : nativeMax(newData[9] - length, 0); + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); + } + if (!bitmask || bitmask == WRAP_BIND_FLAG) { + var result2 = createBind(func, bitmask, thisArg); + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { + result2 = createCurry(func, bitmask, arity); + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { + result2 = createPartial(func, bitmask, thisArg, partials); + } else { + result2 = createHybrid.apply(undefined2, newData); + } + var setter = data ? baseSetData : setData; + return setWrapToString(setter(result2, newData), func, bitmask); + } + function customDefaultsAssignIn(objValue, srcValue, key, object) { + if (objValue === undefined2 || eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key)) { + return srcValue; + } + return objValue; + } + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined2, customDefaultsMerge, stack); + stack["delete"](srcValue); + } + return objValue; + } + function customOmitClone(value) { + return isPlainObject(value) ? undefined2 : value; + } + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length; + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + var arrStacked = stack.get(array); + var othStacked = stack.get(other); + if (arrStacked && othStacked) { + return arrStacked == other && othStacked == array; + } + var index = -1, result2 = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined2; + stack.set(array, other); + stack.set(other, array); + while (++index < arrLength) { + var arrValue = array[index], othValue = other[index]; + if (customizer) { + var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined2) { + if (compared) { + continue; + } + result2 = false; + break; + } + if (seen) { + if (!arraySome(other, function(othValue2, othIndex) { + if (!cacheHas(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result2 = false; + break; + } + } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + result2 = false; + break; + } + } + stack["delete"](array); + stack["delete"](other); + return result2; + } + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) { + return false; + } + object = object.buffer; + other = other.buffer; + case arrayBufferTag: + if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array2(object), new Uint8Array2(other))) { + return false; + } + return true; + case boolTag: + case dateTag: + case numberTag: + return eq(+object, +other); + case errorTag: + return object.name == other.name && object.message == other.message; + case regexpTag: + case stringTag: + return object == other + ""; + case mapTag: + var convert = mapToArray; + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = setToArray); + if (object.size != other.size && !isPartial) { + return false; + } + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG; + stack.set(object, other); + var result2 = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack["delete"](object); + return result2; + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; + } + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length; + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + var objStacked = stack.get(object); + var othStacked = stack.get(other); + if (objStacked && othStacked) { + return objStacked == other && othStacked == object; + } + var result2 = true; + stack.set(object, other); + stack.set(other, object); + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], othValue = other[key]; + if (customizer) { + var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack); + } + if (!(compared === undefined2 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) { + result2 = false; + break; + } + skipCtor || (skipCtor = key == "constructor"); + } + if (result2 && !skipCtor) { + var objCtor = object.constructor, othCtor = other.constructor; + if (objCtor != othCtor && ("constructor" in object && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) { + result2 = false; + } + } + stack["delete"](object); + stack["delete"](other); + return result2; + } + function flatRest(func) { + return setToString(overRest(func, undefined2, flatten), func + ""); + } + function getAllKeys(object) { + return baseGetAllKeys(object, keys, getSymbols); + } + function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); + } + var getData = !metaMap ? noop : function(func) { + return metaMap.get(func); + }; + function getFuncName(func) { + var result2 = func.name + "", array = realNames[result2], length = hasOwnProperty.call(realNames, result2) ? array.length : 0; + while (length--) { + var data = array[length], otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; + } + } + return result2; + } + function getHolder(func) { + var object = hasOwnProperty.call(lodash, "placeholder") ? lodash : func; + return object.placeholder; + } + function getIteratee() { + var result2 = lodash.iteratee || iteratee; + result2 = result2 === iteratee ? baseIteratee : result2; + return arguments.length ? result2(arguments[0], arguments[1]) : result2; + } + function getMapData(map2, key) { + var data = map2.__data__; + return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map; + } + function getMatchData(object) { + var result2 = keys(object), length = result2.length; + while (length--) { + var key = result2[length], value = object[key]; + result2[length] = [key, value, isStrictComparable(value)]; + } + return result2; + } + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined2; + } + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; + try { + value[symToStringTag] = undefined2; + var unmasked = true; + } catch (e) { + } + var result2 = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result2; + } + var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + if (object == null) { + return []; + } + object = Object2(object); + return arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); + }; + var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var result2 = []; + while (object) { + arrayPush(result2, getSymbols(object)); + object = getPrototype(object); + } + return result2; + }; + var getTag = baseGetTag; + if (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag || Map && getTag(new Map()) != mapTag || Promise2 && getTag(Promise2.resolve()) != promiseTag || Set2 && getTag(new Set2()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) { + getTag = function(value) { + var result2 = baseGetTag(value), Ctor = result2 == objectTag ? value.constructor : undefined2, ctorString = Ctor ? toSource(Ctor) : ""; + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: + return dataViewTag; + case mapCtorString: + return mapTag; + case promiseCtorString: + return promiseTag; + case setCtorString: + return setTag; + case weakMapCtorString: + return weakMapTag; + } + } + return result2; + }; + } + function getView(start, end, transforms) { + var index = -1, length = transforms.length; + while (++index < length) { + var data = transforms[index], size2 = data.size; + switch (data.type) { + case "drop": + start += size2; + break; + case "dropRight": + end -= size2; + break; + case "take": + end = nativeMin(end, start + size2); + break; + case "takeRight": + start = nativeMax(start, end - size2); + break; + } + } + return { "start": start, "end": end }; + } + function getWrapDetails(source) { + var match = source.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; + } + function hasPath(object, path, hasFunc) { + path = castPath(path, object); + var index = -1, length = path.length, result2 = false; + while (++index < length) { + var key = toKey(path[index]); + if (!(result2 = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result2 || ++index != length) { + return result2; + } + length = object == null ? 0 : object.length; + return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)); + } + function initCloneArray(array) { + var length = array.length, result2 = new array.constructor(length); + if (length && typeof array[0] == "string" && hasOwnProperty.call(array, "index")) { + result2.index = array.index; + result2.input = array.input; + } + return result2; + } + function initCloneObject(object) { + return typeof object.constructor == "function" && !isPrototype(object) ? baseCreate(getPrototype(object)) : {}; + } + function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); + case boolTag: + case dateTag: + return new Ctor(+object); + case dataViewTag: + return cloneDataView(object, isDeep); + case float32Tag: + case float64Tag: + case int8Tag: + case int16Tag: + case int32Tag: + case uint8Tag: + case uint8ClampedTag: + case uint16Tag: + case uint32Tag: + return cloneTypedArray(object, isDeep); + case mapTag: + return new Ctor(); + case numberTag: + case stringTag: + return new Ctor(object); + case regexpTag: + return cloneRegExp(object); + case setTag: + return new Ctor(); + case symbolTag: + return cloneSymbol(object); + } + } + function insertWrapDetails(source, details) { + var length = details.length; + if (!length) { + return source; + } + var lastIndex = length - 1; + details[lastIndex] = (length > 1 ? "& " : "") + details[lastIndex]; + details = details.join(length > 2 ? ", " : " "); + return source.replace(reWrapComment, "{\n/* [wrapped with " + details + "] */\n"); + } + function isFlattenable(value) { + return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]); + } + function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && (type == "number" || type != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length); + } + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == "number" ? isArrayLike(object) && isIndex(index, object.length) : type == "string" && index in object) { + return eq(object[index], value); + } + return false; + } + function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == "number" || type == "symbol" || type == "boolean" || value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object2(object); + } + function isKeyable(value) { + var type = typeof value; + return type == "string" || type == "number" || type == "symbol" || type == "boolean" ? value !== "__proto__" : value === null; + } + function isLaziable(func) { + var funcName = getFuncName(func), other = lodash[funcName]; + if (typeof other != "function" || !(funcName in LazyWrapper.prototype)) { + return false; + } + if (func === other) { + return true; + } + var data = getData(other); + return !!data && func === data[0]; + } + function isMasked(func) { + return !!maskSrcKey && maskSrcKey in func; + } + var isMaskable = coreJsData ? isFunction : stubFalse; + function isPrototype(value) { + var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto; + return value === proto; + } + function isStrictComparable(value) { + return value === value && !isObject(value); + } + function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && (srcValue !== undefined2 || key in Object2(object)); + }; + } + function memoizeCapped(func) { + var result2 = memoize(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + var cache = result2.cache; + return result2; + } + function mergeData(data, source) { + var bitmask = data[1], srcBitmask = source[1], newBitmask = bitmask | srcBitmask, isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); + var isCombo = srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_CURRY_FLAG || srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_REARG_FLAG && data[7].length <= source[8] || srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG) && source[7].length <= source[8] && bitmask == WRAP_CURRY_FLAG; + if (!(isCommon || isCombo)) { + return data; + } + if (srcBitmask & WRAP_BIND_FLAG) { + data[2] = source[2]; + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; + } + var value = source[3]; + if (value) { + var partials = data[3]; + data[3] = partials ? composeArgs(partials, value, source[4]) : value; + data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; + } + value = source[5]; + if (value) { + partials = data[5]; + data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; + data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; + } + value = source[7]; + if (value) { + data[7] = value; + } + if (srcBitmask & WRAP_ARY_FLAG) { + data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); + } + if (data[9] == null) { + data[9] = source[9]; + } + data[0] = source[0]; + data[1] = newBitmask; + return data; + } + function nativeKeysIn(object) { + var result2 = []; + if (object != null) { + for (var key in Object2(object)) { + result2.push(key); + } + } + return result2; + } + function objectToString(value) { + return nativeObjectToString.call(value); + } + function overRest(func, start, transform2) { + start = nativeMax(start === undefined2 ? func.length - 1 : start, 0); + return function() { + var args = arguments, index = -1, length = nativeMax(args.length - start, 0), array = Array2(length); + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array2(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform2(array); + return apply(func, this, otherArgs); + }; + } + function parent(object, path) { + return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); + } + function reorder(array, indexes) { + var arrLength = array.length, length = nativeMin(indexes.length, arrLength), oldArray = copyArray(array); + while (length--) { + var index = indexes[length]; + array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined2; + } + return array; + } + function safeGet(object, key) { + if (key === "constructor" && typeof object[key] === "function") { + return; + } + if (key == "__proto__") { + return; + } + return object[key]; + } + var setData = shortOut(baseSetData); + var setTimeout = ctxSetTimeout || function(func, wait) { + return root.setTimeout(func, wait); + }; + var setToString = shortOut(baseSetToString); + function setWrapToString(wrapper, reference, bitmask) { + var source = reference + ""; + return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); + } + function shortOut(func) { + var count = 0, lastCalled = 0; + return function() { + var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled); + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined2, arguments); + }; + } + function shuffleSelf(array, size2) { + var index = -1, length = array.length, lastIndex = length - 1; + size2 = size2 === undefined2 ? length : size2; + while (++index < size2) { + var rand = baseRandom(index, lastIndex), value = array[rand]; + array[rand] = array[index]; + array[index] = value; + } + array.length = size2; + return array; + } + var stringToPath = memoizeCapped(function(string) { + var result2 = []; + if (string.charCodeAt(0) === 46) { + result2.push(""); + } + string.replace(rePropName, function(match, number, quote, subString) { + result2.push(quote ? subString.replace(reEscapeChar, "$1") : number || match); + }); + return result2; + }); + function toKey(value) { + if (typeof value == "string" || isSymbol(value)) { + return value; + } + var result2 = value + ""; + return result2 == "0" && 1 / value == -INFINITY ? "-0" : result2; + } + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) { + } + try { + return func + ""; + } catch (e) { + } + } + return ""; + } + function updateWrapDetails(details, bitmask) { + arrayEach(wrapFlags, function(pair) { + var value = "_." + pair[0]; + if (bitmask & pair[1] && !arrayIncludes(details, value)) { + details.push(value); + } + }); + return details.sort(); + } + function wrapperClone(wrapper) { + if (wrapper instanceof LazyWrapper) { + return wrapper.clone(); + } + var result2 = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); + result2.__actions__ = copyArray(wrapper.__actions__); + result2.__index__ = wrapper.__index__; + result2.__values__ = wrapper.__values__; + return result2; + } + function chunk(array, size2, guard) { + if (guard ? isIterateeCall(array, size2, guard) : size2 === undefined2) { + size2 = 1; + } else { + size2 = nativeMax(toInteger(size2), 0); + } + var length = array == null ? 0 : array.length; + if (!length || size2 < 1) { + return []; + } + var index = 0, resIndex = 0, result2 = Array2(nativeCeil(length / size2)); + while (index < length) { + result2[resIndex++] = baseSlice(array, index, index += size2); + } + return result2; + } + function compact(array) { + var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result2 = []; + while (++index < length) { + var value = array[index]; + if (value) { + result2[resIndex++] = value; + } + } + return result2; + } + function concat() { + var length = arguments.length; + if (!length) { + return []; + } + var args = Array2(length - 1), array = arguments[0], index = length; + while (index--) { + args[index - 1] = arguments[index]; + } + return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); + } + var difference = baseRest(function(array, values2) { + return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true)) : []; + }); + var differenceBy = baseRest(function(array, values2) { + var iteratee2 = last(values2); + if (isArrayLikeObject(iteratee2)) { + iteratee2 = undefined2; + } + return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2)) : []; + }); + var differenceWith = baseRest(function(array, values2) { + var comparator = last(values2); + if (isArrayLikeObject(comparator)) { + comparator = undefined2; + } + return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true), undefined2, comparator) : []; + }); + function drop(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = guard || n === undefined2 ? 1 : toInteger(n); + return baseSlice(array, n < 0 ? 0 : n, length); + } + function dropRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = guard || n === undefined2 ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, 0, n < 0 ? 0 : n); + } + function dropRightWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true, true) : []; + } + function dropWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true) : []; + } + function fill(array, value, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (start && typeof start != "number" && isIterateeCall(array, value, start)) { + start = 0; + end = length; + } + return baseFill(array, value, start, end); + } + function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseFindIndex(array, getIteratee(predicate, 3), index); + } + function findLastIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length - 1; + if (fromIndex !== undefined2) { + index = toInteger(fromIndex); + index = fromIndex < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } + return baseFindIndex(array, getIteratee(predicate, 3), index, true); + } + function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; + } + function flattenDeep(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, INFINITY) : []; + } + function flattenDepth(array, depth) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + depth = depth === undefined2 ? 1 : toInteger(depth); + return baseFlatten(array, depth); + } + function fromPairs(pairs) { + var index = -1, length = pairs == null ? 0 : pairs.length, result2 = {}; + while (++index < length) { + var pair = pairs[index]; + result2[pair[0]] = pair[1]; + } + return result2; + } + function head(array) { + return array && array.length ? array[0] : undefined2; + } + function indexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseIndexOf(array, value, index); + } + function initial(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 0, -1) : []; + } + var intersection = baseRest(function(arrays) { + var mapped = arrayMap(arrays, castArrayLikeObject); + return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : []; + }); + var intersectionBy = baseRest(function(arrays) { + var iteratee2 = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject); + if (iteratee2 === last(mapped)) { + iteratee2 = undefined2; + } else { + mapped.pop(); + } + return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee2, 2)) : []; + }); + var intersectionWith = baseRest(function(arrays) { + var comparator = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject); + comparator = typeof comparator == "function" ? comparator : undefined2; + if (comparator) { + mapped.pop(); + } + return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : []; + }); + function join(array, separator) { + return array == null ? "" : nativeJoin.call(array, separator); + } + function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined2; + } + function lastIndexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length; + if (fromIndex !== undefined2) { + index = toInteger(fromIndex); + index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } + return value === value ? strictLastIndexOf(array, value, index) : baseFindIndex(array, baseIsNaN, index, true); + } + function nth(array, n) { + return array && array.length ? baseNth(array, toInteger(n)) : undefined2; + } + var pull = baseRest(pullAll); + function pullAll(array, values2) { + return array && array.length && values2 && values2.length ? basePullAll(array, values2) : array; + } + function pullAllBy(array, values2, iteratee2) { + return array && array.length && values2 && values2.length ? basePullAll(array, values2, getIteratee(iteratee2, 2)) : array; + } + function pullAllWith(array, values2, comparator) { + return array && array.length && values2 && values2.length ? basePullAll(array, values2, undefined2, comparator) : array; + } + var pullAt = flatRest(function(array, indexes) { + var length = array == null ? 0 : array.length, result2 = baseAt(array, indexes); + basePullAt(array, arrayMap(indexes, function(index) { + return isIndex(index, length) ? +index : index; + }).sort(compareAscending)); + return result2; + }); + function remove(array, predicate) { + var result2 = []; + if (!(array && array.length)) { + return result2; + } + var index = -1, indexes = [], length = array.length; + predicate = getIteratee(predicate, 3); + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result2.push(value); + indexes.push(index); + } + } + basePullAt(array, indexes); + return result2; + } + function reverse(array) { + return array == null ? array : nativeReverse.call(array); + } + function slice(array, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (end && typeof end != "number" && isIterateeCall(array, start, end)) { + start = 0; + end = length; + } else { + start = start == null ? 0 : toInteger(start); + end = end === undefined2 ? length : toInteger(end); + } + return baseSlice(array, start, end); + } + function sortedIndex(array, value) { + return baseSortedIndex(array, value); + } + function sortedIndexBy(array, value, iteratee2) { + return baseSortedIndexBy(array, value, getIteratee(iteratee2, 2)); + } + function sortedIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value); + if (index < length && eq(array[index], value)) { + return index; + } + } + return -1; + } + function sortedLastIndex(array, value) { + return baseSortedIndex(array, value, true); + } + function sortedLastIndexBy(array, value, iteratee2) { + return baseSortedIndexBy(array, value, getIteratee(iteratee2, 2), true); + } + function sortedLastIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value, true) - 1; + if (eq(array[index], value)) { + return index; + } + } + return -1; + } + function sortedUniq(array) { + return array && array.length ? baseSortedUniq(array) : []; + } + function sortedUniqBy(array, iteratee2) { + return array && array.length ? baseSortedUniq(array, getIteratee(iteratee2, 2)) : []; + } + function tail(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 1, length) : []; + } + function take(array, n, guard) { + if (!(array && array.length)) { + return []; + } + n = guard || n === undefined2 ? 1 : toInteger(n); + return baseSlice(array, 0, n < 0 ? 0 : n); + } + function takeRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = guard || n === undefined2 ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, n < 0 ? 0 : n, length); + } + function takeRightWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3), false, true) : []; + } + function takeWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3)) : []; + } + var union = baseRest(function(arrays) { + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); + }); + var unionBy = baseRest(function(arrays) { + var iteratee2 = last(arrays); + if (isArrayLikeObject(iteratee2)) { + iteratee2 = undefined2; + } + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2)); + }); + var unionWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == "function" ? comparator : undefined2; + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined2, comparator); + }); + function uniq(array) { + return array && array.length ? baseUniq(array) : []; + } + function uniqBy(array, iteratee2) { + return array && array.length ? baseUniq(array, getIteratee(iteratee2, 2)) : []; + } + function uniqWith(array, comparator) { + comparator = typeof comparator == "function" ? comparator : undefined2; + return array && array.length ? baseUniq(array, undefined2, comparator) : []; + } + function unzip(array) { + if (!(array && array.length)) { + return []; + } + var length = 0; + array = arrayFilter(array, function(group) { + if (isArrayLikeObject(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + return baseTimes(length, function(index) { + return arrayMap(array, baseProperty(index)); + }); + } + function unzipWith(array, iteratee2) { + if (!(array && array.length)) { + return []; + } + var result2 = unzip(array); + if (iteratee2 == null) { + return result2; + } + return arrayMap(result2, function(group) { + return apply(iteratee2, undefined2, group); + }); + } + var without = baseRest(function(array, values2) { + return isArrayLikeObject(array) ? baseDifference(array, values2) : []; + }); + var xor = baseRest(function(arrays) { + return baseXor(arrayFilter(arrays, isArrayLikeObject)); + }); + var xorBy = baseRest(function(arrays) { + var iteratee2 = last(arrays); + if (isArrayLikeObject(iteratee2)) { + iteratee2 = undefined2; + } + return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee2, 2)); + }); + var xorWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == "function" ? comparator : undefined2; + return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined2, comparator); + }); + var zip = baseRest(unzip); + function zipObject(props, values2) { + return baseZipObject(props || [], values2 || [], assignValue); + } + function zipObjectDeep(props, values2) { + return baseZipObject(props || [], values2 || [], baseSet); + } + var zipWith = baseRest(function(arrays) { + var length = arrays.length, iteratee2 = length > 1 ? arrays[length - 1] : undefined2; + iteratee2 = typeof iteratee2 == "function" ? (arrays.pop(), iteratee2) : undefined2; + return unzipWith(arrays, iteratee2); + }); + function chain(value) { + var result2 = lodash(value); + result2.__chain__ = true; + return result2; + } + function tap(value, interceptor) { + interceptor(value); + return value; + } + function thru(value, interceptor) { + return interceptor(value); + } + var wrapperAt = flatRest(function(paths) { + var length = paths.length, start = length ? paths[0] : 0, value = this.__wrapped__, interceptor = function(object) { + return baseAt(object, paths); + }; + if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start)) { + return this.thru(interceptor); + } + value = value.slice(start, +start + (length ? 1 : 0)); + value.__actions__.push({ + "func": thru, + "args": [interceptor], + "thisArg": undefined2 + }); + return new LodashWrapper(value, this.__chain__).thru(function(array) { + if (length && !array.length) { + array.push(undefined2); + } + return array; + }); + }); + function wrapperChain() { + return chain(this); + } + function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); + } + function wrapperNext() { + if (this.__values__ === undefined2) { + this.__values__ = toArray(this.value()); + } + var done = this.__index__ >= this.__values__.length, value = done ? undefined2 : this.__values__[this.__index__++]; + return { "done": done, "value": value }; + } + function wrapperToIterator() { + return this; + } + function wrapperPlant(value) { + var result2, parent2 = this; + while (parent2 instanceof baseLodash) { + var clone2 = wrapperClone(parent2); + clone2.__index__ = 0; + clone2.__values__ = undefined2; + if (result2) { + previous.__wrapped__ = clone2; + } else { + result2 = clone2; + } + var previous = clone2; + parent2 = parent2.__wrapped__; + } + previous.__wrapped__ = value; + return result2; + } + function wrapperReverse() { + var value = this.__wrapped__; + if (value instanceof LazyWrapper) { + var wrapped = value; + if (this.__actions__.length) { + wrapped = new LazyWrapper(this); + } + wrapped = wrapped.reverse(); + wrapped.__actions__.push({ + "func": thru, + "args": [reverse], + "thisArg": undefined2 + }); + return new LodashWrapper(wrapped, this.__chain__); + } + return this.thru(reverse); + } + function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); + } + var countBy = createAggregator(function(result2, value, key) { + if (hasOwnProperty.call(result2, key)) { + ++result2[key]; + } else { + baseAssignValue(result2, key, 1); + } + }); + function every(collection, predicate, guard) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined2; + } + return func(collection, getIteratee(predicate, 3)); + } + function filter(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, getIteratee(predicate, 3)); + } + var find = createFind(findIndex); + var findLast = createFind(findLastIndex); + function flatMap(collection, iteratee2) { + return baseFlatten(map(collection, iteratee2), 1); + } + function flatMapDeep(collection, iteratee2) { + return baseFlatten(map(collection, iteratee2), INFINITY); + } + function flatMapDepth(collection, iteratee2, depth) { + depth = depth === undefined2 ? 1 : toInteger(depth); + return baseFlatten(map(collection, iteratee2), depth); + } + function forEach(collection, iteratee2) { + var func = isArray(collection) ? arrayEach : baseEach; + return func(collection, getIteratee(iteratee2, 3)); + } + function forEachRight(collection, iteratee2) { + var func = isArray(collection) ? arrayEachRight : baseEachRight; + return func(collection, getIteratee(iteratee2, 3)); + } + var groupBy = createAggregator(function(result2, value, key) { + if (hasOwnProperty.call(result2, key)) { + result2[key].push(value); + } else { + baseAssignValue(result2, key, [value]); + } + }); + function includes(collection, value, fromIndex, guard) { + collection = isArrayLike(collection) ? collection : values(collection); + fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0; + var length = collection.length; + if (fromIndex < 0) { + fromIndex = nativeMax(length + fromIndex, 0); + } + return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1; + } + var invokeMap = baseRest(function(collection, path, args) { + var index = -1, isFunc = typeof path == "function", result2 = isArrayLike(collection) ? Array2(collection.length) : []; + baseEach(collection, function(value) { + result2[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); + }); + return result2; + }); + var keyBy = createAggregator(function(result2, value, key) { + baseAssignValue(result2, key, value); + }); + function map(collection, iteratee2) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, getIteratee(iteratee2, 3)); + } + function orderBy(collection, iteratees, orders, guard) { + if (collection == null) { + return []; + } + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; + } + orders = guard ? undefined2 : orders; + if (!isArray(orders)) { + orders = orders == null ? [] : [orders]; + } + return baseOrderBy(collection, iteratees, orders); + } + var partition = createAggregator(function(result2, value, key) { + result2[key ? 0 : 1].push(value); + }, function() { + return [[], []]; + }); + function reduce(collection, iteratee2, accumulator) { + var func = isArray(collection) ? arrayReduce : baseReduce, initAccum = arguments.length < 3; + return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEach); + } + function reduceRight(collection, iteratee2, accumulator) { + var func = isArray(collection) ? arrayReduceRight : baseReduce, initAccum = arguments.length < 3; + return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEachRight); + } + function reject(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, negate(getIteratee(predicate, 3))); + } + function sample(collection) { + var func = isArray(collection) ? arraySample : baseSample; + return func(collection); + } + function sampleSize(collection, n, guard) { + if (guard ? isIterateeCall(collection, n, guard) : n === undefined2) { + n = 1; + } else { + n = toInteger(n); + } + var func = isArray(collection) ? arraySampleSize : baseSampleSize; + return func(collection, n); + } + function shuffle(collection) { + var func = isArray(collection) ? arrayShuffle : baseShuffle; + return func(collection); + } + function size(collection) { + if (collection == null) { + return 0; + } + if (isArrayLike(collection)) { + return isString(collection) ? stringSize(collection) : collection.length; + } + var tag = getTag(collection); + if (tag == mapTag || tag == setTag) { + return collection.size; + } + return baseKeys(collection).length; + } + function some(collection, predicate, guard) { + var func = isArray(collection) ? arraySome : baseSome; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined2; + } + return func(collection, getIteratee(predicate, 3)); + } + var sortBy = baseRest(function(collection, iteratees) { + if (collection == null) { + return []; + } + var length = iteratees.length; + if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } + return baseOrderBy(collection, baseFlatten(iteratees, 1), []); + }); + var now = ctxNow || function() { + return root.Date.now(); + }; + function after(n, func) { + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; + } + function ary(func, n, guard) { + n = guard ? undefined2 : n; + n = func && n == null ? func.length : n; + return createWrap(func, WRAP_ARY_FLAG, undefined2, undefined2, undefined2, undefined2, n); + } + function before(n, func) { + var result2; + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n > 0) { + result2 = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined2; + } + return result2; + }; + } + var bind = baseRest(function(func, thisArg, partials) { + var bitmask = WRAP_BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bind)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(func, bitmask, thisArg, partials, holders); + }); + var bindKey = baseRest(function(object, key, partials) { + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bindKey)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(key, bitmask, object, partials, holders); + }); + function curry(func, arity, guard) { + arity = guard ? undefined2 : arity; + var result2 = createWrap(func, WRAP_CURRY_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity); + result2.placeholder = curry.placeholder; + return result2; + } + function curryRight(func, arity, guard) { + arity = guard ? undefined2 : arity; + var result2 = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity); + result2.placeholder = curryRight.placeholder; + return result2; + } + function debounce(func, wait, options) { + var lastArgs, lastThis, maxWait, result2, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true; + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + wait = toNumber(wait) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = "maxWait" in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = "trailing" in options ? !!options.trailing : trailing; + } + function invokeFunc(time) { + var args = lastArgs, thisArg = lastThis; + lastArgs = lastThis = undefined2; + lastInvokeTime = time; + result2 = func.apply(thisArg, args); + return result2; + } + function leadingEdge(time) { + lastInvokeTime = time; + timerId = setTimeout(timerExpired, wait); + return leading ? invokeFunc(time) : result2; + } + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall; + return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting; + } + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime; + return lastCallTime === undefined2 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait; + } + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + timerId = setTimeout(timerExpired, remainingWait(time)); + } + function trailingEdge(time) { + timerId = undefined2; + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined2; + return result2; + } + function cancel() { + if (timerId !== undefined2) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined2; + } + function flush() { + return timerId === undefined2 ? result2 : trailingEdge(now()); + } + function debounced() { + var time = now(), isInvoking = shouldInvoke(time); + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + if (isInvoking) { + if (timerId === undefined2) { + return leadingEdge(lastCallTime); + } + if (maxing) { + clearTimeout(timerId); + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined2) { + timerId = setTimeout(timerExpired, wait); + } + return result2; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; + } + var defer = baseRest(function(func, args) { + return baseDelay(func, 1, args); + }); + var delay = baseRest(function(func, wait, args) { + return baseDelay(func, toNumber(wait) || 0, args); + }); + function flip(func) { + return createWrap(func, WRAP_FLIP_FLAG); + } + function memoize(func, resolver) { + if (typeof func != "function" || resolver != null && typeof resolver != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache; + if (cache.has(key)) { + return cache.get(key); + } + var result2 = func.apply(this, args); + memoized.cache = cache.set(key, result2) || cache; + return result2; + }; + memoized.cache = new (memoize.Cache || MapCache)(); + return memoized; + } + memoize.Cache = MapCache; + function negate(predicate) { + if (typeof predicate != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + return function() { + var args = arguments; + switch (args.length) { + case 0: + return !predicate.call(this); + case 1: + return !predicate.call(this, args[0]); + case 2: + return !predicate.call(this, args[0], args[1]); + case 3: + return !predicate.call(this, args[0], args[1], args[2]); + } + return !predicate.apply(this, args); + }; + } + function once(func) { + return before(2, func); + } + var overArgs = castRest(function(func, transforms) { + transforms = transforms.length == 1 && isArray(transforms[0]) ? arrayMap(transforms[0], baseUnary(getIteratee())) : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); + var funcsLength = transforms.length; + return baseRest(function(args) { + var index = -1, length = nativeMin(args.length, funcsLength); + while (++index < length) { + args[index] = transforms[index].call(this, args[index]); + } + return apply(func, this, args); + }); + }); + var partial = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partial)); + return createWrap(func, WRAP_PARTIAL_FLAG, undefined2, partials, holders); + }); + var partialRight = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partialRight)); + return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined2, partials, holders); + }); + var rearg = flatRest(function(func, indexes) { + return createWrap(func, WRAP_REARG_FLAG, undefined2, undefined2, undefined2, indexes); + }); + function rest(func, start) { + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + start = start === undefined2 ? start : toInteger(start); + return baseRest(func, start); + } + function spread(func, start) { + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + start = start == null ? 0 : nativeMax(toInteger(start), 0); + return baseRest(function(args) { + var array = args[start], otherArgs = castSlice(args, 0, start); + if (array) { + arrayPush(otherArgs, array); + } + return apply(func, this, otherArgs); + }); + } + function throttle(func, wait, options) { + var leading = true, trailing = true; + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + if (isObject(options)) { + leading = "leading" in options ? !!options.leading : leading; + trailing = "trailing" in options ? !!options.trailing : trailing; + } + return debounce(func, wait, { + "leading": leading, + "maxWait": wait, + "trailing": trailing + }); + } + function unary(func) { + return ary(func, 1); + } + function wrap(value, wrapper) { + return partial(castFunction(wrapper), value); + } + function castArray() { + if (!arguments.length) { + return []; + } + var value = arguments[0]; + return isArray(value) ? value : [value]; + } + function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); + } + function cloneWith(value, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); + } + function cloneDeep(value) { + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); + } + function cloneDeepWith(value, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); + } + function conformsTo(object, source) { + return source == null || baseConformsTo(object, source, keys(source)); + } + function eq(value, other) { + return value === other || value !== value && other !== other; + } + var gt = createRelationalOperation(baseGt); + var gte = createRelationalOperation(function(value, other) { + return value >= other; + }); + var isArguments = baseIsArguments(/* @__PURE__ */ function() { + return arguments; + }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, "callee") && !propertyIsEnumerable.call(value, "callee"); + }; + var isArray = Array2.isArray; + var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } + function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); + } + function isBoolean(value) { + return value === true || value === false || isObjectLike(value) && baseGetTag(value) == boolTag; + } + var isBuffer = nativeIsBuffer || stubFalse; + var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; + function isElement(value) { + return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); + } + function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && (isArray(value) || typeof value == "string" || typeof value.splice == "function" || isBuffer(value) || isTypedArray(value) || isArguments(value))) { + return !value.length; + } + var tag = getTag(value); + if (tag == mapTag || tag == setTag) { + return !value.size; + } + if (isPrototype(value)) { + return !baseKeys(value).length; + } + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; + } + } + return true; + } + function isEqual(value, other) { + return baseIsEqual(value, other); + } + function isEqualWith(value, other, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + var result2 = customizer ? customizer(value, other) : undefined2; + return result2 === undefined2 ? baseIsEqual(value, other, undefined2, customizer) : !!result2; + } + function isError(value) { + if (!isObjectLike(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == errorTag || tag == domExcTag || typeof value.message == "string" && typeof value.name == "string" && !isPlainObject(value); + } + function isFinite2(value) { + return typeof value == "number" && nativeIsFinite(value); + } + function isFunction(value) { + if (!isObject(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + function isInteger(value) { + return typeof value == "number" && value == toInteger(value); + } + function isLength(value) { + return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + function isObject(value) { + var type = typeof value; + return value != null && (type == "object" || type == "function"); + } + function isObjectLike(value) { + return value != null && typeof value == "object"; + } + var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; + function isMatch(object, source) { + return object === source || baseIsMatch(object, source, getMatchData(source)); + } + function isMatchWith(object, source, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return baseIsMatch(object, source, getMatchData(source), customizer); + } + function isNaN2(value) { + return isNumber(value) && value != +value; + } + function isNative(value) { + if (isMaskable(value)) { + throw new Error2(CORE_ERROR_TEXT); + } + return baseIsNative(value); + } + function isNull(value) { + return value === null; + } + function isNil(value) { + return value == null; + } + function isNumber(value) { + return typeof value == "number" || isObjectLike(value) && baseGetTag(value) == numberTag; + } + function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, "constructor") && proto.constructor; + return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString; + } + var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; + function isSafeInteger(value) { + return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; + } + var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; + function isString(value) { + return typeof value == "string" || !isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag; + } + function isSymbol(value) { + return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag; + } + var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + function isUndefined(value) { + return value === undefined2; + } + function isWeakMap(value) { + return isObjectLike(value) && getTag(value) == weakMapTag; + } + function isWeakSet(value) { + return isObjectLike(value) && baseGetTag(value) == weakSetTag; + } + var lt = createRelationalOperation(baseLt); + var lte = createRelationalOperation(function(value, other) { + return value <= other; + }); + function toArray(value) { + if (!value) { + return []; + } + if (isArrayLike(value)) { + return isString(value) ? stringToArray(value) : copyArray(value); + } + if (symIterator && value[symIterator]) { + return iteratorToArray(value[symIterator]()); + } + var tag = getTag(value), func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values; + return func(value); + } + function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; + } + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = value < 0 ? -1 : 1; + return sign * MAX_INTEGER; + } + return value === value ? value : 0; + } + function toInteger(value) { + var result2 = toFinite(value), remainder = result2 % 1; + return result2 === result2 ? remainder ? result2 - remainder : result2 : 0; + } + function toLength(value) { + return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; + } + function toNumber(value) { + if (typeof value == "number") { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == "function" ? value.valueOf() : value; + value = isObject(other) ? other + "" : other; + } + if (typeof value != "string") { + return value === 0 ? value : +value; + } + value = baseTrim(value); + var isBinary = reIsBinary.test(value); + return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value; + } + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + function toSafeInteger(value) { + return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) : value === 0 ? value : 0; + } + function toString(value) { + return value == null ? "" : baseToString(value); + } + var assign = createAssigner(function(object, source) { + if (isPrototype(source) || isArrayLike(source)) { + copyObject(source, keys(source), object); + return; + } + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + assignValue(object, key, source[key]); + } + } + }); + var assignIn = createAssigner(function(object, source) { + copyObject(source, keysIn(source), object); + }); + var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keysIn(source), object, customizer); + }); + var assignWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keys(source), object, customizer); + }); + var at = flatRest(baseAt); + function create(prototype, properties) { + var result2 = baseCreate(prototype); + return properties == null ? result2 : baseAssign(result2, properties); + } + var defaults = baseRest(function(object, sources) { + object = Object2(object); + var index = -1; + var length = sources.length; + var guard = length > 2 ? sources[2] : undefined2; + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + length = 1; + } + while (++index < length) { + var source = sources[index]; + var props = keysIn(source); + var propsIndex = -1; + var propsLength = props.length; + while (++propsIndex < propsLength) { + var key = props[propsIndex]; + var value = object[key]; + if (value === undefined2 || eq(value, objectProto[key]) && !hasOwnProperty.call(object, key)) { + object[key] = source[key]; + } + } + } + return object; + }); + var defaultsDeep = baseRest(function(args) { + args.push(undefined2, customDefaultsMerge); + return apply(mergeWith, undefined2, args); + }); + function findKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); + } + function findLastKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); + } + function forIn(object, iteratee2) { + return object == null ? object : baseFor(object, getIteratee(iteratee2, 3), keysIn); + } + function forInRight(object, iteratee2) { + return object == null ? object : baseForRight(object, getIteratee(iteratee2, 3), keysIn); + } + function forOwn(object, iteratee2) { + return object && baseForOwn(object, getIteratee(iteratee2, 3)); + } + function forOwnRight(object, iteratee2) { + return object && baseForOwnRight(object, getIteratee(iteratee2, 3)); + } + function functions(object) { + return object == null ? [] : baseFunctions(object, keys(object)); + } + function functionsIn(object) { + return object == null ? [] : baseFunctions(object, keysIn(object)); + } + function get(object, path, defaultValue) { + var result2 = object == null ? undefined2 : baseGet(object, path); + return result2 === undefined2 ? defaultValue : result2; + } + function has(object, path) { + return object != null && hasPath(object, path, baseHas); + } + function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); + } + var invert = createInverter(function(result2, value, key) { + if (value != null && typeof value.toString != "function") { + value = nativeObjectToString.call(value); + } + result2[value] = key; + }, constant(identity)); + var invertBy = createInverter(function(result2, value, key) { + if (value != null && typeof value.toString != "function") { + value = nativeObjectToString.call(value); + } + if (hasOwnProperty.call(result2, value)) { + result2[value].push(key); + } else { + result2[value] = [key]; + } + }, getIteratee); + var invoke = baseRest(baseInvoke); + function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); + } + function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + } + function mapKeys(object, iteratee2) { + var result2 = {}; + iteratee2 = getIteratee(iteratee2, 3); + baseForOwn(object, function(value, key, object2) { + baseAssignValue(result2, iteratee2(value, key, object2), value); + }); + return result2; + } + function mapValues(object, iteratee2) { + var result2 = {}; + iteratee2 = getIteratee(iteratee2, 3); + baseForOwn(object, function(value, key, object2) { + baseAssignValue(result2, key, iteratee2(value, key, object2)); + }); + return result2; + } + var merge = createAssigner(function(object, source, srcIndex) { + baseMerge(object, source, srcIndex); + }); + var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); + var omit = flatRest(function(object, paths) { + var result2 = {}; + if (object == null) { + return result2; + } + var isDeep = false; + paths = arrayMap(paths, function(path) { + path = castPath(path, object); + isDeep || (isDeep = path.length > 1); + return path; + }); + copyObject(object, getAllKeysIn(object), result2); + if (isDeep) { + result2 = baseClone(result2, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); + } + var length = paths.length; + while (length--) { + baseUnset(result2, paths[length]); + } + return result2; + }); + function omitBy(object, predicate) { + return pickBy(object, negate(getIteratee(predicate))); + } + var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, paths); + }); + function pickBy(object, predicate) { + if (object == null) { + return {}; + } + var props = arrayMap(getAllKeysIn(object), function(prop) { + return [prop]; + }); + predicate = getIteratee(predicate); + return basePickBy(object, props, function(value, path) { + return predicate(value, path[0]); + }); + } + function result(object, path, defaultValue) { + path = castPath(path, object); + var index = -1, length = path.length; + if (!length) { + length = 1; + object = undefined2; + } + while (++index < length) { + var value = object == null ? undefined2 : object[toKey(path[index])]; + if (value === undefined2) { + index = length; + value = defaultValue; + } + object = isFunction(value) ? value.call(object) : value; + } + return object; + } + function set(object, path, value) { + return object == null ? object : baseSet(object, path, value); + } + function setWith(object, path, value, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return object == null ? object : baseSet(object, path, value, customizer); + } + var toPairs = createToPairs(keys); + var toPairsIn = createToPairs(keysIn); + function transform(object, iteratee2, accumulator) { + var isArr = isArray(object), isArrLike = isArr || isBuffer(object) || isTypedArray(object); + iteratee2 = getIteratee(iteratee2, 4); + if (accumulator == null) { + var Ctor = object && object.constructor; + if (isArrLike) { + accumulator = isArr ? new Ctor() : []; + } else if (isObject(object)) { + accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; + } else { + accumulator = {}; + } + } + (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object2) { + return iteratee2(accumulator, value, index, object2); + }); + return accumulator; + } + function unset(object, path) { + return object == null ? true : baseUnset(object, path); + } + function update(object, path, updater) { + return object == null ? object : baseUpdate(object, path, castFunction(updater)); + } + function updateWith(object, path, updater, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); + } + function values(object) { + return object == null ? [] : baseValues(object, keys(object)); + } + function valuesIn(object) { + return object == null ? [] : baseValues(object, keysIn(object)); + } + function clamp(number, lower, upper) { + if (upper === undefined2) { + upper = lower; + lower = undefined2; + } + if (upper !== undefined2) { + upper = toNumber(upper); + upper = upper === upper ? upper : 0; + } + if (lower !== undefined2) { + lower = toNumber(lower); + lower = lower === lower ? lower : 0; + } + return baseClamp(toNumber(number), lower, upper); + } + function inRange(number, start, end) { + start = toFinite(start); + if (end === undefined2) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + number = toNumber(number); + return baseInRange(number, start, end); + } + function random(lower, upper, floating) { + if (floating && typeof floating != "boolean" && isIterateeCall(lower, upper, floating)) { + upper = floating = undefined2; + } + if (floating === undefined2) { + if (typeof upper == "boolean") { + floating = upper; + upper = undefined2; + } else if (typeof lower == "boolean") { + floating = lower; + lower = undefined2; + } + } + if (lower === undefined2 && upper === undefined2) { + lower = 0; + upper = 1; + } else { + lower = toFinite(lower); + if (upper === undefined2) { + upper = lower; + lower = 0; + } else { + upper = toFinite(upper); + } + } + if (lower > upper) { + var temp = lower; + lower = upper; + upper = temp; + } + if (floating || lower % 1 || upper % 1) { + var rand = nativeRandom(); + return nativeMin(lower + rand * (upper - lower + freeParseFloat("1e-" + ((rand + "").length - 1))), upper); + } + return baseRandom(lower, upper); + } + var camelCase = createCompounder(function(result2, word, index) { + word = word.toLowerCase(); + return result2 + (index ? capitalize(word) : word); + }); + function capitalize(string) { + return upperFirst(toString(string).toLowerCase()); + } + function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ""); + } + function endsWith(string, target, position) { + string = toString(string); + target = baseToString(target); + var length = string.length; + position = position === undefined2 ? length : baseClamp(toInteger(position), 0, length); + var end = position; + position -= target.length; + return position >= 0 && string.slice(position, end) == target; + } + function escape(string) { + string = toString(string); + return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string; + } + function escapeRegExp(string) { + string = toString(string); + return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, "\\$&") : string; + } + var kebabCase = createCompounder(function(result2, word, index) { + return result2 + (index ? "-" : "") + word.toLowerCase(); + }); + var lowerCase = createCompounder(function(result2, word, index) { + return result2 + (index ? " " : "") + word.toLowerCase(); + }); + var lowerFirst = createCaseFirst("toLowerCase"); + function pad(string, length, chars) { + string = toString(string); + length = toInteger(length); + var strLength = length ? stringSize(string) : 0; + if (!length || strLength >= length) { + return string; + } + var mid = (length - strLength) / 2; + return createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars); + } + function padEnd(string, length, chars) { + string = toString(string); + length = toInteger(length); + var strLength = length ? stringSize(string) : 0; + return length && strLength < length ? string + createPadding(length - strLength, chars) : string; + } + function padStart(string, length, chars) { + string = toString(string); + length = toInteger(length); + var strLength = length ? stringSize(string) : 0; + return length && strLength < length ? createPadding(length - strLength, chars) + string : string; + } + function parseInt2(string, radix, guard) { + if (guard || radix == null) { + radix = 0; + } else if (radix) { + radix = +radix; + } + return nativeParseInt(toString(string).replace(reTrimStart, ""), radix || 0); + } + function repeat(string, n, guard) { + if (guard ? isIterateeCall(string, n, guard) : n === undefined2) { + n = 1; + } else { + n = toInteger(n); + } + return baseRepeat(toString(string), n); + } + function replace() { + var args = arguments, string = toString(args[0]); + return args.length < 3 ? string : string.replace(args[1], args[2]); + } + var snakeCase = createCompounder(function(result2, word, index) { + return result2 + (index ? "_" : "") + word.toLowerCase(); + }); + function split(string, separator, limit) { + if (limit && typeof limit != "number" && isIterateeCall(string, separator, limit)) { + separator = limit = undefined2; + } + limit = limit === undefined2 ? MAX_ARRAY_LENGTH : limit >>> 0; + if (!limit) { + return []; + } + string = toString(string); + if (string && (typeof separator == "string" || separator != null && !isRegExp(separator))) { + separator = baseToString(separator); + if (!separator && hasUnicode(string)) { + return castSlice(stringToArray(string), 0, limit); + } + } + return string.split(separator, limit); + } + var startCase = createCompounder(function(result2, word, index) { + return result2 + (index ? " " : "") + upperFirst(word); + }); + function startsWith(string, target, position) { + string = toString(string); + position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length); + target = baseToString(target); + return string.slice(position, position + target.length) == target; + } + function template(string, options, guard) { + var settings = lodash.templateSettings; + if (guard && isIterateeCall(string, options, guard)) { + options = undefined2; + } + string = toString(string); + options = assignInWith({}, options, settings, customDefaultsAssignIn); + var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn), importsKeys = keys(imports), importsValues = baseValues(imports, importsKeys); + var isEscaping, isEvaluating, index = 0, interpolate = options.interpolate || reNoMatch, source = "__p += '"; + var reDelimiters = RegExp2( + (options.escape || reNoMatch).source + "|" + interpolate.source + "|" + (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + "|" + (options.evaluate || reNoMatch).source + "|$", + "g" + ); + var sourceURL = "//# sourceURL=" + (hasOwnProperty.call(options, "sourceURL") ? (options.sourceURL + "").replace(/\s/g, " ") : "lodash.templateSources[" + ++templateCounter + "]") + "\n"; + string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) { + interpolateValue || (interpolateValue = esTemplateValue); + source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar); + if (escapeValue) { + isEscaping = true; + source += "' +\n__e(" + escapeValue + ") +\n'"; + } + if (evaluateValue) { + isEvaluating = true; + source += "';\n" + evaluateValue + ";\n__p += '"; + } + if (interpolateValue) { + source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'"; + } + index = offset + match.length; + return match; + }); + source += "';\n"; + var variable = hasOwnProperty.call(options, "variable") && options.variable; + if (!variable) { + source = "with (obj) {\n" + source + "\n}\n"; + } else if (reForbiddenIdentifierChars.test(variable)) { + throw new Error2(INVALID_TEMPL_VAR_ERROR_TEXT); + } + source = (isEvaluating ? source.replace(reEmptyStringLeading, "") : source).replace(reEmptyStringMiddle, "$1").replace(reEmptyStringTrailing, "$1;"); + source = "function(" + (variable || "obj") + ") {\n" + (variable ? "" : "obj || (obj = {});\n") + "var __t, __p = ''" + (isEscaping ? ", __e = _.escape" : "") + (isEvaluating ? ", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n" : ";\n") + source + "return __p\n}"; + var result2 = attempt(function() { + return Function2(importsKeys, sourceURL + "return " + source).apply(undefined2, importsValues); + }); + result2.source = source; + if (isError(result2)) { + throw result2; + } + return result2; + } + function toLower(value) { + return toString(value).toLowerCase(); + } + function toUpper(value) { + return toString(value).toUpperCase(); + } + function trim(string, chars, guard) { + string = toString(string); + if (string && (guard || chars === undefined2)) { + return baseTrim(string); + } + if (!string || !(chars = baseToString(chars))) { + return string; + } + var strSymbols = stringToArray(string), chrSymbols = stringToArray(chars), start = charsStartIndex(strSymbols, chrSymbols), end = charsEndIndex(strSymbols, chrSymbols) + 1; + return castSlice(strSymbols, start, end).join(""); + } + function trimEnd(string, chars, guard) { + string = toString(string); + if (string && (guard || chars === undefined2)) { + return string.slice(0, trimmedEndIndex(string) + 1); + } + if (!string || !(chars = baseToString(chars))) { + return string; + } + var strSymbols = stringToArray(string), end = charsEndIndex(strSymbols, stringToArray(chars)) + 1; + return castSlice(strSymbols, 0, end).join(""); + } + function trimStart(string, chars, guard) { + string = toString(string); + if (string && (guard || chars === undefined2)) { + return string.replace(reTrimStart, ""); + } + if (!string || !(chars = baseToString(chars))) { + return string; + } + var strSymbols = stringToArray(string), start = charsStartIndex(strSymbols, stringToArray(chars)); + return castSlice(strSymbols, start).join(""); + } + function truncate(string, options) { + var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION; + if (isObject(options)) { + var separator = "separator" in options ? options.separator : separator; + length = "length" in options ? toInteger(options.length) : length; + omission = "omission" in options ? baseToString(options.omission) : omission; + } + string = toString(string); + var strLength = string.length; + if (hasUnicode(string)) { + var strSymbols = stringToArray(string); + strLength = strSymbols.length; + } + if (length >= strLength) { + return string; + } + var end = length - stringSize(omission); + if (end < 1) { + return omission; + } + var result2 = strSymbols ? castSlice(strSymbols, 0, end).join("") : string.slice(0, end); + if (separator === undefined2) { + return result2 + omission; + } + if (strSymbols) { + end += result2.length - end; + } + if (isRegExp(separator)) { + if (string.slice(end).search(separator)) { + var match, substring = result2; + if (!separator.global) { + separator = RegExp2(separator.source, toString(reFlags.exec(separator)) + "g"); + } + separator.lastIndex = 0; + while (match = separator.exec(substring)) { + var newEnd = match.index; + } + result2 = result2.slice(0, newEnd === undefined2 ? end : newEnd); + } + } else if (string.indexOf(baseToString(separator), end) != end) { + var index = result2.lastIndexOf(separator); + if (index > -1) { + result2 = result2.slice(0, index); + } + } + return result2 + omission; + } + function unescape(string) { + string = toString(string); + return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar) : string; + } + var upperCase = createCompounder(function(result2, word, index) { + return result2 + (index ? " " : "") + word.toUpperCase(); + }); + var upperFirst = createCaseFirst("toUpperCase"); + function words(string, pattern, guard) { + string = toString(string); + pattern = guard ? undefined2 : pattern; + if (pattern === undefined2) { + return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string); + } + return string.match(pattern) || []; + } + var attempt = baseRest(function(func, args) { + try { + return apply(func, undefined2, args); + } catch (e) { + return isError(e) ? e : new Error2(e); + } + }); + var bindAll = flatRest(function(object, methodNames) { + arrayEach(methodNames, function(key) { + key = toKey(key); + baseAssignValue(object, key, bind(object[key], object)); + }); + return object; + }); + function cond(pairs) { + var length = pairs == null ? 0 : pairs.length, toIteratee = getIteratee(); + pairs = !length ? [] : arrayMap(pairs, function(pair) { + if (typeof pair[1] != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + return [toIteratee(pair[0]), pair[1]]; + }); + return baseRest(function(args) { + var index = -1; + while (++index < length) { + var pair = pairs[index]; + if (apply(pair[0], this, args)) { + return apply(pair[1], this, args); + } + } + }); + } + function conforms(source) { + return baseConforms(baseClone(source, CLONE_DEEP_FLAG)); + } + function constant(value) { + return function() { + return value; + }; + } + function defaultTo(value, defaultValue) { + return value == null || value !== value ? defaultValue : value; + } + var flow = createFlow(); + var flowRight = createFlow(true); + function identity(value) { + return value; + } + function iteratee(func) { + return baseIteratee(typeof func == "function" ? func : baseClone(func, CLONE_DEEP_FLAG)); + } + function matches(source) { + return baseMatches(baseClone(source, CLONE_DEEP_FLAG)); + } + function matchesProperty(path, srcValue) { + return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG)); + } + var method = baseRest(function(path, args) { + return function(object) { + return baseInvoke(object, path, args); + }; + }); + var methodOf = baseRest(function(object, args) { + return function(path) { + return baseInvoke(object, path, args); + }; + }); + function mixin(object, source, options) { + var props = keys(source), methodNames = baseFunctions(source, props); + if (options == null && !(isObject(source) && (methodNames.length || !props.length))) { + options = source; + source = object; + object = this; + methodNames = baseFunctions(source, keys(source)); + } + var chain2 = !(isObject(options) && "chain" in options) || !!options.chain, isFunc = isFunction(object); + arrayEach(methodNames, function(methodName) { + var func = source[methodName]; + object[methodName] = func; + if (isFunc) { + object.prototype[methodName] = function() { + var chainAll = this.__chain__; + if (chain2 || chainAll) { + var result2 = object(this.__wrapped__), actions = result2.__actions__ = copyArray(this.__actions__); + actions.push({ "func": func, "args": arguments, "thisArg": object }); + result2.__chain__ = chainAll; + return result2; + } + return func.apply(object, arrayPush([this.value()], arguments)); + }; + } + }); + return object; + } + function noConflict() { + if (root._ === this) { + root._ = oldDash; + } + return this; + } + function noop() { + } + function nthArg(n) { + n = toInteger(n); + return baseRest(function(args) { + return baseNth(args, n); + }); + } + var over = createOver(arrayMap); + var overEvery = createOver(arrayEvery); + var overSome = createOver(arraySome); + function property(path) { + return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); + } + function propertyOf(object) { + return function(path) { + return object == null ? undefined2 : baseGet(object, path); + }; + } + var range = createRange(); + var rangeRight = createRange(true); + function stubArray() { + return []; + } + function stubFalse() { + return false; + } + function stubObject() { + return {}; + } + function stubString() { + return ""; + } + function stubTrue() { + return true; + } + function times(n, iteratee2) { + n = toInteger(n); + if (n < 1 || n > MAX_SAFE_INTEGER) { + return []; + } + var index = MAX_ARRAY_LENGTH, length = nativeMin(n, MAX_ARRAY_LENGTH); + iteratee2 = getIteratee(iteratee2); + n -= MAX_ARRAY_LENGTH; + var result2 = baseTimes(length, iteratee2); + while (++index < n) { + iteratee2(index); + } + return result2; + } + function toPath(value) { + if (isArray(value)) { + return arrayMap(value, toKey); + } + return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value))); + } + function uniqueId(prefix) { + var id = ++idCounter; + return toString(prefix) + id; + } + var add = createMathOperation(function(augend, addend) { + return augend + addend; + }, 0); + var ceil = createRound("ceil"); + var divide = createMathOperation(function(dividend, divisor) { + return dividend / divisor; + }, 1); + var floor = createRound("floor"); + function max(array) { + return array && array.length ? baseExtremum(array, identity, baseGt) : undefined2; + } + function maxBy(array, iteratee2) { + return array && array.length ? baseExtremum(array, getIteratee(iteratee2, 2), baseGt) : undefined2; + } + function mean(array) { + return baseMean(array, identity); + } + function meanBy(array, iteratee2) { + return baseMean(array, getIteratee(iteratee2, 2)); + } + function min(array) { + return array && array.length ? baseExtremum(array, identity, baseLt) : undefined2; + } + function minBy(array, iteratee2) { + return array && array.length ? baseExtremum(array, getIteratee(iteratee2, 2), baseLt) : undefined2; + } + var multiply = createMathOperation(function(multiplier, multiplicand) { + return multiplier * multiplicand; + }, 1); + var round = createRound("round"); + var subtract = createMathOperation(function(minuend, subtrahend) { + return minuend - subtrahend; + }, 0); + function sum(array) { + return array && array.length ? baseSum(array, identity) : 0; + } + function sumBy(array, iteratee2) { + return array && array.length ? baseSum(array, getIteratee(iteratee2, 2)) : 0; + } + lodash.after = after; + lodash.ary = ary; + lodash.assign = assign; + lodash.assignIn = assignIn; + lodash.assignInWith = assignInWith; + lodash.assignWith = assignWith; + lodash.at = at; + lodash.before = before; + lodash.bind = bind; + lodash.bindAll = bindAll; + lodash.bindKey = bindKey; + lodash.castArray = castArray; + lodash.chain = chain; + lodash.chunk = chunk; + lodash.compact = compact; + lodash.concat = concat; + lodash.cond = cond; + lodash.conforms = conforms; + lodash.constant = constant; + lodash.countBy = countBy; + lodash.create = create; + lodash.curry = curry; + lodash.curryRight = curryRight; + lodash.debounce = debounce; + lodash.defaults = defaults; + lodash.defaultsDeep = defaultsDeep; + lodash.defer = defer; + lodash.delay = delay; + lodash.difference = difference; + lodash.differenceBy = differenceBy; + lodash.differenceWith = differenceWith; + lodash.drop = drop; + lodash.dropRight = dropRight; + lodash.dropRightWhile = dropRightWhile; + lodash.dropWhile = dropWhile; + lodash.fill = fill; + lodash.filter = filter; + lodash.flatMap = flatMap; + lodash.flatMapDeep = flatMapDeep; + lodash.flatMapDepth = flatMapDepth; + lodash.flatten = flatten; + lodash.flattenDeep = flattenDeep; + lodash.flattenDepth = flattenDepth; + lodash.flip = flip; + lodash.flow = flow; + lodash.flowRight = flowRight; + lodash.fromPairs = fromPairs; + lodash.functions = functions; + lodash.functionsIn = functionsIn; + lodash.groupBy = groupBy; + lodash.initial = initial; + lodash.intersection = intersection; + lodash.intersectionBy = intersectionBy; + lodash.intersectionWith = intersectionWith; + lodash.invert = invert; + lodash.invertBy = invertBy; + lodash.invokeMap = invokeMap; + lodash.iteratee = iteratee; + lodash.keyBy = keyBy; + lodash.keys = keys; + lodash.keysIn = keysIn; + lodash.map = map; + lodash.mapKeys = mapKeys; + lodash.mapValues = mapValues; + lodash.matches = matches; + lodash.matchesProperty = matchesProperty; + lodash.memoize = memoize; + lodash.merge = merge; + lodash.mergeWith = mergeWith; + lodash.method = method; + lodash.methodOf = methodOf; + lodash.mixin = mixin; + lodash.negate = negate; + lodash.nthArg = nthArg; + lodash.omit = omit; + lodash.omitBy = omitBy; + lodash.once = once; + lodash.orderBy = orderBy; + lodash.over = over; + lodash.overArgs = overArgs; + lodash.overEvery = overEvery; + lodash.overSome = overSome; + lodash.partial = partial; + lodash.partialRight = partialRight; + lodash.partition = partition; + lodash.pick = pick; + lodash.pickBy = pickBy; + lodash.property = property; + lodash.propertyOf = propertyOf; + lodash.pull = pull; + lodash.pullAll = pullAll; + lodash.pullAllBy = pullAllBy; + lodash.pullAllWith = pullAllWith; + lodash.pullAt = pullAt; + lodash.range = range; + lodash.rangeRight = rangeRight; + lodash.rearg = rearg; + lodash.reject = reject; + lodash.remove = remove; + lodash.rest = rest; + lodash.reverse = reverse; + lodash.sampleSize = sampleSize; + lodash.set = set; + lodash.setWith = setWith; + lodash.shuffle = shuffle; + lodash.slice = slice; + lodash.sortBy = sortBy; + lodash.sortedUniq = sortedUniq; + lodash.sortedUniqBy = sortedUniqBy; + lodash.split = split; + lodash.spread = spread; + lodash.tail = tail; + lodash.take = take; + lodash.takeRight = takeRight; + lodash.takeRightWhile = takeRightWhile; + lodash.takeWhile = takeWhile; + lodash.tap = tap; + lodash.throttle = throttle; + lodash.thru = thru; + lodash.toArray = toArray; + lodash.toPairs = toPairs; + lodash.toPairsIn = toPairsIn; + lodash.toPath = toPath; + lodash.toPlainObject = toPlainObject; + lodash.transform = transform; + lodash.unary = unary; + lodash.union = union; + lodash.unionBy = unionBy; + lodash.unionWith = unionWith; + lodash.uniq = uniq; + lodash.uniqBy = uniqBy; + lodash.uniqWith = uniqWith; + lodash.unset = unset; + lodash.unzip = unzip; + lodash.unzipWith = unzipWith; + lodash.update = update; + lodash.updateWith = updateWith; + lodash.values = values; + lodash.valuesIn = valuesIn; + lodash.without = without; + lodash.words = words; + lodash.wrap = wrap; + lodash.xor = xor; + lodash.xorBy = xorBy; + lodash.xorWith = xorWith; + lodash.zip = zip; + lodash.zipObject = zipObject; + lodash.zipObjectDeep = zipObjectDeep; + lodash.zipWith = zipWith; + lodash.entries = toPairs; + lodash.entriesIn = toPairsIn; + lodash.extend = assignIn; + lodash.extendWith = assignInWith; + mixin(lodash, lodash); + lodash.add = add; + lodash.attempt = attempt; + lodash.camelCase = camelCase; + lodash.capitalize = capitalize; + lodash.ceil = ceil; + lodash.clamp = clamp; + lodash.clone = clone; + lodash.cloneDeep = cloneDeep; + lodash.cloneDeepWith = cloneDeepWith; + lodash.cloneWith = cloneWith; + lodash.conformsTo = conformsTo; + lodash.deburr = deburr; + lodash.defaultTo = defaultTo; + lodash.divide = divide; + lodash.endsWith = endsWith; + lodash.eq = eq; + lodash.escape = escape; + lodash.escapeRegExp = escapeRegExp; + lodash.every = every; + lodash.find = find; + lodash.findIndex = findIndex; + lodash.findKey = findKey; + lodash.findLast = findLast; + lodash.findLastIndex = findLastIndex; + lodash.findLastKey = findLastKey; + lodash.floor = floor; + lodash.forEach = forEach; + lodash.forEachRight = forEachRight; + lodash.forIn = forIn; + lodash.forInRight = forInRight; + lodash.forOwn = forOwn; + lodash.forOwnRight = forOwnRight; + lodash.get = get; + lodash.gt = gt; + lodash.gte = gte; + lodash.has = has; + lodash.hasIn = hasIn; + lodash.head = head; + lodash.identity = identity; + lodash.includes = includes; + lodash.indexOf = indexOf; + lodash.inRange = inRange; + lodash.invoke = invoke; + lodash.isArguments = isArguments; + lodash.isArray = isArray; + lodash.isArrayBuffer = isArrayBuffer; + lodash.isArrayLike = isArrayLike; + lodash.isArrayLikeObject = isArrayLikeObject; + lodash.isBoolean = isBoolean; + lodash.isBuffer = isBuffer; + lodash.isDate = isDate; + lodash.isElement = isElement; + lodash.isEmpty = isEmpty; + lodash.isEqual = isEqual; + lodash.isEqualWith = isEqualWith; + lodash.isError = isError; + lodash.isFinite = isFinite2; + lodash.isFunction = isFunction; + lodash.isInteger = isInteger; + lodash.isLength = isLength; + lodash.isMap = isMap; + lodash.isMatch = isMatch; + lodash.isMatchWith = isMatchWith; + lodash.isNaN = isNaN2; + lodash.isNative = isNative; + lodash.isNil = isNil; + lodash.isNull = isNull; + lodash.isNumber = isNumber; + lodash.isObject = isObject; + lodash.isObjectLike = isObjectLike; + lodash.isPlainObject = isPlainObject; + lodash.isRegExp = isRegExp; + lodash.isSafeInteger = isSafeInteger; + lodash.isSet = isSet; + lodash.isString = isString; + lodash.isSymbol = isSymbol; + lodash.isTypedArray = isTypedArray; + lodash.isUndefined = isUndefined; + lodash.isWeakMap = isWeakMap; + lodash.isWeakSet = isWeakSet; + lodash.join = join; + lodash.kebabCase = kebabCase; + lodash.last = last; + lodash.lastIndexOf = lastIndexOf; + lodash.lowerCase = lowerCase; + lodash.lowerFirst = lowerFirst; + lodash.lt = lt; + lodash.lte = lte; + lodash.max = max; + lodash.maxBy = maxBy; + lodash.mean = mean; + lodash.meanBy = meanBy; + lodash.min = min; + lodash.minBy = minBy; + lodash.stubArray = stubArray; + lodash.stubFalse = stubFalse; + lodash.stubObject = stubObject; + lodash.stubString = stubString; + lodash.stubTrue = stubTrue; + lodash.multiply = multiply; + lodash.nth = nth; + lodash.noConflict = noConflict; + lodash.noop = noop; + lodash.now = now; + lodash.pad = pad; + lodash.padEnd = padEnd; + lodash.padStart = padStart; + lodash.parseInt = parseInt2; + lodash.random = random; + lodash.reduce = reduce; + lodash.reduceRight = reduceRight; + lodash.repeat = repeat; + lodash.replace = replace; + lodash.result = result; + lodash.round = round; + lodash.runInContext = runInContext2; + lodash.sample = sample; + lodash.size = size; + lodash.snakeCase = snakeCase; + lodash.some = some; + lodash.sortedIndex = sortedIndex; + lodash.sortedIndexBy = sortedIndexBy; + lodash.sortedIndexOf = sortedIndexOf; + lodash.sortedLastIndex = sortedLastIndex; + lodash.sortedLastIndexBy = sortedLastIndexBy; + lodash.sortedLastIndexOf = sortedLastIndexOf; + lodash.startCase = startCase; + lodash.startsWith = startsWith; + lodash.subtract = subtract; + lodash.sum = sum; + lodash.sumBy = sumBy; + lodash.template = template; + lodash.times = times; + lodash.toFinite = toFinite; + lodash.toInteger = toInteger; + lodash.toLength = toLength; + lodash.toLower = toLower; + lodash.toNumber = toNumber; + lodash.toSafeInteger = toSafeInteger; + lodash.toString = toString; + lodash.toUpper = toUpper; + lodash.trim = trim; + lodash.trimEnd = trimEnd; + lodash.trimStart = trimStart; + lodash.truncate = truncate; + lodash.unescape = unescape; + lodash.uniqueId = uniqueId; + lodash.upperCase = upperCase; + lodash.upperFirst = upperFirst; + lodash.each = forEach; + lodash.eachRight = forEachRight; + lodash.first = head; + mixin(lodash, function() { + var source = {}; + baseForOwn(lodash, function(func, methodName) { + if (!hasOwnProperty.call(lodash.prototype, methodName)) { + source[methodName] = func; + } + }); + return source; + }(), { "chain": false }); + lodash.VERSION = VERSION; + arrayEach(["bind", "bindKey", "curry", "curryRight", "partial", "partialRight"], function(methodName) { + lodash[methodName].placeholder = lodash; + }); + arrayEach(["drop", "take"], function(methodName, index) { + LazyWrapper.prototype[methodName] = function(n) { + n = n === undefined2 ? 1 : nativeMax(toInteger(n), 0); + var result2 = this.__filtered__ && !index ? new LazyWrapper(this) : this.clone(); + if (result2.__filtered__) { + result2.__takeCount__ = nativeMin(n, result2.__takeCount__); + } else { + result2.__views__.push({ + "size": nativeMin(n, MAX_ARRAY_LENGTH), + "type": methodName + (result2.__dir__ < 0 ? "Right" : "") + }); + } + return result2; + }; + LazyWrapper.prototype[methodName + "Right"] = function(n) { + return this.reverse()[methodName](n).reverse(); + }; + }); + arrayEach(["filter", "map", "takeWhile"], function(methodName, index) { + var type = index + 1, isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG; + LazyWrapper.prototype[methodName] = function(iteratee2) { + var result2 = this.clone(); + result2.__iteratees__.push({ + "iteratee": getIteratee(iteratee2, 3), + "type": type + }); + result2.__filtered__ = result2.__filtered__ || isFilter; + return result2; + }; + }); + arrayEach(["head", "last"], function(methodName, index) { + var takeName = "take" + (index ? "Right" : ""); + LazyWrapper.prototype[methodName] = function() { + return this[takeName](1).value()[0]; + }; + }); + arrayEach(["initial", "tail"], function(methodName, index) { + var dropName = "drop" + (index ? "" : "Right"); + LazyWrapper.prototype[methodName] = function() { + return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1); + }; + }); + LazyWrapper.prototype.compact = function() { + return this.filter(identity); + }; + LazyWrapper.prototype.find = function(predicate) { + return this.filter(predicate).head(); + }; + LazyWrapper.prototype.findLast = function(predicate) { + return this.reverse().find(predicate); + }; + LazyWrapper.prototype.invokeMap = baseRest(function(path, args) { + if (typeof path == "function") { + return new LazyWrapper(this); + } + return this.map(function(value) { + return baseInvoke(value, path, args); + }); + }); + LazyWrapper.prototype.reject = function(predicate) { + return this.filter(negate(getIteratee(predicate))); + }; + LazyWrapper.prototype.slice = function(start, end) { + start = toInteger(start); + var result2 = this; + if (result2.__filtered__ && (start > 0 || end < 0)) { + return new LazyWrapper(result2); + } + if (start < 0) { + result2 = result2.takeRight(-start); + } else if (start) { + result2 = result2.drop(start); + } + if (end !== undefined2) { + end = toInteger(end); + result2 = end < 0 ? result2.dropRight(-end) : result2.take(end - start); + } + return result2; + }; + LazyWrapper.prototype.takeRightWhile = function(predicate) { + return this.reverse().takeWhile(predicate).reverse(); + }; + LazyWrapper.prototype.toArray = function() { + return this.take(MAX_ARRAY_LENGTH); + }; + baseForOwn(LazyWrapper.prototype, function(func, methodName) { + var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName), isTaker = /^(?:head|last)$/.test(methodName), lodashFunc = lodash[isTaker ? "take" + (methodName == "last" ? "Right" : "") : methodName], retUnwrapped = isTaker || /^find/.test(methodName); + if (!lodashFunc) { + return; + } + lodash.prototype[methodName] = function() { + var value = this.__wrapped__, args = isTaker ? [1] : arguments, isLazy = value instanceof LazyWrapper, iteratee2 = args[0], useLazy = isLazy || isArray(value); + var interceptor = function(value2) { + var result3 = lodashFunc.apply(lodash, arrayPush([value2], args)); + return isTaker && chainAll ? result3[0] : result3; + }; + if (useLazy && checkIteratee && typeof iteratee2 == "function" && iteratee2.length != 1) { + isLazy = useLazy = false; + } + var chainAll = this.__chain__, isHybrid = !!this.__actions__.length, isUnwrapped = retUnwrapped && !chainAll, onlyLazy = isLazy && !isHybrid; + if (!retUnwrapped && useLazy) { + value = onlyLazy ? value : new LazyWrapper(this); + var result2 = func.apply(value, args); + result2.__actions__.push({ "func": thru, "args": [interceptor], "thisArg": undefined2 }); + return new LodashWrapper(result2, chainAll); + } + if (isUnwrapped && onlyLazy) { + return func.apply(this, args); + } + result2 = this.thru(interceptor); + return isUnwrapped ? isTaker ? result2.value()[0] : result2.value() : result2; + }; + }); + arrayEach(["pop", "push", "shift", "sort", "splice", "unshift"], function(methodName) { + var func = arrayProto[methodName], chainName = /^(?:push|sort|unshift)$/.test(methodName) ? "tap" : "thru", retUnwrapped = /^(?:pop|shift)$/.test(methodName); + lodash.prototype[methodName] = function() { + var args = arguments; + if (retUnwrapped && !this.__chain__) { + var value = this.value(); + return func.apply(isArray(value) ? value : [], args); + } + return this[chainName](function(value2) { + return func.apply(isArray(value2) ? value2 : [], args); + }); + }; + }); + baseForOwn(LazyWrapper.prototype, function(func, methodName) { + var lodashFunc = lodash[methodName]; + if (lodashFunc) { + var key = lodashFunc.name + ""; + if (!hasOwnProperty.call(realNames, key)) { + realNames[key] = []; + } + realNames[key].push({ "name": methodName, "func": lodashFunc }); + } + }); + realNames[createHybrid(undefined2, WRAP_BIND_KEY_FLAG).name] = [{ + "name": "wrapper", + "func": undefined2 + }]; + LazyWrapper.prototype.clone = lazyClone; + LazyWrapper.prototype.reverse = lazyReverse; + LazyWrapper.prototype.value = lazyValue; + lodash.prototype.at = wrapperAt; + lodash.prototype.chain = wrapperChain; + lodash.prototype.commit = wrapperCommit; + lodash.prototype.next = wrapperNext; + lodash.prototype.plant = wrapperPlant; + lodash.prototype.reverse = wrapperReverse; + lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue; + lodash.prototype.first = lodash.prototype.head; + if (symIterator) { + lodash.prototype[symIterator] = wrapperToIterator; + } + return lodash; + }; + var _ = runInContext(); + if (typeof define == "function" && typeof define.amd == "object" && define.amd) { + root._ = _; + define(function() { + return _; + }); + } else if (freeModule) { + (freeModule.exports = _)._ = _; + freeExports._ = _; + } else { + root._ = _; + } + }).call(exports); + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/calc/results.js +var require_results = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/calc/results.js"(exports) { + "use strict"; + var __importDefault = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.Value = exports.Arity = exports.FloatOrMilliseconds = void 0; + var decimal_js_1 = __importDefault(require_decimal()); + var lodash_1 = require_lodash(); + var datetimeRe = new RegExp("[1-9][0-9]{3}-[01][0-9]-[0-3][0-9][T ][0-2][0-9]:[0-5][0-9]"); + var durationRe = new RegExp("^-?[0-9]+:[0-5][0-9]"); + var FloatOrMilliseconds = (value) => { + const v = value.trim(); + if (v === "") { + return new decimal_js_1.default(0); + } + if (datetimeRe.test(v)) { + return new decimal_js_1.default(new Date(v).valueOf()); + } + if (durationRe.test(v)) { + const neg = v.charAt(0) == "-"; + const w = v.slice(neg ? 1 : 0); + const minutes = parseInt(w.slice(0, -3)) * 60 + parseInt(w.slice(-2)); + return new decimal_js_1.default((neg ? -1 : 1) * minutes * 6e4); + } + const decimalValue = new decimal_js_1.default(v); + return decimalValue.isNaN() ? new decimal_js_1.default(0) : decimalValue; + }; + exports.FloatOrMilliseconds = FloatOrMilliseconds; + var Arity = class { + constructor(rows, columns) { + this.isRow = () => this.rows > 1 && this.cols === 1; + this.isColumn = () => this.rows === 1 && this.cols > 1; + this.isCell = () => this.rows === 1 && this.cols === 1; + this.rows = rows; + this.cols = columns; + } + }; + exports.Arity = Arity; + var Value = class { + constructor(val) { + this.get = (row, column) => this.val[row][column]; + this.getAsNumber = (row, column) => { + const value = this.get(row, column); + return (0, exports.FloatOrMilliseconds)(value); + }; + this.getArity = () => { + const maxCols = this.val.reduce((max, currentRow) => Math.max(max, currentRow.length), 0); + return new Arity(this.val.length, maxCols); + }; + this.toString = () => { + if (this.getArity().isCell()) { + return this.get(0, 0); + } + return `[${(0, lodash_1.flatten)(this.val).map((val2) => val2.trim()).filter((val2) => val2 !== "").join(", ")}]`; + }; + this.val = val; + } + }; + exports.Value = Value; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/calc/algebraic_operation.js +var require_algebraic_operation = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/calc/algebraic_operation.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.AlgebraicOperation = void 0; + var neverthrow_1 = require_neverthrow(); + var ast_utils_1 = require_ast_utils(); + var calc_1 = require_calc(); + var results_1 = require_results(); + var lodash_1 = require_lodash(); + var AlgebraicOperation = class { + constructor(ast, table) { + this.getValue = (table2, cell) => { + switch (this.operator) { + case "+": + return this.add(table2, cell); + case "-": + return this.subtract(table2, cell); + case "*": + return this.multiply(table2, cell); + case "/": + return this.divide(table2, cell); + default: + return (0, neverthrow_1.err)(Error("Invalid algbraic operator: " + this.operator)); + } + }; + this.withCellAndRange = (table2, cell, name, canHaveRightRange, fn) => { + const leftValue = this.leftSource.getValue(table2, cell); + if (leftValue.isErr()) { + return (0, neverthrow_1.err)(leftValue.error); + } + const rightValue = this.rightSource.getValue(table2, cell); + if (rightValue.isErr()) { + return (0, neverthrow_1.err)(rightValue.error); + } + const leftArity = leftValue.value.getArity(); + const rightArity = rightValue.value.getArity(); + if (!rightArity.isCell() && !leftArity.isCell()) { + return (0, neverthrow_1.err)(Error(`At least one operand in algebraic "${name}" must be a single cell.`)); + } + if (!rightArity.isCell() && !canHaveRightRange) { + return (0, neverthrow_1.err)(Error(`Right operand in algebraic "${name}" must be a single cell.`)); + } + if (rightArity.isCell()) { + const rightCellValue = rightValue.value.getAsNumber(0, 0); + const result2 = (0, lodash_1.map)(leftValue.value.val, (currentRow) => (0, lodash_1.map)(currentRow, (currentCell) => { + const leftCellValue2 = (0, results_1.FloatOrMilliseconds)(currentCell); + return fn(leftCellValue2, rightCellValue).toString(); + })); + return (0, neverthrow_1.ok)(new results_1.Value(result2)); + } + const leftCellValue = leftValue.value.getAsNumber(0, 0); + const result = (0, lodash_1.map)(rightValue.value.val, (currentRow) => (0, lodash_1.map)(currentRow, (currentCell) => { + const rightCellValue = (0, results_1.FloatOrMilliseconds)(currentCell); + return fn(leftCellValue, rightCellValue).toString(); + })); + return (0, neverthrow_1.ok)(new results_1.Value(result)); + }; + this.add = (table2, cell) => this.withCellAndRange(table2, cell, "add", true, (left, right) => left.plus(right)); + this.subtract = (table2, cell) => this.withCellAndRange(table2, cell, "subtract", true, (left, right) => left.minus(right)); + this.multiply = (table2, cell) => this.withCellAndRange(table2, cell, "multiply", true, (left, right) => left.times(right)); + this.divide = (table2, cell) => this.withCellAndRange(table2, cell, "divide", false, (left, right) => left.dividedBy(right)); + const typeErr = (0, ast_utils_1.checkType)(ast, "algebraic_operation"); + if (typeErr) { + throw typeErr; + } + const lengthError = (0, ast_utils_1.checkChildLength)(ast, 3); + if (lengthError) { + throw lengthError; + } + const childTypeErr = (0, ast_utils_1.checkType)(ast.children[1], "algebraic_operator"); + if (childTypeErr) { + throw childTypeErr; + } + this.operator = ast.children[1].text; + try { + this.leftSource = new calc_1.Source(ast.children[0], table); + this.rightSource = new calc_1.Source(ast.children[2], table); + } catch (error) { + throw error; + } + } + }; + exports.AlgebraicOperation = AlgebraicOperation; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/calc/conditional_function.js +var require_conditional_function = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/calc/conditional_function.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.ConditionalFunctionCall = void 0; + var neverthrow_1 = require_neverthrow(); + var ast_utils_1 = require_ast_utils(); + var calc_1 = require_calc(); + var ConditionalFunctionCall = class { + constructor(ast, table) { + this.getValue = (table2, cell) => this.predicate.eval(table2, cell).andThen((predicateResult) => predicateResult ? this.leftSource.getValue(table2, cell) : this.rightSource.getValue(table2, cell)); + const typeError = (0, ast_utils_1.checkType)(ast, "conditional_function_call"); + if (typeError) { + throw typeError; + } + const lengthError = (0, ast_utils_1.checkChildLength)(ast, 3); + if (lengthError) { + throw lengthError; + } + try { + this.predicate = new Predicate(ast.children[0], table); + this.leftSource = new calc_1.Source(ast.children[1], table); + this.rightSource = new calc_1.Source(ast.children[2], table); + } catch (error) { + throw error; + } + } + }; + exports.ConditionalFunctionCall = ConditionalFunctionCall; + var Predicate = class { + constructor(ast, table) { + this.eval = (table2, cell) => { + const leftData = this.leftSource.getValue(table2, cell); + if (leftData.isErr()) { + return (0, neverthrow_1.err)(leftData.error); + } + const rightData = this.rightSource.getValue(table2, cell); + if (rightData.isErr()) { + return (0, neverthrow_1.err)(rightData.error); + } + const leftArity = leftData.value.getArity(); + const rightArity = rightData.value.getArity(); + if (!leftArity.isCell()) { + return (0, neverthrow_1.err)(Error("Can only use comparison operator on a single cell. Left side is not a cell.")); + } + if (!rightArity.isCell()) { + return (0, neverthrow_1.err)(Error("Can only use comparison operator on a single cell. Right side is not a cell.")); + } + const leftVal = leftData.value.getAsNumber(0, 0); + const rightVal = rightData.value.getAsNumber(0, 0); + switch (this.operator) { + case ">": + return (0, neverthrow_1.ok)(leftVal.greaterThan(rightVal)); + case ">=": + return (0, neverthrow_1.ok)(leftVal.greaterThanOrEqualTo(rightVal)); + case "<": + return (0, neverthrow_1.ok)(leftVal.lessThan(rightVal)); + case "<=": + return (0, neverthrow_1.ok)(leftVal.lessThanOrEqualTo(rightVal)); + case "==": + return (0, neverthrow_1.ok)(leftVal.equals(rightVal)); + case "!=": + return (0, neverthrow_1.ok)(!leftVal.equals(rightVal)); + default: + return (0, neverthrow_1.err)(Error("Invalid conditional operator: " + this.operator)); + } + }; + const typeError = (0, ast_utils_1.checkType)(ast, "predicate"); + if (typeError) { + throw typeError; + } + const lengthError = (0, ast_utils_1.checkChildLength)(ast, 3); + if (lengthError) { + throw lengthError; + } + const childTypeError = (0, ast_utils_1.checkType)(ast.children[1], "conditional_operator"); + if (childTypeError) { + throw childTypeError; + } + this.operator = ast.children[1].text; + try { + this.leftSource = new calc_1.Source(ast.children[0], table); + this.rightSource = new calc_1.Source(ast.children[2], table); + } catch (error) { + throw error; + } + } + }; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/calc/constant.js +var require_constant = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/calc/constant.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.Constant = void 0; + var neverthrow_1 = require_neverthrow(); + var ast_utils_1 = require_ast_utils(); + var results_1 = require_results(); + var Constant = class { + constructor(ast, table) { + const typeErr = (0, ast_utils_1.checkType)(ast, "real", "float"); + if (typeErr) { + throw typeErr; + } + const multiplier = ast.text[0] === "-" ? -1 : 1; + if (ast.type === "real") { + this.value = multiplier * parseInt(ast.children[0].text); + } else { + this.value = multiplier * parseFloat(ast.children[0].text + "." + ast.children[1].text); + } + } + getValue(table, currentCell) { + return (0, neverthrow_1.ok)(new results_1.Value([[this.value.toString()]])); + } + }; + exports.Constant = Constant; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/calc/column.js +var require_column = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/calc/column.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.AbsoluteColumn = exports.Column = exports.newColumn = void 0; + var neverthrow_1 = require_neverthrow(); + var ast_utils_1 = require_ast_utils(); + var results_1 = require_results(); + var newColumn = (ast, table) => { + try { + switch (ast.type) { + case "relative_column": + return (0, neverthrow_1.ok)(new RelativeColumn(ast, table)); + case "absolute_column": + return (0, neverthrow_1.ok)(new AbsoluteColumn(ast, table)); + default: + return (0, neverthrow_1.err)(new Error(`Formula element '${ast.text}' is a ${ast.type} but expected an relatve_column or absolute_column in this position.`)); + } + } catch (error) { + return (0, neverthrow_1.err)(error); + } + }; + exports.newColumn = newColumn; + var Column = class { + constructor() { + this.getValue = (table, currentCell) => { + var _a; + const val = ((_a = table.getCellAt(currentCell.row, this.getIndex(currentCell))) === null || _a === void 0 ? void 0 : _a.toText()) || ""; + return (0, neverthrow_1.ok)(new results_1.Value([[val]])); + }; + } + }; + exports.Column = Column; + var RelativeColumn = class extends Column { + constructor(ast, table) { + super(); + this.getIndex = (currentCell) => currentCell.column + this.offset; + this.getAbsoluteIndex = () => (0, neverthrow_1.err)(ast_utils_1.errRelativeReferenceIndex); + const typeError = (0, ast_utils_1.checkType)(ast, "relative_column"); + if (typeError) { + throw typeError; + } + const lengthError = (0, ast_utils_1.checkChildLength)(ast, 1); + if (lengthError) { + throw lengthError; + } + const multiplier = ast.text[1] === "-" ? -1 : 1; + this.offset = multiplier * parseInt(ast.children[0].text); + } + }; + var AbsoluteColumn = class extends Column { + constructor(ast, table) { + super(); + this.getIndex = (currentCell) => this.index; + this.getAbsoluteIndex = () => (0, neverthrow_1.ok)(this.index); + let index = -1; + let symbol = ""; + switch (ast.children.length) { + case 0: + symbol = ast.text[1]; + break; + case 1: + const typeError = (0, ast_utils_1.checkType)(ast.children[0], "int"); + if (typeError) { + throw (0, neverthrow_1.err)(typeError); + } + index = parseInt(ast.children[0].text); + break; + default: + throw new Error(`Formula element '${ast.text}' is a ${ast.type} but expected a 'absolute_column' in this position.`); + } + switch (symbol) { + case "": + break; + case "<": + index = 1; + break; + case ">": + index = table.getWidth(); + break; + default: + throw new Error(`Invalid column symbol '${symbol}'`); + } + if (index === 0) { + throw ast_utils_1.errIndex0; + } + this.index = index - 1; + } + }; + exports.AbsoluteColumn = AbsoluteColumn; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/calc/row.js +var require_row = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/calc/row.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.AbsoluteRow = exports.Row = exports.newRow = void 0; + var neverthrow_1 = require_neverthrow(); + var ast_utils_1 = require_ast_utils(); + var results_1 = require_results(); + var newRow = (ast, table) => { + try { + switch (ast.type) { + case "relative_row": + return (0, neverthrow_1.ok)(new RelativeRow(ast, table)); + case "absolute_row": + return (0, neverthrow_1.ok)(new AbsoluteRow(ast, table)); + default: + return (0, neverthrow_1.err)(new Error(`Formula element '${ast.text}' is a ${ast.type} but expected an relatve_row or absolute_row in this position.`)); + } + } catch (error) { + return (0, neverthrow_1.err)(error); + } + }; + exports.newRow = newRow; + var Row = class { + constructor() { + this.getValue = (table, currentCell) => { + var _a; + const val = ((_a = table.getCellAt(this.getIndex(currentCell), currentCell.column)) === null || _a === void 0 ? void 0 : _a.toText()) || ""; + return (0, neverthrow_1.ok)(new results_1.Value([[val]])); + }; + } + }; + exports.Row = Row; + var RelativeRow = class extends Row { + constructor(ast, table) { + super(); + this.getIndex = (currentCell) => currentCell.row + this.offset; + this.getAbsoluteIndex = () => (0, neverthrow_1.err)(ast_utils_1.errRelativeReferenceIndex); + const typeError = (0, ast_utils_1.checkType)(ast, "relative_row"); + if (typeError) { + throw typeError; + } + const lengthError = (0, ast_utils_1.checkChildLength)(ast, 1); + if (lengthError) { + throw lengthError; + } + const multiplier = ast.text[1] === "-" ? -1 : 1; + this.offset = multiplier * parseInt(ast.children[0].text); + } + }; + var AbsoluteRow = class extends Row { + constructor(ast, table) { + super(); + this.getIndex = (currentCell) => this.index; + this.getAbsoluteIndex = () => (0, neverthrow_1.ok)(this.index); + let index = -1; + let symbol = ""; + switch (ast.children.length) { + case 0: + symbol = ast.text[1]; + break; + case 1: + const typeError = (0, ast_utils_1.checkType)(ast.children[0], "int"); + if (typeError) { + throw (0, neverthrow_1.err)(typeError); + } + index = parseInt(ast.children[0].text); + break; + default: + throw new Error(`Formula element '${ast.text}' is a ${ast.type} but expected a 'absolute_row' in this position.`); + } + switch (symbol) { + case "": + break; + case "<": + index = 1; + break; + case ">": + index = table.getHeight() - 1; + break; + case "I": + index = 2; + break; + default: + throw new Error(`Invalid row symbol '${symbol}'`); + } + if (index === 0) { + throw ast_utils_1.errIndex0; + } + if (index === 1) { + this.index = 0; + } else { + this.index = index; + } + } + }; + exports.AbsoluteRow = AbsoluteRow; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/calc/reference.js +var require_reference = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/calc/reference.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.Reference = void 0; + var neverthrow_1 = require_neverthrow(); + var ast_utils_1 = require_ast_utils(); + var column_1 = require_column(); + var results_1 = require_results(); + var row_1 = require_row(); + var Reference = class { + constructor(ast, table) { + this.getValue = (table2, currentCell) => { + var _a; + const cell = { + row: this.row ? this.row.getIndex(currentCell) : currentCell.row, + column: this.column ? this.column.getIndex(currentCell) : currentCell.column + }; + const val = ((_a = table2.getCellAt(cell.row, cell.column)) === null || _a === void 0 ? void 0 : _a.toText()) || ""; + return (0, neverthrow_1.ok)(new results_1.Value([[val]])); + }; + const typeErr = (0, ast_utils_1.checkType)(ast, "source_reference", "absolute_reference", "relative_reference"); + if (typeErr) { + throw typeErr; + } + for (let i = 0; i < ast.children.length; i++) { + const child = ast.children[i]; + switch (child.type) { + case "relative_row": + case "absolute_row": + if (this.row !== void 0) { + throw Error("Reference may only have at most 1 row, more than 1 provided"); + } + const createdRow = (0, row_1.newRow)(child, table); + if (createdRow.isErr()) { + if (createdRow.error === ast_utils_1.errIndex0) { + break; + } + throw createdRow.error; + } + this.row = createdRow.value; + break; + case "relative_column": + case "absolute_column": + if (this.column !== void 0) { + throw Error("Reference may only have at most 1 column, more than 1 provided"); + } + const createdCol = (0, column_1.newColumn)(child, table); + if (createdCol.isErr()) { + if (createdCol.error === ast_utils_1.errIndex0) { + break; + } + throw createdCol.error; + } + this.column = createdCol.value; + break; + } + } + } + }; + exports.Reference = Reference; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/calc/range.js +var require_range2 = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/calc/range.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.Range = void 0; + var neverthrow_1 = require_neverthrow(); + var ast_utils_1 = require_ast_utils(); + var reference_1 = require_reference(); + var results_1 = require_results(); + var lodash_1 = require_lodash(); + var Range2 = class { + constructor(ast, table) { + this.getValue = (table2, currentCell) => { + const startColumn = this.startColumn ? this.startColumn.getIndex(currentCell) : currentCell.column; + const endColumn = this.endColumn ? this.endColumn.getIndex(currentCell) : startColumn; + const startRow = this.startRow ? this.startRow.getIndex(currentCell) : currentCell.row; + const endRow = this.endRow ? this.endRow.getIndex(currentCell) : currentCell.row; + return (0, neverthrow_1.ok)(new results_1.Value((0, lodash_1.map)((0, lodash_1.range)(startRow, endRow + 1), (row) => (0, lodash_1.map)((0, lodash_1.range)(startColumn, endColumn + 1), (col) => { + var _a; + return ((_a = table2.getCellAt(row, col)) === null || _a === void 0 ? void 0 : _a.toText()) || ""; + })))); + }; + this.asCells = () => { + if (!this.startColumn || !this.startRow || !this.endRow) { + return (0, neverthrow_1.err)(new Error("A range used as a desintation must define rows and cells")); + } + let endColumn = this.endColumn; + if (!endColumn) { + endColumn = this.startColumn; + } + const startRowIndex = this.startRow.getAbsoluteIndex(); + const endRowIndex = this.endRow.getAbsoluteIndex(); + const startColumnIndex = this.startColumn.getAbsoluteIndex(); + const endColumnIndex = endColumn.getAbsoluteIndex(); + if (startRowIndex.isErr() || endRowIndex.isErr() || startColumnIndex.isErr() || endColumnIndex.isErr()) { + return (0, neverthrow_1.err)(new Error("A relative range can not be used in a formula destination")); + } + const minRow = Math.min(startRowIndex.value, endRowIndex.value); + const maxRow = Math.max(startRowIndex.value, endRowIndex.value); + const minColumn = Math.min(startColumnIndex.value, endColumnIndex.value); + const maxColumn = Math.max(startColumnIndex.value, endColumnIndex.value); + return (0, neverthrow_1.ok)((0, lodash_1.flatMap)((0, lodash_1.range)(minRow, maxRow + 1), (rowNum) => (0, lodash_1.range)(minColumn, maxColumn + 1).map((colNum) => ({ row: rowNum, column: colNum })))); + }; + let typeErr = (0, ast_utils_1.checkType)(ast, "range"); + if (typeErr) { + throw typeErr; + } + let lengthError = (0, ast_utils_1.checkChildLength)(ast, 2); + if (lengthError) { + throw lengthError; + } + const startChild = ast.children[0]; + const endChild = ast.children[1]; + typeErr = (0, ast_utils_1.checkType)(startChild, "source_reference"); + if (typeErr) { + throw typeErr; + } + typeErr = (0, ast_utils_1.checkType)(endChild, "source_reference"); + if (typeErr) { + throw typeErr; + } + lengthError = (0, ast_utils_1.checkChildLength)(startChild, 1); + if (lengthError) { + throw lengthError; + } + lengthError = (0, ast_utils_1.checkChildLength)(endChild, 1); + if (lengthError) { + throw lengthError; + } + const start = new reference_1.Reference(startChild.children[0], table); + const end = new reference_1.Reference(endChild.children[0], table); + if (start.row && !end.row || end.row && !start.row) { + throw new Error("Range must use references of the same kind"); + } + if (!start.row && !start.column) { + console.log(start); + throw new Error("Range must have a row or a column defined"); + } + if (start.row) { + this.startRow = start.row; + } + if (start.column) { + this.startColumn = start.column; + } + if (end.row) { + this.endRow = end.row; + } + if (end.column) { + this.endColumn = end.column; + } else { + this.endColumn = start.column; + } + } + }; + exports.Range = Range2; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/calc/destination.js +var require_destination = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/calc/destination.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.RangeDestination = exports.CellDestination = exports.ColumnDestination = exports.RowDestination = exports.newDestination = void 0; + var neverthrow_1 = require_neverthrow(); + var ast_utils_1 = require_ast_utils(); + var column_1 = require_column(); + var range_1 = require_range2(); + var row_1 = require_row(); + var lodash_1 = require_lodash(); + var newDestination = (ast, table, formatter) => { + const typeErr = (0, ast_utils_1.checkType)(ast, "destination"); + if (typeErr) { + return (0, neverthrow_1.err)(typeErr); + } + const lengthError = (0, ast_utils_1.checkChildLength)(ast, 1); + if (lengthError) { + return (0, neverthrow_1.err)(lengthError); + } + const child = ast.children[0]; + if (child.type === "range") { + return (0, neverthrow_1.ok)(new RangeDestination(child, table, formatter)); + } + try { + switch (child.children.length) { + case 2: + return (0, neverthrow_1.ok)(new CellDestination(child, table, formatter)); + case 1: + const innerChild = child.children[0]; + if (innerChild.type === "absolute_row") { + return (0, neverthrow_1.ok)(new RowDestination(child, table, formatter)); + } else if (innerChild.type === "absolute_column") { + return (0, neverthrow_1.ok)(new ColumnDestination(child, table, formatter)); + } + default: + return (0, neverthrow_1.err)(new Error("Unexpected destination type " + child.type)); + } + } catch (error) { + if (error === ast_utils_1.errIndex0) { + return (0, neverthrow_1.err)(new Error("Index 0 may not be used in a destination")); + } + return (0, neverthrow_1.err)(error); + } + }; + exports.newDestination = newDestination; + var RowDestination = class { + constructor(ast, table, formatter) { + this.merge = (source, table2) => { + const cells = (0, lodash_1.range)(0, table2.getWidth()).map((columnNum) => ({ row: this.row.index, column: columnNum })); + return mergeForCells(source, table2, cells, this.formatter); + }; + this.formatter = formatter; + const typeErr = (0, ast_utils_1.checkType)(ast, "absolute_reference"); + if (typeErr) { + throw typeErr; + } + const lengthError = (0, ast_utils_1.checkChildLength)(ast, 1); + if (lengthError) { + throw lengthError; + } + const child = ast.children[0]; + try { + this.row = new row_1.AbsoluteRow(child, table); + } catch (error) { + throw error; + } + } + }; + exports.RowDestination = RowDestination; + var ColumnDestination = class { + constructor(ast, table, formatter) { + this.merge = (source, table2) => { + const cells = (0, lodash_1.range)(2, table2.getHeight()).map((rowNum) => ({ row: rowNum, column: this.column.index })); + return mergeForCells(source, table2, cells, this.formatter); + }; + this.formatter = formatter; + const typeErr = (0, ast_utils_1.checkType)(ast, "absolute_reference"); + if (typeErr) { + throw typeErr; + } + const lengthError = (0, ast_utils_1.checkChildLength)(ast, 1); + if (lengthError) { + throw lengthError; + } + const child = ast.children[0]; + try { + this.column = new column_1.AbsoluteColumn(child, table); + } catch (error) { + throw error; + } + } + }; + exports.ColumnDestination = ColumnDestination; + var CellDestination = class { + constructor(ast, table, formatter) { + this.merge = (source, table2) => { + const cell = { row: this.row.index, column: this.column.index }; + return mergeForCells(source, table2, [cell], this.formatter); + }; + this.formatter = formatter; + const typeErr = (0, ast_utils_1.checkType)(ast, "absolute_reference"); + if (typeErr) { + throw typeErr; + } + const lengthError = (0, ast_utils_1.checkChildLength)(ast, 2); + if (lengthError) { + throw lengthError; + } + const rowChild = ast.children[0]; + const colChild = ast.children[1]; + try { + this.row = new row_1.AbsoluteRow(rowChild, table); + this.column = new column_1.AbsoluteColumn(colChild, table); + } catch (error) { + throw error; + } + } + }; + exports.CellDestination = CellDestination; + var RangeDestination = class { + constructor(ast, table, formatter) { + this.merge = (source, table2) => this.range.asCells().andThen((cells) => mergeForCells(source, table2, cells, this.formatter)); + this.formatter = formatter; + const typeErr = (0, ast_utils_1.checkType)(ast, "range"); + if (typeErr) { + throw typeErr; + } + const lengthError = (0, ast_utils_1.checkChildLength)(ast, 2); + if (lengthError) { + throw lengthError; + } + ast.children.forEach((child) => { + let childTypeErr = (0, ast_utils_1.checkType)(child, "source_reference"); + if (childTypeErr) { + throw childTypeErr; + } + const childLengthError = (0, ast_utils_1.checkChildLength)(child, 1); + if (childLengthError) { + throw childLengthError; + } + childTypeErr = (0, ast_utils_1.checkType)(child.children[0], "absolute_reference"); + if (childTypeErr) { + throw childTypeErr; + } + }); + this.range = new range_1.Range(ast, table); + } + }; + exports.RangeDestination = RangeDestination; + var mergeForCells = (source, table, cells, formatter) => cells.reduce((currentTable, currentCell) => currentTable.andThen((t) => source.getValue(t, currentCell).andThen((val) => (0, neverthrow_1.ok)(val.toString())).andThen((val) => (0, neverthrow_1.ok)(val.trim() === "" ? "0" : val)).andThen((val) => (0, neverthrow_1.ok)(t.setCellAt(currentCell.row, currentCell.column, formatter.format(val))))), (0, neverthrow_1.ok)(table)); + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/calc/display_directive.js +var require_display_directive = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/calc/display_directive.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.DisplayDirective = exports.DefaultFormatter = void 0; + var ast_utils_1 = require_ast_utils(); + var DefaultFormatter = class { + constructor() { + this.format = (num) => { + if (typeof num === "string") { + return num; + } + return num.toString(); + }; + } + }; + exports.DefaultFormatter = DefaultFormatter; + var DisplayDirective = class { + constructor(ast) { + this.format = (num) => { + const parsed = typeof num === "string" ? parseFloat(num) : num; + if (this.displayAsDatetime) { + const date = new Date(parsed); + const pad = (v) => `0${v}`.slice(-2); + const y = date.getFullYear(); + const mo = pad(date.getMonth() + 1); + const d = pad(date.getDate()); + const h = pad(date.getHours()); + const min = pad(date.getMinutes()); + return `${y}-${mo}-${d} ${h}:${min}`; + } + if (this.displayAsHourMinute) { + let sign = parsed < 0 ? "-" : ""; + const minutes = Math.floor(Math.abs(parsed) / 6e4); + const pad = (v) => `0${v}`.slice(-2); + const h = pad(Math.floor(minutes / 60)); + const m = pad(minutes % 60); + return `${sign}${h}:${m}`; + } + return parsed.toFixed(this.decimalLength); + }; + let typeError = (0, ast_utils_1.checkType)(ast, "display_directive"); + if (typeError) { + throw typeError; + } + let lengthError = (0, ast_utils_1.checkChildLength)(ast, 1); + if (lengthError) { + throw lengthError; + } + const displayDirectiveOption = ast.children[0]; + typeError = (0, ast_utils_1.checkType)(displayDirectiveOption, "display_directive_option"); + if (typeError) { + throw typeError; + } + lengthError = (0, ast_utils_1.checkChildLength)(displayDirectiveOption, 1); + if (lengthError) { + throw lengthError; + } + const formattingDirective = displayDirectiveOption.children[0]; + typeError = (0, ast_utils_1.checkType)(formattingDirective, "formatting_directive", "datetime_directive", "hourminute_directive"); + if (typeError) { + throw typeError; + } + this.displayAsDatetime = formattingDirective.type === "datetime_directive"; + this.displayAsHourMinute = formattingDirective.type === "hourminute_directive"; + if (this.displayAsDatetime || this.displayAsHourMinute) { + this.decimalLength = -1; + return; + } + lengthError = (0, ast_utils_1.checkChildLength)(formattingDirective, 1); + if (lengthError) { + throw lengthError; + } + const formattingDirectiveLength = formattingDirective.children[0]; + typeError = (0, ast_utils_1.checkType)(formattingDirectiveLength, "int"); + if (typeError) { + throw typeError; + } + this.decimalLength = parseInt(formattingDirectiveLength.text); + } + }; + exports.DisplayDirective = DisplayDirective; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/calc/single_param_function.js +var require_single_param_function = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/calc/single_param_function.js"(exports) { + "use strict"; + var __importDefault = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.SingleParamFunctionCall = void 0; + var neverthrow_1 = require_neverthrow(); + var ast_utils_1 = require_ast_utils(); + var calc_1 = require_calc(); + var results_1 = require_results(); + var decimal_js_1 = __importDefault(require_decimal()); + var SingleParamFunctionCall = class { + constructor(ast, table) { + this.getValue = (table2, cell) => this.param.getValue(table2, cell).andThen((sourceData) => ( + // The operation functions do not throw errors because data arity has + // already been validated. + (0, neverthrow_1.ok)(this.op(sourceData)) + )); + const typeError = (0, ast_utils_1.checkType)(ast, "single_param_function_call"); + if (typeError) { + throw typeError; + } + const lengthError = (0, ast_utils_1.checkChildLength)(ast, 2); + if (lengthError) { + throw lengthError; + } + const childTypeError = (0, ast_utils_1.checkType)(ast.children[0], "single_param_function"); + if (childTypeError) { + throw childTypeError; + } + const functionName = ast.children[0].text; + switch (functionName) { + case "sum": + this.op = sum; + break; + case "mean": + this.op = mean; + break; + default: + throw Error("Unknown single param function call: " + functionName); + } + this.param = new calc_1.Source(ast.children[1], table); + } + }; + exports.SingleParamFunctionCall = SingleParamFunctionCall; + var sum = (value) => { + const total = value.val.reduce((runningTotal, currentRow) => currentRow.reduce((rowTotal, currentCell) => { + const currentCellValue = (0, results_1.FloatOrMilliseconds)(currentCell); + return currentCellValue.add(rowTotal); + }, runningTotal), new decimal_js_1.default(0)); + return new results_1.Value([[total.toString()]]); + }; + var mean = (value) => { + const { total, count } = value.val.reduce(({ total: runningTotal1, count: currentCount1 }, currentRow) => currentRow.reduce(({ total: runningTotal2, count: currentCount2 }, currentCell) => ({ + total: runningTotal2 + +currentCell, + count: currentCount2 + 1 + }), { total: runningTotal1, count: currentCount1 }), { total: 0, count: 0 }); + return new results_1.Value([[(total / count).toString()]]); + }; + } +}); + +// node_modules/ebnf/dist/TokenError.js +var require_TokenError = __commonJS({ + "node_modules/ebnf/dist/TokenError.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.TokenError = void 0; + var TokenError = class extends Error { + constructor(message, token) { + super(message); + this.message = message; + this.token = token; + if (token && token.errors) + token.errors.push(this); + else + throw this; + } + inspect() { + return "SyntaxError: " + this.message; + } + }; + exports.TokenError = TokenError; + } +}); + +// node_modules/ebnf/dist/Parser.js +var require_Parser = __commonJS({ + "node_modules/ebnf/dist/Parser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.Parser = exports.findRuleByName = exports.parseRuleName = exports.escapeRegExp = exports.readToken = void 0; + var UPPER_SNAKE_RE = /^[A-Z0-9_]+$/; + var decorationRE = /(\?|\+|\*)$/; + var preDecorationRE = /^(@|&|!)/; + var WS_RULE = "WS"; + var TokenError_1 = require_TokenError(); + function readToken(txt, expr) { + let result = expr.exec(txt); + if (result && result.index == 0) { + if (result[0].length == 0 && expr.source.length > 0) + return null; + return { + type: null, + text: result[0], + rest: txt.substr(result[0].length), + start: 0, + end: result[0].length - 1, + fullText: result[0], + errors: [], + children: [], + parent: null + }; + } + return null; + } + exports.readToken = readToken; + function escapeRegExp(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + } + exports.escapeRegExp = escapeRegExp; + function fixRest(token) { + token.rest = ""; + token.children && token.children.forEach((c) => fixRest(c)); + } + function fixPositions(token, start) { + token.start += start; + token.end += start; + token.children && token.children.forEach((c) => fixPositions(c, token.start)); + } + function agregateErrors(errors, token) { + if (token.errors && token.errors.length) + token.errors.forEach((err) => errors.push(err)); + token.children && token.children.forEach((tok) => agregateErrors(errors, tok)); + } + function parseRuleName(name) { + let postDecoration = decorationRE.exec(name); + let preDecoration = preDecorationRE.exec(name); + let postDecorationText = postDecoration && postDecoration[0] || ""; + let preDecorationText = preDecoration && preDecoration[0] || ""; + let out = { + raw: name, + name: name.replace(decorationRE, "").replace(preDecorationRE, ""), + isOptional: postDecorationText == "?" || postDecorationText == "*", + allowRepetition: postDecorationText == "+" || postDecorationText == "*", + atLeastOne: postDecorationText == "+", + lookupPositive: preDecorationText == "&", + lookupNegative: preDecorationText == "!", + pinned: preDecorationText == "@", + lookup: false, + isLiteral: false + }; + out.isLiteral = out.name[0] == "'" || out.name[0] == '"'; + out.lookup = out.lookupNegative || out.lookupPositive; + return out; + } + exports.parseRuleName = parseRuleName; + function findRuleByName(name, parser) { + let parsed = parseRuleName(name); + return parser.cachedRules[parsed.name] || null; + } + exports.findRuleByName = findRuleByName; + function stripRules(token, re) { + if (token.children) { + let localRules = token.children.filter((x) => x.type && re.test(x.type)); + for (let i = 0; i < localRules.length; i++) { + let indexOnChildren = token.children.indexOf(localRules[i]); + if (indexOnChildren != -1) { + token.children.splice(indexOnChildren, 1); + } + } + token.children.forEach((c) => stripRules(c, re)); + } + } + var ignoreMissingRules = ["EOF"]; + var Parser = class { + constructor(grammarRules, options) { + this.grammarRules = grammarRules; + this.options = options; + this.cachedRules = {}; + this.debug = options ? options.debug === true : false; + let errors = []; + let neededRules = []; + grammarRules.forEach((rule) => { + let parsedName = parseRuleName(rule.name); + if (parsedName.name in this.cachedRules) { + errors.push("Duplicated rule " + parsedName.name); + return; + } else { + this.cachedRules[parsedName.name] = rule; + } + if (!rule.bnf || !rule.bnf.length) { + let error = "Missing rule content, rule: " + rule.name; + if (errors.indexOf(error) == -1) + errors.push(error); + } else { + rule.bnf.forEach((options2) => { + if (typeof options2[0] === "string") { + let parsed = parseRuleName(options2[0]); + if (parsed.name == rule.name) { + let error = "Left recursion is not allowed, rule: " + rule.name; + if (errors.indexOf(error) == -1) + errors.push(error); + } + } + options2.forEach((option) => { + if (typeof option == "string") { + let name = parseRuleName(option); + if (!name.isLiteral && neededRules.indexOf(name.name) == -1 && ignoreMissingRules.indexOf(name.name) == -1) + neededRules.push(name.name); + } + }); + }); + } + if (WS_RULE == rule.name) + rule.implicitWs = false; + if (rule.implicitWs) { + if (neededRules.indexOf(WS_RULE) == -1) + neededRules.push(WS_RULE); + } + if (rule.recover) { + if (neededRules.indexOf(rule.recover) == -1) + neededRules.push(rule.recover); + } + }); + neededRules.forEach((ruleName) => { + if (!(ruleName in this.cachedRules)) { + errors.push("Missing rule " + ruleName); + } + }); + if (errors.length) + throw new Error(errors.join("\n")); + } + getAST(txt, target) { + if (!target) { + target = this.grammarRules.filter((x) => !x.fragment && x.name.indexOf("%") != 0)[0].name; + } + let result = this.parse(txt, target); + if (result) { + agregateErrors(result.errors, result); + fixPositions(result, 0); + stripRules(result, /^%/); + if (!this.options || !this.options.keepUpperRules) + stripRules(result, UPPER_SNAKE_RE); + let rest = result.rest; + if (rest) { + new TokenError_1.TokenError("Unexpected end of input: \n" + rest, result); + } + fixRest(result); + result.rest = rest; + } + return result; + } + emitSource() { + return "CANNOT EMIT SOURCE FROM BASE Parser"; + } + parse(txt, target, recursion = 0) { + let out = null; + let type = parseRuleName(target); + let expr; + let printable = this.debug && /*!isLiteral &*/ + !UPPER_SNAKE_RE.test(type.name); + printable && console.log(new Array(recursion).join("\u2502 ") + "Trying to get " + target + " from " + JSON.stringify(txt.split("\n")[0])); + let realType = type.name; + let targetLex = findRuleByName(type.name, this); + if (type.name == "EOF") { + if (txt.length) { + return null; + } else if (txt.length == 0) { + return { + type: "EOF", + text: "", + rest: "", + start: 0, + end: 0, + fullText: "", + errors: [], + children: [], + parent: null + }; + } + } + try { + if (!targetLex && type.isLiteral) { + let src = type.name.trim(); + if (src.startsWith('"')) { + src = JSON.parse(src); + } else if (src.startsWith("'")) { + src = src.replace(/^'(.+)'$/, "$1").replace(/\\'/g, "'"); + } + if (src === "") { + return { + type: "%%EMPTY%%", + text: "", + rest: txt, + start: 0, + end: 0, + fullText: "", + errors: [], + children: [], + parent: null + }; + } + expr = new RegExp(escapeRegExp(src)); + realType = null; + } + } catch (e) { + if (e instanceof ReferenceError) { + console.error(e); + } + return null; + } + if (expr) { + let result = readToken(txt, expr); + if (result) { + result.type = realType; + return result; + } + } else { + let options = targetLex.bnf; + if (options instanceof Array) { + options.forEach((phases) => { + if (out) + return; + let pinned = null; + let tmp = { + type: type.name, + text: "", + children: [], + end: 0, + errors: [], + fullText: "", + parent: null, + start: 0, + rest: txt + }; + if (targetLex.fragment) + tmp.fragment = true; + let tmpTxt = txt; + let position = 0; + let allOptional = phases.length > 0; + let foundSomething = false; + for (let i = 0; i < phases.length; i++) { + if (typeof phases[i] == "string") { + let localTarget = parseRuleName(phases[i]); + allOptional = allOptional && localTarget.isOptional; + let got; + let foundAtLeastOne = false; + do { + got = null; + if (targetLex.implicitWs) { + got = this.parse(tmpTxt, localTarget.name, recursion + 1); + if (!got) { + let WS; + do { + WS = this.parse(tmpTxt, WS_RULE, recursion + 1); + if (WS) { + tmp.text = tmp.text + WS.text; + tmp.end = tmp.text.length; + WS.parent = tmp; + tmp.children.push(WS); + tmpTxt = tmpTxt.substr(WS.text.length); + position += WS.text.length; + } else { + break; + } + } while (WS && WS.text.length); + } + } + got = got || this.parse(tmpTxt, localTarget.name, recursion + 1); + if (localTarget.lookupNegative) { + if (got) + return; + break; + } + if (localTarget.lookupPositive) { + if (!got) + return; + } + if (!got) { + if (localTarget.isOptional) + break; + if (localTarget.atLeastOne && foundAtLeastOne) + break; + } + if (got && targetLex.pinned == i + 1) { + pinned = got; + printable && console.log(new Array(recursion + 1).join("\u2502 ") + "\u2514\u2500 " + got.type + " PINNED"); + } + if (!got) + got = this.parseRecovery(targetLex, tmpTxt, recursion + 1); + if (!got) { + if (pinned) { + out = tmp; + got = { + type: "SyntaxError", + text: tmpTxt, + children: [], + end: tmpTxt.length, + errors: [], + fullText: "", + parent: null, + start: 0, + rest: "" + }; + if (tmpTxt.length) { + new TokenError_1.TokenError(`Unexpected end of input. Expecting ${localTarget.name} Got: ${tmpTxt}`, got); + } else { + new TokenError_1.TokenError(`Unexpected end of input. Missing ${localTarget.name}`, got); + } + printable && console.log(new Array(recursion + 1).join("\u2502 ") + "\u2514\u2500 " + got.type + " " + JSON.stringify(got.text)); + } else { + return; + } + } + foundAtLeastOne = true; + foundSomething = true; + if (got.type == "%%EMPTY%%") { + break; + } + got.start += position; + got.end += position; + if (!localTarget.lookupPositive && got.type) { + if (got.fragment) { + got.children && got.children.forEach((x) => { + x.start += position; + x.end += position; + x.parent = tmp; + tmp.children.push(x); + }); + } else { + got.parent = tmp; + tmp.children.push(got); + } + } + if (localTarget.lookup) + got.lookup = true; + printable && console.log(new Array(recursion + 1).join("\u2502 ") + "\u2514\u2500 " + got.type + " " + JSON.stringify(got.text)); + if (!localTarget.lookup && !got.lookup) { + tmp.text = tmp.text + got.text; + tmp.end = tmp.text.length; + tmpTxt = tmpTxt.substr(got.text.length); + position += got.text.length; + } + tmp.rest = tmpTxt; + } while (got && localTarget.allowRepetition && tmpTxt.length && !got.lookup); + } else { + let got = readToken(tmpTxt, phases[i]); + if (!got) { + return; + } + printable && console.log(new Array(recursion + 1).join("\u2502 ") + "\u2514> " + JSON.stringify(got.text) + phases[i].source); + foundSomething = true; + got.start += position; + got.end += position; + tmp.text = tmp.text + got.text; + tmp.end = tmp.text.length; + tmpTxt = tmpTxt.substr(got.text.length); + position += got.text.length; + tmp.rest = tmpTxt; + } + } + if (foundSomething) { + out = tmp; + printable && console.log(new Array(recursion).join("\u2502 ") + "\u251C<\u2500\u2534< PUSHING " + out.type + " " + JSON.stringify(out.text)); + } + }); + } + if (out && targetLex.simplifyWhenOneChildren && out.children.length == 1) { + out = out.children[0]; + } + } + if (!out) { + printable && console.log(target + " NOT RESOLVED FROM " + txt); + } + return out; + } + parseRecovery(recoverableToken, tmpTxt, recursion) { + if (recoverableToken.recover && tmpTxt.length) { + let printable = this.debug; + printable && console.log(new Array(recursion + 1).join("\u2502 ") + "Trying to recover until token " + recoverableToken.recover + " from " + JSON.stringify(tmpTxt.split("\n")[0] + tmpTxt.split("\n")[1])); + let tmp = { + type: "SyntaxError", + text: "", + children: [], + end: 0, + errors: [], + fullText: "", + parent: null, + start: 0, + rest: "" + }; + let got; + do { + got = this.parse(tmpTxt, recoverableToken.recover, recursion + 1); + if (got) { + new TokenError_1.TokenError('Unexpected input: "' + tmp.text + `" Expecting: ${recoverableToken.name}`, tmp); + break; + } else { + tmp.text = tmp.text + tmpTxt[0]; + tmp.end = tmp.text.length; + tmpTxt = tmpTxt.substr(1); + } + } while (!got && tmpTxt.length > 0); + if (tmp.text.length > 0 && got) { + printable && console.log(new Array(recursion + 1).join("\u2502 ") + "Recovered text: " + JSON.stringify(tmp.text)); + return tmp; + } + } + return null; + } + }; + exports.Parser = Parser; + exports.default = Parser; + } +}); + +// node_modules/ebnf/dist/SemanticHelpers.js +var require_SemanticHelpers = __commonJS({ + "node_modules/ebnf/dist/SemanticHelpers.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.findChildrenByType = void 0; + function findChildrenByType(token, type) { + return token.children ? token.children.filter((x) => x.type == type) : []; + } + exports.findChildrenByType = findChildrenByType; + } +}); + +// node_modules/ebnf/dist/Grammars/BNF.js +var require_BNF = __commonJS({ + "node_modules/ebnf/dist/Grammars/BNF.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var SemanticHelpers_1 = require_SemanticHelpers(); + var Parser_1 = require_Parser(); + var BNF; + (function(BNF2) { + BNF2.RULES = [ + { + name: "syntax", + bnf: [["RULE_EOL*", "rule+"]] + }, + { + name: "rule", + bnf: [ + [ + '" "*', + '"<"', + "rule-name", + '">"', + '" "*', + '"::="', + "firstExpression", + "otherExpression*", + '" "*', + "RULE_EOL+", + '" "*' + ] + ] + }, + { + name: "firstExpression", + bnf: [['" "*', "list"]] + }, + { + name: "otherExpression", + bnf: [['" "*', '"|"', '" "*', "list"]] + }, + { + name: "RULE_EOL", + bnf: [['"\\r"'], ['"\\n"']] + }, + { + name: "list", + bnf: [["term", '" "*', "list"], ["term"]] + }, + { + name: "term", + bnf: [["literal"], ['"<"', "rule-name", '">"']] + }, + { + name: "literal", + bnf: [[`'"'`, "RULE_CHARACTER1*", `'"'`], [`"'"`, "RULE_CHARACTER2*", `"'"`]] + }, + { + name: "RULE_CHARACTER", + bnf: [['" "'], ["RULE_LETTER"], ["RULE_DIGIT"], ["RULE_SYMBOL"]] + }, + { + name: "RULE_LETTER", + bnf: [ + ['"A"'], + ['"B"'], + ['"C"'], + ['"D"'], + ['"E"'], + ['"F"'], + ['"G"'], + ['"H"'], + ['"I"'], + ['"J"'], + ['"K"'], + ['"L"'], + ['"M"'], + ['"N"'], + ['"O"'], + ['"P"'], + ['"Q"'], + ['"R"'], + ['"S"'], + ['"T"'], + ['"U"'], + ['"V"'], + ['"W"'], + ['"X"'], + ['"Y"'], + ['"Z"'], + ['"a"'], + ['"b"'], + ['"c"'], + ['"d"'], + ['"e"'], + ['"f"'], + ['"g"'], + ['"h"'], + ['"i"'], + ['"j"'], + ['"k"'], + ['"l"'], + ['"m"'], + ['"n"'], + ['"o"'], + ['"p"'], + ['"q"'], + ['"r"'], + ['"s"'], + ['"t"'], + ['"u"'], + ['"v"'], + ['"w"'], + ['"x"'], + ['"y"'], + ['"z"'] + ] + }, + { + name: "RULE_DIGIT", + bnf: [['"0"'], ['"1"'], ['"2"'], ['"3"'], ['"4"'], ['"5"'], ['"6"'], ['"7"'], ['"8"'], ['"9"']] + }, + { + name: "RULE_SYMBOL", + bnf: [ + ['"-"'], + ['"_"'], + ['"!"'], + ['"#"'], + ['"$"'], + ['"%"'], + ['"&"'], + ['"("'], + ['")"'], + ['"*"'], + ['"+"'], + ['","'], + ['"-"'], + ['"."'], + ['"/"'], + ['":"'], + ['";"'], + ['"<"'], + ['"="'], + ['">"'], + ['"?"'], + ['"@"'], + ['"["'], + ['"\\"'], + ['"]"'], + ['"^"'], + ['"_"'], + ['"`"'], + ['"{"'], + ['"|"'], + ['"}"'], + ['"~"'] + ] + }, + { + name: "RULE_CHARACTER1", + bnf: [["RULE_CHARACTER"], [`"'"`]] + }, + { + name: "RULE_CHARACTER2", + bnf: [["RULE_CHARACTER"], [`'"'`]] + }, + { + name: "rule-name", + bnf: [["RULE_LETTER", "RULE_CHAR*"]] + }, + { + name: "RULE_CHAR", + bnf: [["RULE_LETTER"], ["RULE_DIGIT"], ['"_"'], ['"-"']] + } + ]; + BNF2.defaultParser = new Parser_1.Parser(BNF2.RULES, { debug: false }); + function getAllTerms(expr) { + let terms = SemanticHelpers_1.findChildrenByType(expr, "term").map((term) => { + return SemanticHelpers_1.findChildrenByType(term, "literal").concat(SemanticHelpers_1.findChildrenByType(term, "rule-name"))[0].text; + }); + SemanticHelpers_1.findChildrenByType(expr, "list").forEach((expr2) => { + terms = terms.concat(getAllTerms(expr2)); + }); + return terms; + } + function getRules(source, parser = BNF2.defaultParser) { + let ast = parser.getAST(source); + if (!ast) + throw new Error("Could not parse " + source); + if (ast.errors && ast.errors.length) { + throw ast.errors[0]; + } + let rules = SemanticHelpers_1.findChildrenByType(ast, "rule"); + let ret = rules.map((rule) => { + let name = SemanticHelpers_1.findChildrenByType(rule, "rule-name")[0].text; + let expressions = SemanticHelpers_1.findChildrenByType(rule, "firstExpression").concat(SemanticHelpers_1.findChildrenByType(rule, "otherExpression")); + let bnf = []; + expressions.forEach((expr) => { + bnf.push(getAllTerms(expr)); + }); + return { + name, + bnf + }; + }); + if (!ret.some((x) => x.name == "EOL")) { + ret.push({ + name: "EOL", + bnf: [['"\\r\\n"', '"\\r"', '"\\n"']] + }); + } + return ret; + } + BNF2.getRules = getRules; + function Transform(source, subParser = BNF2.defaultParser) { + return getRules(source.join(""), subParser); + } + BNF2.Transform = Transform; + class Parser extends Parser_1.Parser { + constructor(source, options) { + const subParser = options && options.debugRulesParser === true ? new Parser_1.Parser(BNF2.RULES, { debug: true }) : BNF2.defaultParser; + super(getRules(source, subParser), options); + this.source = source; + } + emitSource() { + return this.source; + } + } + BNF2.Parser = Parser; + })(BNF || (BNF = {})); + exports.default = BNF; + } +}); + +// node_modules/ebnf/dist/Grammars/W3CEBNF.js +var require_W3CEBNF = __commonJS({ + "node_modules/ebnf/dist/Grammars/W3CEBNF.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var Parser_1 = require_Parser(); + var BNF; + (function(BNF2) { + BNF2.RULES = [ + { + name: "Grammar", + bnf: [["RULE_S*", "%Atomic*", "EOF"]] + }, + { + name: "%Atomic", + bnf: [["Production", "RULE_S*"]], + fragment: true + }, + { + name: "Production", + bnf: [["NCName", "RULE_S*", '"::="', "RULE_WHITESPACE*", "Choice", "RULE_WHITESPACE*", "RULE_EOL+", "RULE_S*"]] + }, + { + name: "NCName", + bnf: [[/[a-zA-Z][a-zA-Z_0-9]*/]] + }, + { + name: "Choice", + bnf: [["SequenceOrDifference", "%_Choice_1*"]], + fragment: true + }, + { + name: "%_Choice_1", + bnf: [["RULE_WHITESPACE*", '"|"', "RULE_WHITESPACE*", "SequenceOrDifference"]], + fragment: true + }, + { + name: "SequenceOrDifference", + bnf: [["Item", "RULE_WHITESPACE*", "%_Item_1?"]] + }, + { + name: "%_Item_1", + bnf: [["Minus", "Item"], ["Item*"]], + fragment: true + }, + { + name: "Minus", + bnf: [['"-"']] + }, + { + name: "Item", + bnf: [["RULE_WHITESPACE*", "%Primary", "PrimaryDecoration?"]], + fragment: true + }, + { + name: "PrimaryDecoration", + bnf: [['"?"'], ['"*"'], ['"+"']] + }, + { + name: "DecorationName", + bnf: [['"ebnf://"', /[^\x5D#]+/]] + }, + { + name: "%Primary", + bnf: [["NCName"], ["StringLiteral"], ["CharCode"], ["CharClass"], ["SubItem"]], + fragment: true + }, + { + name: "SubItem", + bnf: [['"("', "RULE_WHITESPACE*", "Choice", "RULE_WHITESPACE*", '")"']] + }, + { + name: "StringLiteral", + bnf: [[`'"'`, /[^"]*/, `'"'`], [`"'"`, /[^']*/, `"'"`]], + pinned: 1 + }, + { + name: "CharCode", + bnf: [['"#x"', /[0-9a-zA-Z]+/]] + }, + { + name: "CharClass", + bnf: [["'['", "'^'?", "%RULE_CharClass_1+", '"]"']] + }, + { + name: "%RULE_CharClass_1", + bnf: [["CharCodeRange"], ["CharRange"], ["CharCode"], ["RULE_Char"]], + fragment: true + }, + { + name: "RULE_Char", + bnf: [[/\x09/], [/\x0A/], [/\x0D/], [/[\x20-\x5c]/], [/[\x5e-\uD7FF]/], [/[\uE000-\uFFFD]/]] + }, + { + name: "CharRange", + bnf: [["RULE_Char", '"-"', "RULE_Char"]] + }, + { + name: "CharCodeRange", + bnf: [["CharCode", '"-"', "CharCode"]] + }, + { + name: "RULE_WHITESPACE", + bnf: [["%RULE_WHITESPACE_CHAR*"], ["Comment", "RULE_WHITESPACE*"]] + }, + { + name: "RULE_S", + bnf: [["RULE_WHITESPACE", "RULE_S*"], ["RULE_EOL", "RULE_S*"]] + }, + { + name: "%RULE_WHITESPACE_CHAR", + bnf: [[/\x09/], [/\x20/]], + fragment: true + }, + { + name: "Comment", + bnf: [['"/*"', "%RULE_Comment_Body*", '"*/"']] + }, + { + name: "%RULE_Comment_Body", + bnf: [['!"*/"', /[^*]/]], + fragment: true + }, + { + name: "RULE_EOL", + bnf: [[/\x0D/, /\x0A/], [/\x0A/], [/\x0D/]] + }, + { + name: "Link", + bnf: [["'['", "Url", "']'"]] + }, + { + name: "Url", + bnf: [[/[^\x5D:/?#]/, '"://"', /[^\x5D#]+/, "%Url1?"]] + }, + { + name: "%Url1", + bnf: [['"#"', "NCName"]], + fragment: true + } + ]; + BNF2.defaultParser = new Parser_1.Parser(BNF2.RULES, { debug: false }); + const preDecorationRE = /^(!|&)/; + const decorationRE = /(\?|\+|\*)$/; + const subExpressionRE = /^%/; + function getBNFRule(name, parser) { + if (typeof name == "string") { + if (preDecorationRE.test(name)) + return ""; + let subexpression = subExpressionRE.test(name); + if (subexpression) { + let decoration = decorationRE.exec(name); + let decorationText = decoration ? decoration[0] + " " : ""; + let lonely = isLonelyRule(name, parser); + if (lonely) + return getBNFBody(name, parser) + decorationText; + return "(" + getBNFBody(name, parser) + ")" + decorationText; + } + return name; + } else { + return name.source.replace(/\\(?:x|u)([a-zA-Z0-9]+)/g, "#x$1").replace(/\[\\(?:x|u)([a-zA-Z0-9]+)-\\(?:x|u)([a-zA-Z0-9]+)\]/g, "[#x$1-#x$2]"); + } + } + function isLonelyRule(name, parser) { + let rule = Parser_1.findRuleByName(name, parser); + return rule && rule.bnf.length == 1 && rule.bnf[0].length == 1 && (rule.bnf[0][0] instanceof RegExp || rule.bnf[0][0][0] == '"' || rule.bnf[0][0][0] == "'"); + } + function getBNFChoice(rules, parser) { + return rules.map((x) => getBNFRule(x, parser)).join(" "); + } + function getBNFBody(name, parser) { + let rule = Parser_1.findRuleByName(name, parser); + if (rule) + return rule.bnf.map((x) => getBNFChoice(x, parser)).join(" | "); + return "RULE_NOT_FOUND {" + name + "}"; + } + function emit(parser) { + let acumulator = []; + parser.grammarRules.forEach((l) => { + if (!/^%/.test(l.name)) { + let recover = l.recover ? " /* { recoverUntil=" + l.recover + " } */" : ""; + acumulator.push(l.name + " ::= " + getBNFBody(l.name, parser) + recover); + } + }); + return acumulator.join("\n"); + } + BNF2.emit = emit; + let subitems = 0; + function restar(total, resta) { + console.log("reberia restar " + resta + " a " + total); + throw new Error("Difference not supported yet"); + } + function convertRegex(txt) { + return new RegExp(txt.replace(/#x([a-zA-Z0-9]{4})/g, "\\u$1").replace(/#x([a-zA-Z0-9]{3})/g, "\\u0$1").replace(/#x([a-zA-Z0-9]{2})/g, "\\x$1").replace(/#x([a-zA-Z0-9]{1})/g, "\\x0$1")); + } + function getSubItems(tmpRules, seq, parentName) { + let anterior = null; + let bnfSeq = []; + seq.children.forEach((x, i) => { + if (x.type == "Minus") { + restar(anterior, x); + } else { + } + let decoration = seq.children[i + 1]; + decoration = decoration && decoration.type == "PrimaryDecoration" && decoration.text || ""; + let preDecoration = ""; + switch (x.type) { + case "SubItem": + let name = "%" + (parentName + subitems++); + createRule(tmpRules, x, name); + bnfSeq.push(preDecoration + name + decoration); + break; + case "NCName": + case "StringLiteral": + bnfSeq.push(preDecoration + x.text + decoration); + break; + case "CharCode": + case "CharClass": + if (decoration || preDecoration) { + let newRule = { + name: "%" + (parentName + subitems++), + bnf: [[convertRegex(x.text)]] + }; + tmpRules.push(newRule); + bnfSeq.push(preDecoration + newRule.name + decoration); + } else { + bnfSeq.push(convertRegex(x.text)); + } + break; + case "PrimaryDecoration": + break; + default: + throw new Error(" HOW SHOULD I PARSE THIS? " + x.type + " -> " + JSON.stringify(x.text)); + } + anterior = x; + }); + return bnfSeq; + } + function createRule(tmpRules, token, name) { + let bnf = token.children.filter((x) => x.type == "SequenceOrDifference").map((s) => getSubItems(tmpRules, s, name)); + let rule = { + name, + bnf + }; + let recover = null; + bnf.forEach((x) => { + recover = recover || x["recover"]; + delete x["recover"]; + }); + if (name.indexOf("%") == 0) + rule.fragment = true; + if (recover) + rule.recover = recover; + tmpRules.push(rule); + } + function getRules(source, parser = BNF2.defaultParser) { + let ast = parser.getAST(source); + if (!ast) + throw new Error("Could not parse " + source); + if (ast.errors && ast.errors.length) { + throw ast.errors[0]; + } + let tmpRules = []; + ast.children.filter((x) => x.type == "Production").map((x) => { + let name = x.children.filter((x2) => x2.type == "NCName")[0].text; + createRule(tmpRules, x, name); + }); + return tmpRules; + } + BNF2.getRules = getRules; + function Transform(source, subParser = BNF2.defaultParser) { + return getRules(source.join(""), subParser); + } + BNF2.Transform = Transform; + class Parser extends Parser_1.Parser { + constructor(source, options) { + const subParser = options && options.debugRulesParser === true ? new Parser_1.Parser(BNF2.RULES, { debug: true }) : BNF2.defaultParser; + super(getRules(source, subParser), options); + } + emitSource() { + return emit(this); + } + } + BNF2.Parser = Parser; + })(BNF || (BNF = {})); + exports.default = BNF; + } +}); + +// node_modules/ebnf/dist/Grammars/Custom.js +var require_Custom = __commonJS({ + "node_modules/ebnf/dist/Grammars/Custom.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var TokenError_1 = require_TokenError(); + var Parser_1 = require_Parser(); + var BNF; + (function(BNF2) { + BNF2.RULES = [ + { + name: "Grammar", + bnf: [["RULE_S*", "Attributes?", "RULE_S*", "%Atomic*", "EOF"]] + }, + { + name: "%Atomic", + bnf: [["Production", "RULE_S*"]], + fragment: true + }, + { + name: "Production", + bnf: [ + [ + "NCName", + "RULE_S*", + '"::="', + "RULE_WHITESPACE*", + "%Choice", + "RULE_WHITESPACE*", + "Attributes?", + "RULE_EOL+", + "RULE_S*" + ] + ] + }, + { + name: "NCName", + bnf: [[/[a-zA-Z][a-zA-Z_0-9]*/]] + }, + { + name: "Attributes", + bnf: [['"{"', "Attribute", "%Attributes*", "RULE_S*", '"}"']] + }, + { + name: "%Attributes", + bnf: [["RULE_S*", '","', "Attribute"]], + fragment: true + }, + { + name: "Attribute", + bnf: [["RULE_S*", "NCName", "RULE_WHITESPACE*", '"="', "RULE_WHITESPACE*", "AttributeValue"]] + }, + { + name: "AttributeValue", + bnf: [["NCName"], [/[1-9][0-9]*/]] + }, + { + name: "%Choice", + bnf: [["SequenceOrDifference", "%_Choice_1*"]], + fragment: true + }, + { + name: "%_Choice_1", + bnf: [["RULE_S*", '"|"', "RULE_S*", "SequenceOrDifference"]], + fragment: true + }, + { + name: "SequenceOrDifference", + bnf: [["%Item", "RULE_WHITESPACE*", "%_Item_1?"]] + }, + { + name: "%_Item_1", + bnf: [["Minus", "%Item"], ["%Item*"]], + fragment: true + }, + { + name: "Minus", + bnf: [['"-"']] + }, + { + name: "%Item", + bnf: [["RULE_WHITESPACE*", "PrimaryPreDecoration?", "%Primary", "PrimaryDecoration?"]], + fragment: true + }, + { + name: "PrimaryDecoration", + bnf: [['"?"'], ['"*"'], ['"+"']] + }, + { + name: "PrimaryPreDecoration", + bnf: [['"&"'], ['"!"'], ['"~"']] + }, + { + name: "%Primary", + bnf: [["NCName"], ["StringLiteral"], ["CharCode"], ["CharClass"], ["SubItem"]], + fragment: true + }, + { + name: "SubItem", + bnf: [['"("', "RULE_S*", "%Choice", "RULE_S*", '")"']] + }, + { + name: "StringLiteral", + bnf: [[`'"'`, /[^"]*/, `'"'`], [`"'"`, /[^']*/, `"'"`]] + }, + { + name: "CharCode", + bnf: [['"#x"', /[0-9a-zA-Z]+/]] + }, + { + name: "CharClass", + bnf: [["'['", "'^'?", "%RULE_CharClass_1+", '"]"']] + }, + { + name: "%RULE_CharClass_1", + bnf: [["CharCodeRange"], ["CharRange"], ["CharCode"], ["RULE_Char"]], + fragment: true + }, + { + name: "RULE_Char", + bnf: [[/\x09/], [/\x0A/], [/\x0D/], [/[\x20-\x5c]/], [/[\x5e-\uD7FF]/], [/[\uE000-\uFFFD]/]] + }, + { + name: "CharRange", + bnf: [["RULE_Char", '"-"', "RULE_Char"]] + }, + { + name: "CharCodeRange", + bnf: [["CharCode", '"-"', "CharCode"]] + }, + { + name: "RULE_WHITESPACE", + bnf: [["%RULE_WHITESPACE_CHAR*"], ["Comment", "RULE_WHITESPACE*"]] + }, + { + name: "RULE_S", + bnf: [["RULE_WHITESPACE", "RULE_S*"], ["RULE_EOL", "RULE_S*"]] + }, + { + name: "%RULE_WHITESPACE_CHAR", + bnf: [[/\x09/], [/\x20/]], + fragment: true + }, + { + name: "Comment", + bnf: [['"/*"', "%RULE_Comment_Body*", '"*/"']] + }, + { + name: "%RULE_Comment_Body", + bnf: [[/[^*]/], ['"*"+', /[^/]*/]], + fragment: true + }, + { + name: "RULE_EOL", + bnf: [[/\x0D/, /\x0A/], [/\x0A/], [/\x0D/]] + }, + { + name: "Link", + bnf: [["'['", "Url", "']'"]] + }, + { + name: "Url", + bnf: [[/[^\x5D:/?#]/, '"://"', /[^\x5D#]+/, "%Url1?"]] + }, + { + name: "%Url1", + bnf: [['"#"', "NCName"]], + fragment: true + } + ]; + BNF2.defaultParser = new Parser_1.Parser(BNF2.RULES, { debug: false }); + const preDecorationRE = /^(!|&)/; + const decorationRE = /(\?|\+|\*)$/; + const subExpressionRE = /^%/; + function getBNFRule(name, parser) { + if (typeof name == "string") { + let decoration = decorationRE.exec(name); + let preDecoration = preDecorationRE.exec(name); + let preDecorationText = preDecoration ? preDecoration[0] : ""; + let decorationText = decoration ? decoration[0] + " " : ""; + let subexpression = subExpressionRE.test(name); + if (subexpression) { + let lonely = isLonelyRule(name, parser); + if (lonely) + return preDecorationText + getBNFBody(name, parser) + decorationText; + return preDecorationText + "(" + getBNFBody(name, parser) + ")" + decorationText; + } + return name.replace(preDecorationRE, preDecorationText); + } else { + return name.source.replace(/\\(?:x|u)([a-zA-Z0-9]+)/g, "#x$1").replace(/\[\\(?:x|u)([a-zA-Z0-9]+)-\\(?:x|u)([a-zA-Z0-9]+)\]/g, "[#x$1-#x$2]"); + } + } + function isLonelyRule(name, parser) { + let rule = Parser_1.findRuleByName(name, parser); + return rule && rule.bnf.length == 1 && rule.bnf[0].length == 1 && (rule.bnf[0][0] instanceof RegExp || rule.bnf[0][0][0] == '"' || rule.bnf[0][0][0] == "'"); + } + function getBNFChoice(rules, parser) { + return rules.map((x) => getBNFRule(x, parser)).join(" "); + } + function getBNFBody(name, parser) { + let rule = Parser_1.findRuleByName(name, parser); + if (rule) + return rule.bnf.map((x) => getBNFChoice(x, parser)).join(" | "); + return "RULE_NOT_FOUND {" + name + "}"; + } + function emit(parser) { + let acumulator = []; + parser.grammarRules.forEach((l) => { + if (!/^%/.test(l.name)) { + let recover = l.recover ? " { recoverUntil=" + l.recover + " }" : ""; + acumulator.push(l.name + " ::= " + getBNFBody(l.name, parser) + recover); + } + }); + return acumulator.join("\n"); + } + BNF2.emit = emit; + let subitems = 0; + function restar(total, resta) { + console.log("reberia restar " + resta + " a " + total); + throw new Error("Difference not supported yet"); + } + function convertRegex(txt) { + return new RegExp(txt.replace(/#x([a-zA-Z0-9]{4})/g, "\\u$1").replace(/#x([a-zA-Z0-9]{3})/g, "\\u0$1").replace(/#x([a-zA-Z0-9]{2})/g, "\\x$1").replace(/#x([a-zA-Z0-9]{1})/g, "\\x0$1")); + } + function getSubItems(tmpRules, seq, parentName, parentAttributes) { + let anterior = null; + let bnfSeq = []; + seq.children.forEach((x, i) => { + if (x.type == "Minus") { + restar(anterior, x); + } else { + } + let decoration = seq.children[i + 1]; + decoration = decoration && decoration.type == "PrimaryDecoration" && decoration.text || ""; + let preDecoration = ""; + if (anterior && anterior.type == "PrimaryPreDecoration") { + preDecoration = anterior.text; + } + let pinned = preDecoration == "~" ? 1 : void 0; + if (pinned) { + preDecoration = ""; + } + switch (x.type) { + case "SubItem": + let name = "%" + (parentName + subitems++); + createRule(tmpRules, x, name, parentAttributes); + bnfSeq.push(preDecoration + name + decoration); + break; + case "NCName": + bnfSeq.push(preDecoration + x.text + decoration); + break; + case "StringLiteral": + if (decoration || preDecoration || !/^['"/()a-zA-Z0-9&_.:=,+*\-\^\\]+$/.test(x.text)) { + bnfSeq.push(preDecoration + x.text + decoration); + } else { + for (const c of x.text.slice(1, -1)) { + if (parentAttributes && parentAttributes["ignoreCase"] == "true" && /[a-zA-Z]/.test(c)) { + bnfSeq.push(new RegExp("[" + c.toUpperCase() + c.toLowerCase() + "]")); + } else { + bnfSeq.push(new RegExp(Parser_1.escapeRegExp(c))); + } + } + } + break; + case "CharCode": + case "CharClass": + if (decoration || preDecoration) { + let newRule = { + name: "%" + (parentName + subitems++), + bnf: [[convertRegex(x.text)]], + pinned + }; + tmpRules.push(newRule); + bnfSeq.push(preDecoration + newRule.name + decoration); + } else { + bnfSeq.push(convertRegex(x.text)); + } + break; + case "PrimaryPreDecoration": + case "PrimaryDecoration": + break; + default: + throw new Error(" HOW SHOULD I PARSE THIS? " + x.type + " -> " + JSON.stringify(x.text)); + } + anterior = x; + }); + return bnfSeq; + } + function createRule(tmpRules, token, name, parentAttributes = void 0) { + let attrNode = token.children.filter((x) => x.type == "Attributes")[0]; + let attributes = {}; + if (attrNode) { + attrNode.children.forEach((x) => { + let name2 = x.children.filter((x2) => x2.type == "NCName")[0].text; + if (name2 in attributes) { + throw new TokenError_1.TokenError("Duplicated attribute " + name2, x); + } else { + attributes[name2] = x.children.filter((x2) => x2.type == "AttributeValue")[0].text; + } + }); + } + let bnf = token.children.filter((x) => x.type == "SequenceOrDifference").map((s) => getSubItems(tmpRules, s, name, parentAttributes ? parentAttributes : attributes)); + let rule = { + name, + bnf + }; + if (name.indexOf("%") == 0) + rule.fragment = true; + if (attributes["recoverUntil"]) { + rule.recover = attributes["recoverUntil"]; + if (rule.bnf.length > 1) + throw new TokenError_1.TokenError("only one-option productions are suitable for error recovering", token); + } + if ("pin" in attributes) { + let num = parseInt(attributes["pin"]); + if (!isNaN(num)) { + rule.pinned = num; + } + if (rule.bnf.length > 1) + throw new TokenError_1.TokenError("only one-option productions are suitable for pinning", token); + } + if ("ws" in attributes) { + rule.implicitWs = attributes["ws"] != "explicit"; + } else { + rule.implicitWs = null; + } + rule.fragment = rule.fragment || attributes["fragment"] == "true"; + rule.simplifyWhenOneChildren = attributes["simplifyWhenOneChildren"] == "true"; + tmpRules.push(rule); + } + function getRules(source, parser = BNF2.defaultParser) { + let ast = parser.getAST(source); + if (!ast) + throw new Error("Could not parse " + source); + if (ast.errors && ast.errors.length) { + throw ast.errors[0]; + } + let implicitWs = null; + let attrNode = ast.children.filter((x) => x.type == "Attributes")[0]; + let attributes = {}; + if (attrNode) { + attrNode.children.forEach((x) => { + let name = x.children.filter((x2) => x2.type == "NCName")[0].text; + if (name in attributes) { + throw new TokenError_1.TokenError("Duplicated attribute " + name, x); + } else { + attributes[name] = x.children.filter((x2) => x2.type == "AttributeValue")[0].text; + } + }); + } + implicitWs = attributes["ws"] == "implicit"; + let tmpRules = []; + ast.children.filter((x) => x.type == "Production").map((x) => { + let name = x.children.filter((x2) => x2.type == "NCName")[0].text; + createRule(tmpRules, x, name); + }); + tmpRules.forEach((rule) => { + if (rule.implicitWs === null) + rule.implicitWs = implicitWs; + }); + return tmpRules; + } + BNF2.getRules = getRules; + function Transform(source, subParser = BNF2.defaultParser) { + return getRules(source.join(""), subParser); + } + BNF2.Transform = Transform; + class Parser extends Parser_1.Parser { + constructor(source, options) { + const subParser = options && options.debugRulesParser === true ? new Parser_1.Parser(BNF2.RULES, { debug: true }) : BNF2.defaultParser; + super(getRules(source, subParser), options); + } + emitSource() { + return emit(this); + } + } + BNF2.Parser = Parser; + })(BNF || (BNF = {})); + exports.default = BNF; + } +}); + +// node_modules/ebnf/dist/Grammars/index.js +var require_Grammars = __commonJS({ + "node_modules/ebnf/dist/Grammars/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var BNF_1 = require_BNF(); + Object.defineProperty(exports, "BNF", { enumerable: true, get: function() { + return BNF_1.default; + } }); + var W3CEBNF_1 = require_W3CEBNF(); + Object.defineProperty(exports, "W3C", { enumerable: true, get: function() { + return W3CEBNF_1.default; + } }); + var Custom_1 = require_Custom(); + Object.defineProperty(exports, "Custom", { enumerable: true, get: function() { + return Custom_1.default; + } }); + } +}); + +// node_modules/ebnf/dist/index.js +var require_dist = __commonJS({ + "node_modules/ebnf/dist/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var Parser_1 = require_Parser(); + Object.defineProperty(exports, "Parser", { enumerable: true, get: function() { + return Parser_1.Parser; + } }); + var TokenError_1 = require_TokenError(); + Object.defineProperty(exports, "TokenError", { enumerable: true, get: function() { + return TokenError_1.TokenError; + } }); + exports.Grammars = require_Grammars(); + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/calc/calc.js +var require_calc = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/calc/calc.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseFormula = exports.parseAndApply = exports.Source = exports.Formula = void 0; + var neverthrow_1 = require_neverthrow(); + var algebraic_operation_1 = require_algebraic_operation(); + var ast_utils_1 = require_ast_utils(); + var conditional_function_1 = require_conditional_function(); + var constant_1 = require_constant(); + var destination_1 = require_destination(); + var display_directive_1 = require_display_directive(); + var range_1 = require_range2(); + var reference_1 = require_reference(); + var single_param_function_1 = require_single_param_function(); + var ebnf_1 = require_dist(); + var lodash_1 = require_lodash(); + var parserGrammar = ` +tblfm_line ::= "" +formula_list ::= formula ( "::" formula_list )? +formula ::= destination "=" source display_directive? + +source ::= range | source_reference | single_param_function_call | conditional_function_call | algebraic_operation | float | real +range ::= source_reference ".." source_reference +source_reference ::= absolute_reference | relative_reference +destination ::= range | absolute_reference + +relative_reference ::= (relative_row | absolute_row) (relative_column | absolute_column) | relative_row | relative_column +relative_row ::= "@" ( "-" | "+" ) int +relative_column ::= "$" ( "-" | "+" ) int + +absolute_reference ::= absolute_row absolute_column | absolute_row | absolute_column +absolute_row ::= "@" ( "I" | "<" | ">" | int ) +absolute_column ::= "$" ( "<" | ">" | int ) + +single_param_function_call ::= single_param_function "(" source ")" +single_param_function ::= "mean" | "sum" + +conditional_function_call ::= "if(" predicate "," " "? source "," " "? source ")" +predicate ::= source_without_range conditional_operator source_without_range +source_without_range ::= source_reference | single_param_function_call | conditional_function_call | algebraic_operation | float | real +conditional_operator ::= ">" | "<" | ">=" | "<=" | "==" | "!=" + +algebraic_operation ::= "(" source " "? algebraic_operator " "? source ")" +algebraic_operator ::= "+" | "-" | "*" | "/" + +display_directive ::= ";" display_directive_option +display_directive_option ::= formatting_directive | datetime_directive | hourminute_directive +formatting_directive ::= "%." int "f" +datetime_directive ::= "dt" +hourminute_directive ::= "hm" + +float ::= "-"? int "." int +real ::= "-"? int +int ::= [0-9]+ +`; + var Formula = class { + constructor(ast, table) { + this.merge = (table2) => this.destination.merge(this.source, table2); + let formatter = new display_directive_1.DefaultFormatter(); + if (ast.children.length === 3) { + formatter = new display_directive_1.DisplayDirective(ast.children[2]); + } + const destination = (0, destination_1.newDestination)(ast.children[0], table, formatter); + if (destination.isErr()) { + throw destination.error; + } + this.destination = destination.value; + this.source = new Source(ast.children[1], table); + } + }; + exports.Formula = Formula; + var Source = class { + constructor(ast, table) { + this.getValue = (table2, currentCell) => this.locationDescriptor.getValue(table2, currentCell); + if (ast.type !== "source" && ast.type !== "source_without_range") { + throw Error("Invalid AST token type of " + ast.type); + } + if (ast.children.length !== 1) { + throw Error("Unexpected children length in Source"); + } + const paramChild = ast.children[0]; + const vp = newValueProvider(paramChild, table); + if (vp.isErr()) { + throw vp.error; + } + this.locationDescriptor = vp.value; + } + }; + exports.Source = Source; + var newValueProvider = (ast, table) => { + try { + switch (ast.type) { + case "range": + return (0, neverthrow_1.ok)(new range_1.Range(ast, table)); + case "source_reference": + const lengthError = (0, ast_utils_1.checkChildLength)(ast, 1); + if (lengthError) { + return (0, neverthrow_1.err)(lengthError); + } + return (0, neverthrow_1.ok)(new reference_1.Reference(ast.children[0], table)); + case "single_param_function_call": + return (0, neverthrow_1.ok)(new single_param_function_1.SingleParamFunctionCall(ast, table)); + case "conditional_function_call": + return (0, neverthrow_1.ok)(new conditional_function_1.ConditionalFunctionCall(ast, table)); + case "algebraic_operation": + return (0, neverthrow_1.ok)(new algebraic_operation_1.AlgebraicOperation(ast, table)); + case "real": + return (0, neverthrow_1.ok)(new constant_1.Constant(ast, table)); + case "float": + return (0, neverthrow_1.ok)(new constant_1.Constant(ast, table)); + default: + throw Error("Unrecognized valueProvider type " + ast.type); + } + } catch (error) { + return (0, neverthrow_1.err)(error); + } + }; + var parseAndApply = (formulaLines, table) => { + const formulas = formulaLines.reduce((prev, formulaLine) => prev.andThen((currentFormulas) => { + const newFormulas = (0, exports.parseFormula)(formulaLine, table); + if (newFormulas.isErr()) { + return newFormulas; + } + return (0, neverthrow_1.ok)((0, lodash_1.concat)(newFormulas.value, currentFormulas)); + }), (0, neverthrow_1.ok)([])); + return formulas.andThen((innerFormulas) => ( + // for each formula + innerFormulas.reduceRight( + (prevValue, formula) => ( + // If the previous formula didn't give an error + prevValue.andThen((prevTable) => ( + // attempt to apply this formula to the table and return the result + formula.merge(prevTable) + )) + ), + // Start with the current table state + (0, neverthrow_1.ok)(table) + ) + )); + }; + exports.parseAndApply = parseAndApply; + var parseFormula = (line, table) => { + const parser = new ebnf_1.Grammars.W3C.Parser(parserGrammar); + const ast = parser.getAST(line); + if (!ast) { + return (0, neverthrow_1.err)(new Error(`Formula '${line}' could not be parsed`)); + } + const typeError = (0, ast_utils_1.checkType)(ast, "tblfm_line"); + if (typeError) { + return (0, neverthrow_1.err)(typeError); + } + const lengthError = (0, ast_utils_1.checkChildLength)(ast, 1); + if (lengthError) { + return (0, neverthrow_1.err)(lengthError); + } + let unparsedFormulas = ast.children[0].children; + const formulas = []; + try { + do { + formulas.push(new Formula(unparsedFormulas[0], table)); + if (unparsedFormulas.length > 1 && unparsedFormulas[1].type === "formula_list") { + unparsedFormulas = unparsedFormulas[1].children; + } else { + unparsedFormulas = []; + } + } while (unparsedFormulas.length > 0); + return (0, neverthrow_1.ok)(formulas); + } catch (error) { + return (0, neverthrow_1.err)(error); + } + }; + exports.parseFormula = parseFormula; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/table.js +var require_table = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/table.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.Table = void 0; + var calc_1 = require_calc(); + var focus_1 = require_focus(); + var point_1 = require_point(); + var range_1 = require_range(); + var Table = class _Table { + /** + * Creates a new `Table` object. + * + * @param rows - An array of rows that the table contains. + * @param formulas - An array of formulas attached to the table. + */ + constructor(rows) { + this._rows = rows.slice(); + } + /** + * Gets the number of rows in the table. + * + * @returns The number of rows. + */ + getHeight() { + return this._rows.length; + } + /** + * Gets the maximum width of the rows in the table. + * + * @returns The maximum width of the rows. + */ + getWidth() { + return this._rows.map((row) => row.getWidth()).reduce((x, y) => Math.max(x, y), 0); + } + /** + * Gets the width of the header row. + * Assumes that it is called on a valid table with a header row. + * + * @returns The width of the header row + */ + getHeaderWidth() { + return this._rows[0].getWidth(); + } + /** + * Gets the rows that the table contains. + * + * @returns An array of the rows. + */ + getRows() { + return this._rows.slice(); + } + /** + * Gets the delimiter row of the table. + * + * @returns The delimiter row; `undefined` if there is not delimiter row. + */ + getDelimiterRow() { + const row = this._rows[1]; + if (row === void 0) { + return void 0; + } + if (row.isDelimiter()) { + return row; + } + return void 0; + } + /** + * Gets a cell at the specified index. + * + * @param rowIndex - Row index of the cell. + * @param columnIndex - Column index of the cell. + * @returns The cell at the specified index; `undefined` if not found. + */ + getCellAt(rowIndex, columnIndex) { + const row = this._rows[rowIndex]; + if (row === void 0) { + return void 0; + } + return row.getCellAt(columnIndex); + } + /** + * Gets the cell at the focus. + * + * @param focus - Focus object. + * @returns The cell at the focus; `undefined` if not found. + */ + getFocusedCell(focus) { + return this.getCellAt(focus.row, focus.column); + } + /** + * Converts the table to an array of text representations of the rows. + * + * @returns An array of text representations of the rows. + */ + toLines() { + return this._rows.map((row) => row.toText()); + } + /** + * Sets a cell in the table to a new value, returning a copy of the table + * with the modified value. + * + * If an invalid index is provided, the table will be unchanged. + */ + setCellAt(rowIndex, columnIndex, value) { + const rows = this.getRows(); + rows[rowIndex] = rows[rowIndex].setCellAt(columnIndex, value); + return new _Table(rows); + } + /** + * Computes a focus from a point in the text editor. + * + * @param pos - A point in the text editor. + * @param rowOffset - The row index where the table starts in the text editor. + * @returns A focus object that corresponds to the specified point; + * `undefined` if the row index is out of bounds. + */ + focusOfPosition(pos, rowOffset) { + const rowIndex = pos.row - rowOffset; + const row = this._rows[rowIndex]; + if (row === void 0) { + return void 0; + } + if (pos.column < row.marginLeft.length + 1) { + return new focus_1.Focus(rowIndex, -1, pos.column); + } + const cellWidths = row.getCells().map((cell) => cell.rawContent.length); + let columnPos = row.marginLeft.length + 1; + let columnIndex = 0; + for (; columnIndex < cellWidths.length; columnIndex++) { + if (columnPos + cellWidths[columnIndex] + 1 > pos.column) { + break; + } + columnPos += cellWidths[columnIndex] + 1; + } + const offset = pos.column - columnPos; + return new focus_1.Focus(rowIndex, columnIndex, offset); + } + /** + * Computes a position in the text editor from a focus. + * + * @param focus - A focus object. + * @param rowOffset - The row index where the table starts in the text editor. + * @returns A position in the text editor that corresponds to the focus; + * `undefined` if the focused row is out of the table. + */ + positionOfFocus(focus, rowOffset) { + const row = this._rows[focus.row]; + if (row === void 0) { + return void 0; + } + const rowPos = focus.row + rowOffset; + if (focus.column < 0) { + return new point_1.Point(rowPos, focus.offset); + } + const cellWidths = row.getCells().map((cell) => cell.rawContent.length); + const maxIndex = Math.min(focus.column, cellWidths.length); + let columnPos = row.marginLeft.length + 1; + for (let columnIndex = 0; columnIndex < maxIndex; columnIndex++) { + columnPos += cellWidths[columnIndex] + 1; + } + return new point_1.Point(rowPos, columnPos + focus.offset); + } + /** + * Computes a selection range from a focus. + * + * @param focus - A focus object. + * @param rowOffset - The row index where the table starts in the text editor. + * @returns A range to be selected that corresponds to the focus; + * `undefined` if the focus does not specify any cell or the specified cell is empty. + */ + selectionRangeOfFocus(focus, rowOffset) { + const row = this._rows[focus.row]; + if (row === void 0) { + return void 0; + } + const cell = row.getCellAt(focus.column); + if (cell === void 0) { + return void 0; + } + if (cell.content === "") { + return void 0; + } + const rowPos = focus.row + rowOffset; + const cellWidths = row.getCells().map((cell2) => cell2.rawContent.length); + let columnPos = row.marginLeft.length + 1; + for (let columnIndex = 0; columnIndex < focus.column; columnIndex++) { + columnPos += cellWidths[columnIndex] + 1; + } + columnPos += cell.paddingLeft; + return new range_1.Range(new point_1.Point(rowPos, columnPos), new point_1.Point(rowPos, columnPos + cell.content.length)); + } + /** + * Evaluate the formula, applying the results to this table and returning the + * changes as a new table. + */ + applyFormulas(formulaLines) { + return (0, calc_1.parseAndApply)(formulaLines, this); + } + }; + exports.Table = Table; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/parser.js +var require_parser = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/parser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.readTable = exports._marginRegex = exports.marginRegexSrc = exports._readRow = exports._splitCells = void 0; + var table_1 = require_table(); + var table_cell_1 = require_table_cell(); + var table_row_1 = require_table_row(); + var _splitCells = (text) => { + const cells = []; + let buf = ""; + let rest = text; + while (rest !== "") { + switch (rest[0]) { + case "`": + { + const startMatch = rest.match(/^`*/); + if (startMatch === null) { + break; + } + const start = startMatch[0]; + let buf1 = start; + let rest1 = rest.substr(start.length); + let closed = false; + while (rest1 !== "") { + if (rest1[0] === "`") { + const endMatch = rest1.match(/^`*/); + if (endMatch === null) { + break; + } + const end = endMatch[0]; + buf1 += end; + rest1 = rest1.substr(end.length); + if (end.length === start.length) { + closed = true; + break; + } + } else { + buf1 += rest1[0]; + rest1 = rest1.substr(1); + } + } + if (closed) { + buf += buf1; + rest = rest1; + } else { + buf += "`"; + rest = rest.substr(1); + } + } + break; + case "\\": + if (rest.length >= 2) { + buf += rest.substr(0, 2); + rest = rest.substr(2); + } else { + buf += "\\"; + rest = rest.substr(1); + } + break; + case "[": + buf += "["; + rest = rest.substr(1); + if (/\[[^\\|\]]+\|[^|\]]+]]/.test(rest)) { + const idx = rest.indexOf("|"); + buf += rest.slice(0, idx); + buf += "\\|"; + rest = rest.substr(idx + 1); + } + break; + case "|": + cells.push(buf); + buf = ""; + rest = rest.substr(1); + break; + default: + buf += rest[0]; + rest = rest.substr(1); + } + } + cells.push(buf); + return cells; + }; + exports._splitCells = _splitCells; + var _readRow = (text, leftMarginRegex = /^\s*$/) => { + let cells = (0, exports._splitCells)(text); + let marginLeft; + if (cells.length > 0 && leftMarginRegex.test(cells[0])) { + marginLeft = cells[0]; + cells = cells.slice(1); + } else { + marginLeft = ""; + } + let marginRight; + if (cells.length > 1 && /^\s*$/.test(cells[cells.length - 1])) { + marginRight = cells[cells.length - 1]; + cells = cells.slice(0, cells.length - 1); + } else { + marginRight = ""; + } + return new table_row_1.TableRow(cells.map((cell) => new table_cell_1.TableCell(cell)), marginLeft, marginRight); + }; + exports._readRow = _readRow; + var marginRegexSrc = (chars) => { + let cs = ""; + chars.forEach((c) => { + if (c !== "|" && c !== "\\" && c !== "`") { + cs += `\\u{${c.codePointAt(0).toString(16)}}`; + } + }); + return `[\\s${cs}]*`; + }; + exports.marginRegexSrc = marginRegexSrc; + var _marginRegex = (chars) => new RegExp(`^${(0, exports.marginRegexSrc)(chars)}$`, "u"); + exports._marginRegex = _marginRegex; + var readTable = (lines, options) => { + const leftMarginRegex = (0, exports._marginRegex)(options.leftMarginChars); + return new table_1.Table(lines.map((line) => (0, exports._readRow)(line, leftMarginRegex))); + }; + exports.readTable = readTable; + } +}); + +// node_modules/meaw/lib/index.js +var require_lib = __commonJS({ + "node_modules/meaw/lib/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var defs = [ + [0, 31, "N"], + [32, 126, "Na"], + [127, 160, "N"], + [161, 161, "A"], + [162, 163, "Na"], + [164, 164, "A"], + [165, 166, "Na"], + [167, 168, "A"], + [169, 169, "N"], + [170, 170, "A"], + [171, 171, "N"], + [172, 172, "Na"], + [173, 174, "A"], + [175, 175, "Na"], + [176, 180, "A"], + [181, 181, "N"], + [182, 186, "A"], + [187, 187, "N"], + [188, 191, "A"], + [192, 197, "N"], + [198, 198, "A"], + [199, 207, "N"], + [208, 208, "A"], + [209, 214, "N"], + [215, 216, "A"], + [217, 221, "N"], + [222, 225, "A"], + [226, 229, "N"], + [230, 230, "A"], + [231, 231, "N"], + [232, 234, "A"], + [235, 235, "N"], + [236, 237, "A"], + [238, 239, "N"], + [240, 240, "A"], + [241, 241, "N"], + [242, 243, "A"], + [244, 246, "N"], + [247, 250, "A"], + [251, 251, "N"], + [252, 252, "A"], + [253, 253, "N"], + [254, 254, "A"], + [255, 256, "N"], + [257, 257, "A"], + [258, 272, "N"], + [273, 273, "A"], + [274, 274, "N"], + [275, 275, "A"], + [276, 282, "N"], + [283, 283, "A"], + [284, 293, "N"], + [294, 295, "A"], + [296, 298, "N"], + [299, 299, "A"], + [300, 304, "N"], + [305, 307, "A"], + [308, 311, "N"], + [312, 312, "A"], + [313, 318, "N"], + [319, 322, "A"], + [323, 323, "N"], + [324, 324, "A"], + [325, 327, "N"], + [328, 331, "A"], + [332, 332, "N"], + [333, 333, "A"], + [334, 337, "N"], + [338, 339, "A"], + [340, 357, "N"], + [358, 359, "A"], + [360, 362, "N"], + [363, 363, "A"], + [364, 461, "N"], + [462, 462, "A"], + [463, 463, "N"], + [464, 464, "A"], + [465, 465, "N"], + [466, 466, "A"], + [467, 467, "N"], + [468, 468, "A"], + [469, 469, "N"], + [470, 470, "A"], + [471, 471, "N"], + [472, 472, "A"], + [473, 473, "N"], + [474, 474, "A"], + [475, 475, "N"], + [476, 476, "A"], + [477, 592, "N"], + [593, 593, "A"], + [594, 608, "N"], + [609, 609, "A"], + [610, 707, "N"], + [708, 708, "A"], + [709, 710, "N"], + [711, 711, "A"], + [712, 712, "N"], + [713, 715, "A"], + [716, 716, "N"], + [717, 717, "A"], + [718, 719, "N"], + [720, 720, "A"], + [721, 727, "N"], + [728, 731, "A"], + [732, 732, "N"], + [733, 733, "A"], + [734, 734, "N"], + [735, 735, "A"], + [736, 767, "N"], + [768, 879, "A"], + [880, 912, "N"], + [913, 929, "A"], + [930, 930, "N"], + [931, 937, "A"], + [938, 944, "N"], + [945, 961, "A"], + [962, 962, "N"], + [963, 969, "A"], + [970, 1024, "N"], + [1025, 1025, "A"], + [1026, 1039, "N"], + [1040, 1103, "A"], + [1104, 1104, "N"], + [1105, 1105, "A"], + [1106, 4351, "N"], + [4352, 4447, "W"], + [4448, 8207, "N"], + [8208, 8208, "A"], + [8209, 8210, "N"], + [8211, 8214, "A"], + [8215, 8215, "N"], + [8216, 8217, "A"], + [8218, 8219, "N"], + [8220, 8221, "A"], + [8222, 8223, "N"], + [8224, 8226, "A"], + [8227, 8227, "N"], + [8228, 8231, "A"], + [8232, 8239, "N"], + [8240, 8240, "A"], + [8241, 8241, "N"], + [8242, 8243, "A"], + [8244, 8244, "N"], + [8245, 8245, "A"], + [8246, 8250, "N"], + [8251, 8251, "A"], + [8252, 8253, "N"], + [8254, 8254, "A"], + [8255, 8307, "N"], + [8308, 8308, "A"], + [8309, 8318, "N"], + [8319, 8319, "A"], + [8320, 8320, "N"], + [8321, 8324, "A"], + [8325, 8360, "N"], + [8361, 8361, "H"], + [8362, 8363, "N"], + [8364, 8364, "A"], + [8365, 8450, "N"], + [8451, 8451, "A"], + [8452, 8452, "N"], + [8453, 8453, "A"], + [8454, 8456, "N"], + [8457, 8457, "A"], + [8458, 8466, "N"], + [8467, 8467, "A"], + [8468, 8469, "N"], + [8470, 8470, "A"], + [8471, 8480, "N"], + [8481, 8482, "A"], + [8483, 8485, "N"], + [8486, 8486, "A"], + [8487, 8490, "N"], + [8491, 8491, "A"], + [8492, 8530, "N"], + [8531, 8532, "A"], + [8533, 8538, "N"], + [8539, 8542, "A"], + [8543, 8543, "N"], + [8544, 8555, "A"], + [8556, 8559, "N"], + [8560, 8569, "A"], + [8570, 8584, "N"], + [8585, 8585, "A"], + [8586, 8591, "N"], + [8592, 8601, "A"], + [8602, 8631, "N"], + [8632, 8633, "A"], + [8634, 8657, "N"], + [8658, 8658, "A"], + [8659, 8659, "N"], + [8660, 8660, "A"], + [8661, 8678, "N"], + [8679, 8679, "A"], + [8680, 8703, "N"], + [8704, 8704, "A"], + [8705, 8705, "N"], + [8706, 8707, "A"], + [8708, 8710, "N"], + [8711, 8712, "A"], + [8713, 8714, "N"], + [8715, 8715, "A"], + [8716, 8718, "N"], + [8719, 8719, "A"], + [8720, 8720, "N"], + [8721, 8721, "A"], + [8722, 8724, "N"], + [8725, 8725, "A"], + [8726, 8729, "N"], + [8730, 8730, "A"], + [8731, 8732, "N"], + [8733, 8736, "A"], + [8737, 8738, "N"], + [8739, 8739, "A"], + [8740, 8740, "N"], + [8741, 8741, "A"], + [8742, 8742, "N"], + [8743, 8748, "A"], + [8749, 8749, "N"], + [8750, 8750, "A"], + [8751, 8755, "N"], + [8756, 8759, "A"], + [8760, 8763, "N"], + [8764, 8765, "A"], + [8766, 8775, "N"], + [8776, 8776, "A"], + [8777, 8779, "N"], + [8780, 8780, "A"], + [8781, 8785, "N"], + [8786, 8786, "A"], + [8787, 8799, "N"], + [8800, 8801, "A"], + [8802, 8803, "N"], + [8804, 8807, "A"], + [8808, 8809, "N"], + [8810, 8811, "A"], + [8812, 8813, "N"], + [8814, 8815, "A"], + [8816, 8833, "N"], + [8834, 8835, "A"], + [8836, 8837, "N"], + [8838, 8839, "A"], + [8840, 8852, "N"], + [8853, 8853, "A"], + [8854, 8856, "N"], + [8857, 8857, "A"], + [8858, 8868, "N"], + [8869, 8869, "A"], + [8870, 8894, "N"], + [8895, 8895, "A"], + [8896, 8977, "N"], + [8978, 8978, "A"], + [8979, 8985, "N"], + [8986, 8987, "W"], + [8988, 9e3, "N"], + [9001, 9002, "W"], + [9003, 9192, "N"], + [9193, 9196, "W"], + [9197, 9199, "N"], + [9200, 9200, "W"], + [9201, 9202, "N"], + [9203, 9203, "W"], + [9204, 9311, "N"], + [9312, 9449, "A"], + [9450, 9450, "N"], + [9451, 9547, "A"], + [9548, 9551, "N"], + [9552, 9587, "A"], + [9588, 9599, "N"], + [9600, 9615, "A"], + [9616, 9617, "N"], + [9618, 9621, "A"], + [9622, 9631, "N"], + [9632, 9633, "A"], + [9634, 9634, "N"], + [9635, 9641, "A"], + [9642, 9649, "N"], + [9650, 9651, "A"], + [9652, 9653, "N"], + [9654, 9655, "A"], + [9656, 9659, "N"], + [9660, 9661, "A"], + [9662, 9663, "N"], + [9664, 9665, "A"], + [9666, 9669, "N"], + [9670, 9672, "A"], + [9673, 9674, "N"], + [9675, 9675, "A"], + [9676, 9677, "N"], + [9678, 9681, "A"], + [9682, 9697, "N"], + [9698, 9701, "A"], + [9702, 9710, "N"], + [9711, 9711, "A"], + [9712, 9724, "N"], + [9725, 9726, "W"], + [9727, 9732, "N"], + [9733, 9734, "A"], + [9735, 9736, "N"], + [9737, 9737, "A"], + [9738, 9741, "N"], + [9742, 9743, "A"], + [9744, 9747, "N"], + [9748, 9749, "W"], + [9750, 9755, "N"], + [9756, 9756, "A"], + [9757, 9757, "N"], + [9758, 9758, "A"], + [9759, 9791, "N"], + [9792, 9792, "A"], + [9793, 9793, "N"], + [9794, 9794, "A"], + [9795, 9799, "N"], + [9800, 9811, "W"], + [9812, 9823, "N"], + [9824, 9825, "A"], + [9826, 9826, "N"], + [9827, 9829, "A"], + [9830, 9830, "N"], + [9831, 9834, "A"], + [9835, 9835, "N"], + [9836, 9837, "A"], + [9838, 9838, "N"], + [9839, 9839, "A"], + [9840, 9854, "N"], + [9855, 9855, "W"], + [9856, 9874, "N"], + [9875, 9875, "W"], + [9876, 9885, "N"], + [9886, 9887, "A"], + [9888, 9888, "N"], + [9889, 9889, "W"], + [9890, 9897, "N"], + [9898, 9899, "W"], + [9900, 9916, "N"], + [9917, 9918, "W"], + [9919, 9919, "A"], + [9920, 9923, "N"], + [9924, 9925, "W"], + [9926, 9933, "A"], + [9934, 9934, "W"], + [9935, 9939, "A"], + [9940, 9940, "W"], + [9941, 9953, "A"], + [9954, 9954, "N"], + [9955, 9955, "A"], + [9956, 9959, "N"], + [9960, 9961, "A"], + [9962, 9962, "W"], + [9963, 9969, "A"], + [9970, 9971, "W"], + [9972, 9972, "A"], + [9973, 9973, "W"], + [9974, 9977, "A"], + [9978, 9978, "W"], + [9979, 9980, "A"], + [9981, 9981, "W"], + [9982, 9983, "A"], + [9984, 9988, "N"], + [9989, 9989, "W"], + [9990, 9993, "N"], + [9994, 9995, "W"], + [9996, 10023, "N"], + [10024, 10024, "W"], + [10025, 10044, "N"], + [10045, 10045, "A"], + [10046, 10059, "N"], + [10060, 10060, "W"], + [10061, 10061, "N"], + [10062, 10062, "W"], + [10063, 10066, "N"], + [10067, 10069, "W"], + [10070, 10070, "N"], + [10071, 10071, "W"], + [10072, 10101, "N"], + [10102, 10111, "A"], + [10112, 10132, "N"], + [10133, 10135, "W"], + [10136, 10159, "N"], + [10160, 10160, "W"], + [10161, 10174, "N"], + [10175, 10175, "W"], + [10176, 10213, "N"], + [10214, 10221, "Na"], + [10222, 10628, "N"], + [10629, 10630, "Na"], + [10631, 11034, "N"], + [11035, 11036, "W"], + [11037, 11087, "N"], + [11088, 11088, "W"], + [11089, 11092, "N"], + [11093, 11093, "W"], + [11094, 11097, "A"], + [11098, 11903, "N"], + [11904, 11929, "W"], + [11930, 11930, "N"], + [11931, 12019, "W"], + [12020, 12031, "N"], + [12032, 12245, "W"], + [12246, 12271, "N"], + [12272, 12283, "W"], + [12284, 12287, "N"], + [12288, 12288, "F"], + [12289, 12350, "W"], + [12351, 12352, "N"], + [12353, 12438, "W"], + [12439, 12440, "N"], + [12441, 12543, "W"], + [12544, 12548, "N"], + [12549, 12591, "W"], + [12592, 12592, "N"], + [12593, 12686, "W"], + [12687, 12687, "N"], + [12688, 12771, "W"], + [12772, 12783, "N"], + [12784, 12830, "W"], + [12831, 12831, "N"], + [12832, 12871, "W"], + [12872, 12879, "A"], + [12880, 19903, "W"], + [19904, 19967, "N"], + [19968, 42124, "W"], + [42125, 42127, "N"], + [42128, 42182, "W"], + [42183, 43359, "N"], + [43360, 43388, "W"], + [43389, 44031, "N"], + [44032, 55203, "W"], + [55204, 57343, "N"], + [57344, 63743, "A"], + [63744, 64255, "W"], + [64256, 65023, "N"], + [65024, 65039, "A"], + [65040, 65049, "W"], + [65050, 65071, "N"], + [65072, 65106, "W"], + [65107, 65107, "N"], + [65108, 65126, "W"], + [65127, 65127, "N"], + [65128, 65131, "W"], + [65132, 65280, "N"], + [65281, 65376, "F"], + [65377, 65470, "H"], + [65471, 65473, "N"], + [65474, 65479, "H"], + [65480, 65481, "N"], + [65482, 65487, "H"], + [65488, 65489, "N"], + [65490, 65495, "H"], + [65496, 65497, "N"], + [65498, 65500, "H"], + [65501, 65503, "N"], + [65504, 65510, "F"], + [65511, 65511, "N"], + [65512, 65518, "H"], + [65519, 65532, "N"], + [65533, 65533, "A"], + [65534, 94175, "N"], + [94176, 94180, "W"], + [94181, 94191, "N"], + [94192, 94193, "W"], + [94194, 94207, "N"], + [94208, 100343, "W"], + [100344, 100351, "N"], + [100352, 101589, "W"], + [101590, 101631, "N"], + [101632, 101640, "W"], + [101641, 110591, "N"], + [110592, 110878, "W"], + [110879, 110927, "N"], + [110928, 110930, "W"], + [110931, 110947, "N"], + [110948, 110951, "W"], + [110952, 110959, "N"], + [110960, 111355, "W"], + [111356, 126979, "N"], + [126980, 126980, "W"], + [126981, 127182, "N"], + [127183, 127183, "W"], + [127184, 127231, "N"], + [127232, 127242, "A"], + [127243, 127247, "N"], + [127248, 127277, "A"], + [127278, 127279, "N"], + [127280, 127337, "A"], + [127338, 127343, "N"], + [127344, 127373, "A"], + [127374, 127374, "W"], + [127375, 127376, "A"], + [127377, 127386, "W"], + [127387, 127404, "A"], + [127405, 127487, "N"], + [127488, 127490, "W"], + [127491, 127503, "N"], + [127504, 127547, "W"], + [127548, 127551, "N"], + [127552, 127560, "W"], + [127561, 127567, "N"], + [127568, 127569, "W"], + [127570, 127583, "N"], + [127584, 127589, "W"], + [127590, 127743, "N"], + [127744, 127776, "W"], + [127777, 127788, "N"], + [127789, 127797, "W"], + [127798, 127798, "N"], + [127799, 127868, "W"], + [127869, 127869, "N"], + [127870, 127891, "W"], + [127892, 127903, "N"], + [127904, 127946, "W"], + [127947, 127950, "N"], + [127951, 127955, "W"], + [127956, 127967, "N"], + [127968, 127984, "W"], + [127985, 127987, "N"], + [127988, 127988, "W"], + [127989, 127991, "N"], + [127992, 128062, "W"], + [128063, 128063, "N"], + [128064, 128064, "W"], + [128065, 128065, "N"], + [128066, 128252, "W"], + [128253, 128254, "N"], + [128255, 128317, "W"], + [128318, 128330, "N"], + [128331, 128334, "W"], + [128335, 128335, "N"], + [128336, 128359, "W"], + [128360, 128377, "N"], + [128378, 128378, "W"], + [128379, 128404, "N"], + [128405, 128406, "W"], + [128407, 128419, "N"], + [128420, 128420, "W"], + [128421, 128506, "N"], + [128507, 128591, "W"], + [128592, 128639, "N"], + [128640, 128709, "W"], + [128710, 128715, "N"], + [128716, 128716, "W"], + [128717, 128719, "N"], + [128720, 128722, "W"], + [128723, 128724, "N"], + [128725, 128727, "W"], + [128728, 128746, "N"], + [128747, 128748, "W"], + [128749, 128755, "N"], + [128756, 128764, "W"], + [128765, 128991, "N"], + [128992, 129003, "W"], + [129004, 129291, "N"], + [129292, 129338, "W"], + [129339, 129339, "N"], + [129340, 129349, "W"], + [129350, 129350, "N"], + [129351, 129400, "W"], + [129401, 129401, "N"], + [129402, 129483, "W"], + [129484, 129484, "N"], + [129485, 129535, "W"], + [129536, 129647, "N"], + [129648, 129652, "W"], + [129653, 129655, "N"], + [129656, 129658, "W"], + [129659, 129663, "N"], + [129664, 129670, "W"], + [129671, 129679, "N"], + [129680, 129704, "W"], + [129705, 129711, "N"], + [129712, 129718, "W"], + [129719, 129727, "N"], + [129728, 129730, "W"], + [129731, 129743, "N"], + [129744, 129750, "W"], + [129751, 131071, "N"], + [131072, 196605, "W"], + [196606, 196607, "N"], + [196608, 262141, "W"], + [262142, 917759, "N"], + [917760, 917999, "A"], + [918e3, 983039, "N"], + [983040, 1048573, "A"], + [1048574, 1048575, "N"], + [1048576, 1114109, "A"], + [1114110, 1114111, "N"] + ]; + var version = "13.0.0"; + function getEAWOfCodePoint(codePoint) { + var min = 0; + var max = defs.length - 1; + while (min !== max) { + var i = min + (max - min >> 1); + var _a = defs[i], start = _a[0], end = _a[1], prop = _a[2]; + if (codePoint < start) { + max = i - 1; + } else if (codePoint > end) { + min = i + 1; + } else { + return prop; + } + } + return defs[min][2]; + } + function getEAW(str, pos) { + if (pos === void 0) { + pos = 0; + } + var codePoint = str.codePointAt(pos); + if (codePoint === void 0) { + return void 0; + } + return getEAWOfCodePoint(codePoint); + } + var defaultWidths = { + N: 1, + Na: 1, + W: 2, + F: 2, + H: 1, + A: 1 + }; + function computeWidth(str, widths) { + var width = 0; + for (var _i = 0, str_1 = str; _i < str_1.length; _i++) { + var char = str_1[_i]; + var eaw = getEAW(char); + width += widths && widths[eaw] || defaultWidths[eaw]; + } + return width; + } + exports.computeWidth = computeWidth; + exports.eawVersion = version; + exports.getEAW = getEAW; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/formatter.js +var require_formatter = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/formatter.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.moveColumn = exports.deleteColumn = exports.insertColumn = exports.moveRow = exports.deleteRow = exports.insertRow = exports.alterAlignment = exports.formatTable = exports.FormatType = exports._weakFormatTable = exports._formatTable = exports._padText = exports._alignText = exports._computeTextWidth = exports.completeTable = exports._extendArray = exports._delimiterText = void 0; + var alignment_1 = require_alignment(); + var table_1 = require_table(); + var table_cell_1 = require_table_cell(); + var table_row_1 = require_table_row(); + var meaw_1 = require_lib(); + var _delimiterText = (alignment, width) => { + const bar = "-".repeat(width); + switch (alignment) { + case alignment_1.Alignment.NONE: + return ` ${bar} `; + case alignment_1.Alignment.LEFT: + return `:${bar} `; + case alignment_1.Alignment.RIGHT: + return ` ${bar}:`; + case alignment_1.Alignment.CENTER: + return `:${bar}:`; + default: + throw new Error("Unknown alignment: " + alignment); + } + }; + exports._delimiterText = _delimiterText; + var _extendArray = (arr, size, callback) => { + const extended = arr.slice(); + for (let i = arr.length; i < size; i++) { + extended.push(callback(i, arr)); + } + return extended; + }; + exports._extendArray = _extendArray; + var completeTable = (table, options) => { + const tableHeight = table.getHeight(); + const tableWidth = table.getWidth(); + if (tableHeight === 0) { + throw new Error("Empty table"); + } + const rows = table.getRows(); + const newRows = []; + const headerRow = rows[0]; + const headerCells = headerRow.getCells(); + newRows.push(new table_row_1.TableRow((0, exports._extendArray)(headerCells, tableWidth, (j) => new table_cell_1.TableCell(j === headerCells.length ? headerRow.marginRight : "")), headerRow.marginLeft, headerCells.length < tableWidth ? "" : headerRow.marginRight)); + const delimiterRow = table.getDelimiterRow(); + if (delimiterRow !== void 0) { + const delimiterCells = delimiterRow.getCells(); + newRows.push(new table_row_1.TableRow((0, exports._extendArray)(delimiterCells, tableWidth, (j) => new table_cell_1.TableCell((0, exports._delimiterText)(alignment_1.Alignment.NONE, j === delimiterCells.length ? Math.max(options.minDelimiterWidth, delimiterRow.marginRight.length - 2) : options.minDelimiterWidth))), delimiterRow.marginLeft, delimiterCells.length < tableWidth ? "" : delimiterRow.marginRight)); + } else { + newRows.push(new table_row_1.TableRow((0, exports._extendArray)([], tableWidth, () => new table_cell_1.TableCell((0, exports._delimiterText)(alignment_1.Alignment.NONE, options.minDelimiterWidth))), "", "")); + } + for (let i = delimiterRow !== void 0 ? 2 : 1; i < tableHeight; i++) { + const row = rows[i]; + const cells = row.getCells(); + newRows.push(new table_row_1.TableRow((0, exports._extendArray)(cells, tableWidth, (j) => new table_cell_1.TableCell(j === cells.length ? row.marginRight : "")), row.marginLeft, cells.length < tableWidth ? "" : row.marginRight)); + } + return { + table: new table_1.Table(newRows), + delimiterInserted: delimiterRow === void 0 + }; + }; + exports.completeTable = completeTable; + var _computeTextWidth = (text, options) => { + const normalized = options.normalize ? text.normalize("NFC") : text; + let w = 0; + for (const char of normalized) { + if (options.wideChars.has(char)) { + w += 2; + continue; + } + if (options.narrowChars.has(char)) { + w += 1; + continue; + } + switch ((0, meaw_1.getEAW)(char)) { + case "F": + case "W": + w += 2; + break; + case "A": + w += options.ambiguousAsWide ? 2 : 1; + break; + default: + w += 1; + } + } + return w; + }; + exports._computeTextWidth = _computeTextWidth; + var _alignText = (text, width, alignment, options) => { + const space = width - (0, exports._computeTextWidth)(text, options); + if (space < 0) { + return text; + } + switch (alignment) { + case alignment_1.Alignment.NONE: + throw new Error("Unexpected default alignment"); + case alignment_1.Alignment.LEFT: + return text + " ".repeat(space); + case alignment_1.Alignment.RIGHT: + return " ".repeat(space) + text; + case alignment_1.Alignment.CENTER: + return " ".repeat(Math.floor(space / 2)) + text + " ".repeat(Math.ceil(space / 2)); + default: + throw new Error("Unknown alignment: " + alignment); + } + }; + exports._alignText = _alignText; + var _padText = (text) => ` ${text} `; + exports._padText = _padText; + var _formatTable = (table, options) => { + const tableHeight = table.getHeight(); + const tableWidth = table.getWidth(); + if (tableHeight === 0) { + return { + table, + marginLeft: "" + }; + } + const marginLeft = table.getRows()[0].marginLeft; + if (tableWidth === 0) { + const rows2 = new Array(tableHeight).fill(new table_row_1.TableRow([], marginLeft, "")); + return { + table: new table_1.Table(rows2), + marginLeft + }; + } + const delimiterRow = table.getDelimiterRow(); + const columnWidths = new Array(tableWidth).fill(0); + if (delimiterRow !== void 0) { + const delimiterRowWidth = delimiterRow.getWidth(); + for (let j = 0; j < delimiterRowWidth; j++) { + columnWidths[j] = options.minDelimiterWidth; + } + } + for (let i = 0; i < tableHeight; i++) { + if (delimiterRow !== void 0 && i === 1) { + continue; + } + const row = table.getRows()[i]; + const rowWidth = row.getWidth(); + for (let j = 0; j < rowWidth; j++) { + columnWidths[j] = Math.max(columnWidths[j], (0, exports._computeTextWidth)(row.getCellAt(j).content, options.textWidthOptions)); + } + } + const alignments = delimiterRow !== void 0 ? (0, exports._extendArray)( + delimiterRow.getCells().map((cell) => cell.getAlignment()), + tableWidth, + // Safe conversion because DefaultAlignment is a subset of Alignment + () => options.defaultAlignment + ) : new Array(tableWidth).fill(options.defaultAlignment); + const rows = []; + const headerRow = table.getRows()[0]; + rows.push(new table_row_1.TableRow(headerRow.getCells().map((cell, j) => new table_cell_1.TableCell((0, exports._padText)((0, exports._alignText)(cell.content, columnWidths[j], options.headerAlignment === alignment_1.HeaderAlignment.FOLLOW ? alignments[j] === alignment_1.Alignment.NONE ? options.defaultAlignment : alignments[j] : options.headerAlignment, options.textWidthOptions)))), marginLeft, "")); + if (delimiterRow !== void 0) { + rows.push(new table_row_1.TableRow(delimiterRow.getCells().map((cell, j) => new table_cell_1.TableCell((0, exports._delimiterText)(alignments[j], columnWidths[j]))), marginLeft, "")); + } + for (let i = delimiterRow !== void 0 ? 2 : 1; i < tableHeight; i++) { + const row = table.getRows()[i]; + rows.push(new table_row_1.TableRow(row.getCells().map((cell, j) => new table_cell_1.TableCell((0, exports._padText)((0, exports._alignText)(cell.content, columnWidths[j], alignments[j] === alignment_1.Alignment.NONE ? options.defaultAlignment : alignments[j], options.textWidthOptions)))), marginLeft, "")); + } + return { + table: new table_1.Table(rows), + marginLeft + }; + }; + exports._formatTable = _formatTable; + var _weakFormatTable = (table, options) => { + const tableHeight = table.getHeight(); + const tableWidth = table.getWidth(); + if (tableHeight === 0) { + return { + table, + marginLeft: "" + }; + } + const marginLeft = table.getRows()[0].marginLeft; + if (tableWidth === 0) { + const rows2 = new Array(tableHeight).fill(new table_row_1.TableRow([], marginLeft, "")); + return { + table: new table_1.Table(rows2), + marginLeft + }; + } + const delimiterRow = table.getDelimiterRow(); + const rows = []; + const headerRow = table.getRows()[0]; + rows.push(new table_row_1.TableRow(headerRow.getCells().map((cell) => new table_cell_1.TableCell((0, exports._padText)(cell.content))), marginLeft, "")); + if (delimiterRow !== void 0) { + rows.push(new table_row_1.TableRow(delimiterRow.getCells().map((cell) => new table_cell_1.TableCell((0, exports._delimiterText)(cell.getAlignment(), options.minDelimiterWidth))), marginLeft, "")); + } + for (let i = delimiterRow !== void 0 ? 2 : 1; i < tableHeight; i++) { + const row = table.getRows()[i]; + rows.push(new table_row_1.TableRow(row.getCells().map((cell) => new table_cell_1.TableCell((0, exports._padText)(cell.content))), marginLeft, "")); + } + return { + table: new table_1.Table(rows), + marginLeft + }; + }; + exports._weakFormatTable = _weakFormatTable; + var FormatType3; + (function(FormatType4) { + FormatType4["NORMAL"] = "normal"; + FormatType4["WEAK"] = "weak"; + })(FormatType3 || (exports.FormatType = FormatType3 = {})); + var formatTable = (table, options) => { + switch (options.formatType) { + case FormatType3.NORMAL: + return (0, exports._formatTable)(table, options); + case FormatType3.WEAK: + return (0, exports._weakFormatTable)(table, options); + default: + throw new Error("Unknown format type: " + options.formatType); + } + }; + exports.formatTable = formatTable; + var alterAlignment = (table, columnIndex, alignment, options) => { + if (table.getHeight() < 1) { + return table; + } + const delimiterRow = table.getRows()[1]; + if (columnIndex < 0 || delimiterRow.getWidth() - 1 < columnIndex) { + return table; + } + const delimiterCells = delimiterRow.getCells(); + delimiterCells[columnIndex] = new table_cell_1.TableCell((0, exports._delimiterText)(alignment, options.minDelimiterWidth)); + const rows = table.getRows(); + rows[1] = new table_row_1.TableRow(delimiterCells, delimiterRow.marginLeft, delimiterRow.marginRight); + return new table_1.Table(rows); + }; + exports.alterAlignment = alterAlignment; + var insertRow = (table, rowIndex, row) => { + const rows = table.getRows(); + rows.splice(Math.max(rowIndex, 2), 0, row); + return new table_1.Table(rows); + }; + exports.insertRow = insertRow; + var deleteRow = (table, rowIndex) => { + if (rowIndex === 1) { + return table; + } + const rows = table.getRows(); + if (rowIndex === 0) { + const headerRow = rows[0]; + rows[0] = new table_row_1.TableRow(new Array(headerRow.getWidth()).fill(new table_cell_1.TableCell("")), headerRow.marginLeft, headerRow.marginRight); + } else { + rows.splice(rowIndex, 1); + } + return new table_1.Table(rows); + }; + exports.deleteRow = deleteRow; + var moveRow = (table, rowIndex, destIndex) => { + if (rowIndex <= 1 || destIndex <= 1 || rowIndex === destIndex) { + return table; + } + const rows = table.getRows(); + const row = rows[rowIndex]; + rows.splice(rowIndex, 1); + rows.splice(destIndex, 0, row); + return new table_1.Table(rows); + }; + exports.moveRow = moveRow; + var insertColumn = (table, columnIndex, column, options) => { + const rows = table.getRows(); + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + const cells = rows[i].getCells(); + const cell = i === 1 ? new table_cell_1.TableCell((0, exports._delimiterText)(alignment_1.Alignment.NONE, options.minDelimiterWidth)) : column[i > 1 ? i - 1 : i]; + cells.splice(columnIndex, 0, cell); + rows[i] = new table_row_1.TableRow(cells, row.marginLeft, row.marginRight); + } + return new table_1.Table(rows); + }; + exports.insertColumn = insertColumn; + var deleteColumn = (table, columnIndex, options) => { + const rows = table.getRows(); + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let cells = row.getCells(); + if (cells.length <= 1) { + cells = [ + new table_cell_1.TableCell(i === 1 ? (0, exports._delimiterText)(alignment_1.Alignment.NONE, options.minDelimiterWidth) : "") + ]; + } else { + cells.splice(columnIndex, 1); + } + rows[i] = new table_row_1.TableRow(cells, row.marginLeft, row.marginRight); + } + return new table_1.Table(rows); + }; + exports.deleteColumn = deleteColumn; + var moveColumn = (table, columnIndex, destIndex) => { + if (columnIndex === destIndex) { + return table; + } + const rows = table.getRows(); + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + const cells = row.getCells(); + const cell = cells[columnIndex]; + cells.splice(columnIndex, 1); + cells.splice(destIndex, 0, cell); + rows[i] = new table_row_1.TableRow(cells, row.marginLeft, row.marginRight); + } + return new table_1.Table(rows); + }; + exports.moveColumn = moveColumn; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/edit-script.js +var require_edit_script = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/edit-script.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.shortestEditScript = exports.applyEditScript = exports._applyCommand = exports.Delete = exports.Insert = void 0; + var Insert = class { + /** + * Creats a new `Insert` object. + * + * @param row - Row index, starts from `0`. + * @param line - A string to be inserted at the row. + */ + constructor(row, line) { + this.row = row; + this.line = line; + } + }; + exports.Insert = Insert; + var Delete = class { + /** + * Creates a new `Delete` object. + * + * @param row - Row index, starts from `0`. + */ + constructor(row) { + this.row = row; + } + }; + exports.Delete = Delete; + var _applyCommand = (textEditor, command, rowOffset) => { + if (command instanceof Insert) { + textEditor.insertLine(rowOffset + command.row, command.line); + } else if (command instanceof Delete) { + textEditor.deleteLine(rowOffset + command.row); + } else { + throw new Error("Unknown command"); + } + }; + exports._applyCommand = _applyCommand; + var applyEditScript = (textEditor, script, rowOffset) => { + for (const command of script) { + (0, exports._applyCommand)(textEditor, command, rowOffset); + } + }; + exports.applyEditScript = applyEditScript; + var IList = class { + get car() { + throw new Error("Not implemented"); + } + get cdr() { + throw new Error("Not implemented"); + } + isEmpty() { + throw new Error("Not implemented"); + } + unshift(value) { + return new Cons(value, this); + } + toArray() { + const arr = []; + let rest = this; + while (!rest.isEmpty()) { + arr.push(rest.car); + rest = rest.cdr; + } + return arr; + } + }; + var Nil = class extends IList { + constructor() { + super(); + } + get car() { + throw new Error("Empty list"); + } + get cdr() { + throw new Error("Empty list"); + } + isEmpty() { + return true; + } + }; + var Cons = class extends IList { + constructor(car, cdr) { + super(); + this._car = car; + this._cdr = cdr; + } + get car() { + return this._car; + } + get cdr() { + return this._cdr; + } + isEmpty() { + return false; + } + }; + var shortestEditScript = (from, to, limit = -1) => { + const fromLen = from.length; + const toLen = to.length; + const maxd = limit >= 0 ? Math.min(limit, fromLen + toLen) : fromLen + toLen; + const mem = new Array(Math.min(maxd, fromLen) + Math.min(maxd, toLen) + 1); + const offset = Math.min(maxd, fromLen); + for (let d = 0; d <= maxd; d++) { + const mink = d <= fromLen ? -d : d - 2 * fromLen; + const maxk = d <= toLen ? d : -d + 2 * toLen; + for (let k = mink; k <= maxk; k += 2) { + let i; + let script; + if (d === 0) { + i = 0; + script = new Nil(); + } else if (k === -d) { + i = mem[offset + k + 1].i + 1; + script = mem[offset + k + 1].script.unshift(new Delete(i + k)); + } else if (k === d) { + i = mem[offset + k - 1].i; + script = mem[offset + k - 1].script.unshift(new Insert(i + k - 1, to[i + k - 1])); + } else { + const vi = mem[offset + k + 1].i + 1; + const hi = mem[offset + k - 1].i; + if (vi > hi) { + i = vi; + script = mem[offset + k + 1].script.unshift(new Delete(i + k)); + } else { + i = hi; + script = mem[offset + k - 1].script.unshift(new Insert(i + k - 1, to[i + k - 1])); + } + } + while (i < fromLen && i + k < toLen && from[i] === to[i + k]) { + i += 1; + } + if (k === toLen - fromLen && i === fromLen) { + return script.toArray().reverse(); + } + mem[offset + k] = { i, script }; + } + } + return void 0; + }; + exports.shortestEditScript = shortestEditScript; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/text-editor.js +var require_text_editor = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/text-editor.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.ITextEditor = void 0; + var ITextEditor = class { + /** + * Gets the current cursor position. + * + * @returns A point object that represents the cursor position. + */ + getCursorPosition() { + throw new Error("Not implemented: getCursorPosition"); + } + /** + * Sets the cursor position to a specified one. + */ + setCursorPosition(pos) { + throw new Error("Not implemented: setCursorPosition"); + } + /** + * Sets the selection range. + * This method also expects the cursor position to be moved as the end of the selection range. + */ + setSelectionRange(range) { + throw new Error("Not implemented: setSelectionRange"); + } + /** + * Gets the last row index of the text editor. + */ + getLastRow() { + throw new Error("Not implemented: getLastRow"); + } + /** + * Checks if the editor accepts a table at a row to be editted. + * It should return `false` if, for example, the row is in a code block (not Markdown). + * + * @param row - A row index in the text editor. + * @returns `true` if the table at the row can be editted. + */ + acceptsTableEdit(row) { + throw new Error("Not implemented: acceptsTableEdit"); + } + /** + * Gets a line string at a row. + * + * @param row - Row index, starts from `0`. + * @returns The line at the specified row. + * The line must not contain an EOL like `"\n"` or `"\r"`. + */ + getLine(row) { + throw new Error("Not implemented: getLine"); + } + /** + * Inserts a line at a specified row. + * + * @param row - Row index, starts from `0`. + * @param line - A string to be inserted. + * This must not contain an EOL like `"\n"` or `"\r"`. + */ + insertLine(row, line) { + throw new Error("Not implemented: insertLine"); + } + /** + * Deletes a line at a specified row. + * + * @param row - Row index, starts from `0`. + */ + deleteLine(row) { + throw new Error("Not implemented: deleteLine"); + } + /** + * Replace lines in a specified range. + * + * @param startRow - Start row index, starts from `0`. + * @param endRow - End row index. + * Lines from `startRow` to `endRow - 1` is replaced. + * @param lines - An array of string. + * Each strings must not contain an EOL like `"\n"` or `"\r"`. + */ + replaceLines(startRow, endRow, lines) { + throw new Error("Not implemented: replaceLines"); + } + /** + * Batches multiple operations as a single undo/redo step. + * + * @param func - A callback function that executes some operations on the text editor. + */ + transact(func) { + throw new Error("Not implemented: transact"); + } + }; + exports.ITextEditor = ITextEditor; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/options.js +var require_options = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/options.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.defaultOptions = exports.optionsWithDefaults = void 0; + var alignment_1 = require_alignment(); + var formatter_1 = require_formatter(); + var DEFAULT_TEXT_WIDTH_OPTIONS = { + normalize: true, + wideChars: /* @__PURE__ */ new Set(), + narrowChars: /* @__PURE__ */ new Set(), + ambiguousAsWide: false + }; + var DEFAULT_OPTIONS = { + leftMarginChars: /* @__PURE__ */ new Set(), + formatType: formatter_1.FormatType.NORMAL, + minDelimiterWidth: 3, + defaultAlignment: alignment_1.DefaultAlignment.LEFT, + headerAlignment: alignment_1.HeaderAlignment.FOLLOW, + smartCursor: false + }; + var optionsWithDefaults2 = (options) => Object.assign(Object.assign(Object.assign({}, DEFAULT_OPTIONS), options), { textWidthOptions: options.textWidthOptions ? Object.assign(Object.assign({}, DEFAULT_TEXT_WIDTH_OPTIONS), options.textWidthOptions) : DEFAULT_TEXT_WIDTH_OPTIONS }); + exports.optionsWithDefaults = optionsWithDefaults2; + exports.defaultOptions = (0, exports.optionsWithDefaults)({}); + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/table-editor.js +var require_table_editor = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/table-editor.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.TableEditor = exports._computeNewOffset = exports._createIsTableFormulaRegex = exports._createIsTableRowRegex = exports.SortOrder = void 0; + var edit_script_1 = require_edit_script(); + var focus_1 = require_focus(); + var formatter_1 = require_formatter(); + var parser_1 = require_parser(); + var point_1 = require_point(); + var range_1 = require_range(); + var table_1 = require_table(); + var table_cell_1 = require_table_cell(); + var table_row_1 = require_table_row(); + var SortOrder2; + (function(SortOrder3) { + SortOrder3["Ascending"] = "ascending"; + SortOrder3["Descending"] = "descending"; + })(SortOrder2 || (exports.SortOrder = SortOrder2 = {})); + var _createIsTableRowRegex = (leftMarginChars) => new RegExp(`^${(0, parser_1.marginRegexSrc)(leftMarginChars)}\\|`, "u"); + exports._createIsTableRowRegex = _createIsTableRowRegex; + var _createIsTableFormulaRegex = (leftMarginChars) => new RegExp(`^${(0, parser_1.marginRegexSrc)(leftMarginChars)}$`, "u"); + exports._createIsTableFormulaRegex = _createIsTableFormulaRegex; + var _computeNewOffset = (focus, table, formatted, moved) => { + if (moved) { + const formattedFocusedCell2 = formatted.table.getFocusedCell(focus); + if (formattedFocusedCell2 !== void 0) { + return formattedFocusedCell2.computeRawOffset(0); + } + return focus.column < 0 ? formatted.marginLeft.length : 0; + } + const focusedCell = table.getFocusedCell(focus); + const formattedFocusedCell = formatted.table.getFocusedCell(focus); + if (focusedCell !== void 0 && formattedFocusedCell !== void 0) { + const contentOffset = Math.min(focusedCell.computeContentOffset(focus.offset), formattedFocusedCell.content.length); + return formattedFocusedCell.computeRawOffset(contentOffset); + } + return focus.column < 0 ? formatted.marginLeft.length : 0; + }; + exports._computeNewOffset = _computeNewOffset; + var TableEditor2 = class { + /** + * Creates a new table editor instance. + * + * @param textEditor - A text editor interface. + */ + constructor(textEditor) { + this._textEditor = textEditor; + this._scActive = false; + } + /** + * Resets the smart cursor. + * Call this method when the table editor is inactivated. + */ + resetSmartCursor() { + this._scActive = false; + } + /** + * Checks if the cursor is in a table row. Returns false if the cursor is in a + * table formula row (see cursorIsInTableFormula). + * This is useful to check whether the table editor should be activated or not. + * + * @returns `true` if the cursor is in a table row. + */ + cursorIsInTable(options) { + const re = (0, exports._createIsTableRowRegex)(options.leftMarginChars); + const pos = this._textEditor.getCursorPosition(); + return this._textEditor.acceptsTableEdit(pos.row) && re.test(this._textEditor.getLine(pos.row)); + } + /** + * Checks if the cursor is in a formula row below a table. + * This is useful to check whether the table editor should be activated or not. + * + * @returns `true` if the cursor is in a formula row. + */ + cursorIsInTableFormula(options) { + const formulaRe = (0, exports._createIsTableFormulaRegex)(options.leftMarginChars); + const pos = this._textEditor.getCursorPosition(); + return this._textEditor.acceptsTableEdit(pos.row) && formulaRe.test(this._textEditor.getLine(pos.row)); + } + /** + * Finds a table under the current cursor position. + * + * @returns undefined if there is no table or the determined focus is invalid. + */ + _findTable(options) { + const re = (0, exports._createIsTableRowRegex)(options.leftMarginChars); + const formulaRe = (0, exports._createIsTableFormulaRegex)(options.leftMarginChars); + let pos = this._textEditor.getCursorPosition(); + const lastRow = this._textEditor.getLastRow(); + const lines = []; + const formulaLines = []; + let startRow = pos.row; + let endRow = pos.row; + { + let line = this._textEditor.getLine(pos.row); + while (formulaRe.test(line) && pos.row >= 0) { + pos = new point_1.Point(pos.row - 1, pos.column); + endRow--; + line = this._textEditor.getLine(pos.row); + } + } + { + const line = this._textEditor.getLine(pos.row); + if (!this._textEditor.acceptsTableEdit(pos.row) || !re.test(line)) { + return void 0; + } + lines.push(line); + } + for (let row = pos.row - 1; row >= 0; row--) { + const line = this._textEditor.getLine(row); + if (!this._textEditor.acceptsTableEdit(row) || !re.test(line)) { + break; + } + lines.unshift(line); + startRow = row; + } + for (let row = pos.row + 1; row <= lastRow; row++) { + const line = this._textEditor.getLine(row); + if (!this._textEditor.acceptsTableEdit(row) || !re.test(line)) { + break; + } + lines.push(line); + endRow = row; + } + for (let row = endRow + 1; row <= lastRow; row++) { + const line = this._textEditor.getLine(row); + if (!this._textEditor.acceptsTableEdit(row) || !formulaRe.test(line)) { + break; + } + formulaLines.push(line); + } + const range = new range_1.Range(new point_1.Point(startRow, 0), new point_1.Point(endRow, lines[lines.length - 1].length)); + const table = (0, parser_1.readTable)(lines, options); + const focus = table.focusOfPosition(pos, startRow); + if (focus === void 0) { + return void 0; + } + return { range, lines, formulaLines, table, focus }; + } + /** + * Finds a table and does an operation with it. + * + * @private + * @param func - A function that does some operation on table information obtained by + * {@link TableEditor#_findTable}. + */ + _withTable(options, func) { + const info = this._findTable(options); + if (info === void 0) { + return; + } + return func(info); + } + /** + * Updates lines in a given range in the text editor. + * + * @private + * @param startRow - Start row index, starts from `0`. + * @param endRow - End row index. + * Lines from `startRow` to `endRow - 1` are replaced. + * @param newLines - New lines. + * @param [oldLines=undefined] - Old lines to be replaced. + */ + _updateLines(startRow, endRow, newLines, oldLines = void 0) { + if (oldLines !== void 0) { + const ses = (0, edit_script_1.shortestEditScript)(oldLines, newLines, 3); + if (ses !== void 0) { + (0, edit_script_1.applyEditScript)(this._textEditor, ses, startRow); + return; + } + } + this._textEditor.replaceLines(startRow, endRow, newLines); + } + /** + * Moves the cursor position to the focused cell, + * + * @private + * @param startRow - Row index where the table starts in the text editor. + * @param table - A table. + * @param focus - A focus to which the cursor will be moved. + */ + _moveToFocus(startRow, table, focus) { + const pos = table.positionOfFocus(focus, startRow); + if (pos !== void 0) { + this._textEditor.setCursorPosition(pos); + } + } + /** + * Selects the focused cell. + * If the cell has no content to be selected, then just moves the cursor position. + * + * @private + * @param startRow - Row index where the table starts in the text editor. + * @param table - A table. + * @param focus - A focus to be selected. + */ + _selectFocus(startRow, table, focus) { + const range = table.selectionRangeOfFocus(focus, startRow); + if (range !== void 0) { + this._textEditor.setSelectionRange(range); + } else { + this._moveToFocus(startRow, table, focus); + } + } + /** + * Formats the table under the cursor. + */ + format(options) { + this.withCompletedTable(options, ({ range, lines, table, focus }) => { + const newFocus = focus; + this._textEditor.transact(() => { + this._updateLines(range.start.row, range.end.row + 1, table.toLines(), lines); + this._moveToFocus(range.start.row, table, newFocus); + }); + }); + } + /** + * Formats and escapes from the table. + */ + escape(options) { + this._withTable(options, ({ range, lines, table, focus }) => { + const completed = (0, formatter_1.completeTable)(table, options); + const formatted = (0, formatter_1.formatTable)(completed.table, options); + const newRow = range.end.row + (completed.delimiterInserted ? 2 : 1); + this._textEditor.transact(() => { + this._updateLines(range.start.row, range.end.row + 1, formatted.table.toLines(), lines); + let newPos; + if (newRow > this._textEditor.getLastRow()) { + this._textEditor.insertLine(newRow, ""); + newPos = new point_1.Point(newRow, 0); + } else { + const re = new RegExp(`^${(0, parser_1.marginRegexSrc)(options.leftMarginChars)}`, "u"); + const nextLine = this._textEditor.getLine(newRow); + const margin = re.exec(nextLine)[0]; + newPos = new point_1.Point(newRow, margin.length); + } + this._textEditor.setCursorPosition(newPos); + }); + this.resetSmartCursor(); + }); + } + /** + * Alters the alignment of the focused column. + */ + alignColumn(alignment, options) { + this.withCompletedTable(options, ({ range, lines, table, focus }) => { + let newFocus = focus; + let altered = table; + if (0 <= newFocus.column && newFocus.column <= altered.getHeaderWidth() - 1) { + altered = (0, formatter_1.alterAlignment)(table, newFocus.column, alignment, options); + } + const formatted = (0, formatter_1.formatTable)(altered, options); + newFocus = newFocus.setOffset((0, exports._computeNewOffset)(newFocus, table, formatted, false)); + this._textEditor.transact(() => { + this._updateLines(range.start.row, range.end.row + 1, formatted.table.toLines(), lines); + this._moveToFocus(range.start.row, formatted.table, newFocus); + }); + }); + } + /** + * Selects the focused cell content. + */ + selectCell(options) { + this.withCompletedTable(options, ({ range, lines, table, focus }) => { + const newFocus = focus; + this._textEditor.transact(() => { + this._updateLines(range.start.row, range.end.row + 1, table.toLines(), lines); + this._selectFocus(range.start.row, table, newFocus); + }); + }); + } + /** + * Moves the focus to another cell. + * + * @param rowOffset - Offset in row. + * @param columnOffset - Offset in column. + */ + moveFocus(rowOffset, columnOffset, options) { + this.withCompletedTable(options, ({ range, lines, table, focus }) => { + let newFocus = focus; + const startFocus = newFocus; + if (rowOffset !== 0) { + const height = table.getHeight(); + const skip = newFocus.row < 1 && newFocus.row + rowOffset >= 1 ? 1 : newFocus.row > 1 && newFocus.row + rowOffset <= 1 ? -1 : 0; + newFocus = newFocus.setRow(Math.min(Math.max(newFocus.row + rowOffset + skip, 0), height <= 2 ? 0 : height - 1)); + } + if (columnOffset !== 0) { + const width = table.getHeaderWidth(); + if (!(newFocus.column < 0 && columnOffset < 0) && !(newFocus.column > width - 1 && columnOffset > 0)) { + newFocus = newFocus.setColumn(Math.min(Math.max(newFocus.column + columnOffset, 0), width - 1)); + } + } + const moved = !newFocus.posEquals(startFocus); + const formatted = (0, formatter_1.formatTable)(table, options); + newFocus = newFocus.setOffset((0, exports._computeNewOffset)(newFocus, table, formatted, moved)); + this._textEditor.transact(() => { + this._updateLines(range.start.row, range.end.row + 1, formatted.table.toLines(), lines); + if (moved) { + this._selectFocus(range.start.row, formatted.table, newFocus); + } else { + this._moveToFocus(range.start.row, formatted.table, newFocus); + } + }); + if (moved) { + this.resetSmartCursor(); + } + }); + } + /** + * Moves the focus to the next cell. + */ + nextCell(options) { + this._withTable(options, ({ range, lines, table, focus }) => { + const focusMoved = this._scTablePos !== void 0 && !range.start.equals(this._scTablePos) || this._scLastFocus !== void 0 && !focus.posEquals(this._scLastFocus); + if (this._scActive && focusMoved) { + this.resetSmartCursor(); + } + let newFocus = focus; + const completed = (0, formatter_1.completeTable)(table, options); + if (completed.delimiterInserted && newFocus.row > 0) { + newFocus = newFocus.setRow(newFocus.row + 1); + } + const startFocus = newFocus; + let altered = completed.table; + if (newFocus.row === 1) { + newFocus = newFocus.setRow(2); + if (options.smartCursor) { + if (newFocus.column < 0 || altered.getHeaderWidth() - 1 < newFocus.column) { + newFocus = newFocus.setColumn(0); + } + } else { + newFocus = newFocus.setColumn(0); + } + if (newFocus.row > altered.getHeight() - 1) { + const row = new Array(altered.getHeaderWidth()).fill(new table_cell_1.TableCell("")); + altered = (0, formatter_1.insertRow)(altered, altered.getHeight(), new table_row_1.TableRow(row, "", "")); + } + } else { + if (newFocus.column > altered.getHeaderWidth() - 1) { + const column = new Array(altered.getHeight() - 1).fill(new table_cell_1.TableCell("")); + altered = (0, formatter_1.insertColumn)(altered, altered.getHeaderWidth(), column, options); + } + newFocus = newFocus.setColumn(newFocus.column + 1); + } + const formatted = (0, formatter_1.formatTable)(altered, options); + newFocus = newFocus.setOffset((0, exports._computeNewOffset)(newFocus, altered, formatted, true)); + const newLines = formatted.table.toLines(); + if (newFocus.column > formatted.table.getHeaderWidth() - 1) { + newLines[newFocus.row] += " "; + newFocus = newFocus.setOffset(1); + } + this._textEditor.transact(() => { + this._updateLines(range.start.row, range.end.row + 1, newLines, lines); + this._selectFocus(range.start.row, formatted.table, newFocus); + }); + if (options.smartCursor) { + if (!this._scActive) { + this._scActive = true; + this._scTablePos = range.start; + if (startFocus.column < 0 || formatted.table.getHeaderWidth() - 1 < startFocus.column) { + this._scStartFocus = new focus_1.Focus(startFocus.row, 0, 0); + } else { + this._scStartFocus = startFocus; + } + } + this._scLastFocus = newFocus; + } + }); + } + /** + * Moves the focus to the previous cell. + */ + previousCell(options) { + this.withCompletedTable(options, ({ range, lines, table, focus }) => { + let newFocus = focus; + const startFocus = newFocus; + if (newFocus.row === 0) { + if (newFocus.column > 0) { + newFocus = newFocus.setColumn(newFocus.column - 1); + } + } else if (newFocus.row === 1) { + newFocus = new focus_1.Focus(0, table.getHeaderWidth() - 1, newFocus.offset); + } else { + if (newFocus.column > 0) { + newFocus = newFocus.setColumn(newFocus.column - 1); + } else { + newFocus = new focus_1.Focus(newFocus.row === 2 ? 0 : newFocus.row - 1, table.getHeaderWidth() - 1, newFocus.offset); + } + } + const moved = !newFocus.posEquals(startFocus); + const formatted = (0, formatter_1.formatTable)(table, options); + newFocus = newFocus.setOffset((0, exports._computeNewOffset)(newFocus, table, formatted, moved)); + this._textEditor.transact(() => { + this._updateLines(range.start.row, range.end.row + 1, formatted.table.toLines(), lines); + if (moved) { + this._selectFocus(range.start.row, formatted.table, newFocus); + } else { + this._moveToFocus(range.start.row, formatted.table, newFocus); + } + }); + if (moved) { + this.resetSmartCursor(); + } + }); + } + /** + * Moves the focus to the next row. + */ + nextRow(options) { + this._withTable(options, ({ range, lines, table, focus }) => { + const focusMoved = this._scTablePos !== void 0 && !range.start.equals(this._scTablePos) || this._scLastFocus !== void 0 && !focus.posEquals(this._scLastFocus); + if (this._scActive && focusMoved) { + this.resetSmartCursor(); + } + let newFocus = focus; + const completed = (0, formatter_1.completeTable)(table, options); + if (completed.delimiterInserted && newFocus.row > 0) { + newFocus = newFocus.setRow(newFocus.row + 1); + } + const startFocus = newFocus; + let altered = completed.table; + if (newFocus.row === 0) { + newFocus = newFocus.setRow(2); + } else { + newFocus = newFocus.setRow(newFocus.row + 1); + } + if (options.smartCursor) { + if (this._scActive && this._scStartFocus !== void 0) { + newFocus = newFocus.setColumn(this._scStartFocus.column); + } else if (newFocus.column < 0 || altered.getHeaderWidth() - 1 < newFocus.column) { + newFocus = newFocus.setColumn(0); + } + } else { + newFocus = newFocus.setColumn(0); + } + if (newFocus.row > altered.getHeight() - 1) { + const row = new Array(altered.getHeaderWidth()).fill(new table_cell_1.TableCell("")); + altered = (0, formatter_1.insertRow)(altered, altered.getHeight(), new table_row_1.TableRow(row, "", "")); + } + const formatted = (0, formatter_1.formatTable)(altered, options); + newFocus = newFocus.setOffset((0, exports._computeNewOffset)(newFocus, altered, formatted, true)); + this._textEditor.transact(() => { + this._updateLines(range.start.row, range.end.row + 1, formatted.table.toLines(), lines); + this._selectFocus(range.start.row, formatted.table, newFocus); + }); + if (options.smartCursor) { + if (!this._scActive) { + this._scActive = true; + this._scTablePos = range.start; + if (startFocus.column < 0 || formatted.table.getHeaderWidth() - 1 < startFocus.column) { + this._scStartFocus = new focus_1.Focus(startFocus.row, 0, 0); + } else { + this._scStartFocus = startFocus; + } + } + this._scLastFocus = newFocus; + } + }); + } + /** + * Inserts an empty row at the current focus. + */ + insertRow(options) { + this.withCompletedTable(options, ({ range, lines, formulaLines, table, focus }) => { + let newFocus = focus; + if (newFocus.row <= 1) { + newFocus = newFocus.setRow(2); + } + newFocus = newFocus.setColumn(0); + const row = new Array(table.getHeaderWidth()).fill(new table_cell_1.TableCell("")); + const altered = (0, formatter_1.insertRow)(table, newFocus.row, new table_row_1.TableRow(row, "", "")); + this.formatAndApply(options, range, lines, formulaLines, altered, newFocus); + }); + } + /** + * Deletes a row at the current focus. + */ + deleteRow(options) { + this.withCompletedTable(options, ({ range, lines, formulaLines, table, focus }) => { + let newFocus = focus; + let altered = table; + let moved = false; + if (newFocus.row !== 1) { + altered = (0, formatter_1.deleteRow)(altered, newFocus.row); + moved = true; + if (newFocus.row > altered.getHeight() - 1) { + newFocus = newFocus.setRow(newFocus.row === 2 ? 0 : newFocus.row - 1); + } + } + this.formatAndApply(options, range, lines, formulaLines, altered, newFocus, moved); + }); + } + /** + * Moves the focused row by the specified offset. + * + * @param offset - An offset the row is moved by. + */ + moveRow(offset, options) { + this.withCompletedTable(options, ({ range, lines, formulaLines, table, focus }) => { + let newFocus = focus; + let altered = table; + if (newFocus.row > 1) { + const dest = Math.min(Math.max(newFocus.row + offset, 2), altered.getHeight() - 1); + altered = (0, formatter_1.moveRow)(altered, newFocus.row, dest); + newFocus = newFocus.setRow(dest); + } + this.formatAndApply(options, range, lines, formulaLines, altered, newFocus); + }); + } + evaluateFormulas(options) { + return this.withCompletedTable(options, ({ range, lines, formulaLines, table, focus }) => { + const result = table.applyFormulas(formulaLines); + if (result.isErr()) { + return result.error; + } + const { table: formattedTable, focus: newFocus } = this.formatAndApply(options, range, lines, formulaLines, result.value, focus, false); + }); + } + /** + * Transpose rows and columns of a table by inverting the X and Y axis values. + * @param options + */ + transpose(options) { + this.withCompletedTable(options, ({ range, lines, formulaLines, table, focus }) => { + var _a, _b, _c, _d, _e, _f, _g, _h; + const width = table.getWidth(); + const height = table.getHeight(); + const newRows = new Array(width + 1); + for (let x = 0; x < width + 1; ++x) { + if (x === 0) { + const newRow = new Array(height - 1); + for (let y = 0; y < height; ++y) { + if (y === 0) { + const s = (_b = (_a = table.getCellAt(y, x)) === null || _a === void 0 ? void 0 : _a.content) !== null && _b !== void 0 ? _b : ""; + newRow[y] = new table_cell_1.TableCell(s); + } else if (y === 1) { + continue; + } else if (y > 1) { + const s = (_d = (_c = table.getCellAt(y, x)) === null || _c === void 0 ? void 0 : _c.content) !== null && _d !== void 0 ? _d : ""; + newRow[y - 1] = new table_cell_1.TableCell(s); + } + } + newRows[x] = new table_row_1.TableRow(newRow, "", ""); + } else if (x === 1) { + const newRow = new Array(height - 1); + for (let i = 0; i < height - 1; ++i) { + newRow[i] = new table_cell_1.TableCell(" --- "); + } + newRows[x] = new table_row_1.TableRow(newRow, "", ""); + continue; + } else if (x > 1) { + const newRow = new Array(height - 1); + for (let y = 0; y < height; ++y) { + if (y === 0) { + const s = (_f = (_e = table.getCellAt(y, x - 1)) === null || _e === void 0 ? void 0 : _e.content) !== null && _f !== void 0 ? _f : ""; + newRow[y] = new table_cell_1.TableCell(s); + } else if (y === 1) { + continue; + } else if (y > 1) { + const s = (_h = (_g = table.getCellAt(y, x - 1)) === null || _g === void 0 ? void 0 : _g.content) !== null && _h !== void 0 ? _h : ""; + newRow[y - 1] = new table_cell_1.TableCell(s); + } + } + newRows[x] = new table_row_1.TableRow(newRow, "", ""); + } + } + const newTable = new table_1.Table(newRows); + const { table: formattedTable, focus: newFocus } = this.formatAndApply(options, range, lines, formulaLines, newTable, focus, true); + this._moveToFocus(range.start.row, formattedTable, newFocus); + }); + } + /** + * Sorts rows alphanumerically using the column at the current focus. + * If all cells in the sorting column are numbers, the column is sorted + * numerically. + */ + sortRows(sortOrder, options) { + this.withCompletedTable(options, ({ range, lines, formulaLines, table, focus }) => { + const bodyRows = table.getRows().slice(2); + const isNumber = (s) => /^\s*[-+]?((\d+(\.\d+)?)|(\d+\.)|(\.\d+))([eE][-+]?\d+)?\s*$/.test(s); + const notAllNums = bodyRows.map((row) => { + var _a; + return (_a = row.getCellAt(focus.column)) === null || _a === void 0 ? void 0 : _a.content; + }).some((cell) => cell !== void 0 && cell !== "" && !isNumber(cell)); + bodyRows.sort((rowA, rowB) => { + const cellA = rowA.getCellAt(focus.column); + const cellB = rowB.getCellAt(focus.column); + if (cellA === void 0 || cellA.content === "") { + if (cellB === void 0 || cellB.content === "") { + return 0; + } + return -1; + } else if (cellB === void 0 || cellB.content === "") { + return 1; + } + const contentA = notAllNums ? cellA.content.replace(/[*~_$]/g, "") : parseFloat(cellA.content); + const contentB = notAllNums ? cellB.content.replace(/[*~_$]/g, "") : parseFloat(cellB.content); + if (contentA === contentB) { + return 0; + } else if (contentA === void 0) { + return -1; + } else if (contentB === void 0) { + return 1; + } + return contentA < contentB ? -1 : 1; + }); + if (sortOrder === SortOrder2.Descending) { + bodyRows.reverse(); + } + const allRows = table.getRows().slice(0, 2).concat(bodyRows); + const newTable = new table_1.Table(allRows); + const { table: formattedTable, focus: newFocus } = this.formatAndApply(options, range, lines, formulaLines, newTable, focus, true); + this._moveToFocus(range.start.row, formattedTable, newFocus); + }); + } + /** + * Inserts an empty column at the current focus. + */ + insertColumn(options) { + this.withCompletedTable(options, ({ range, lines, formulaLines, table, focus }) => { + let newFocus = focus; + if (newFocus.row === 1) { + newFocus = newFocus.setRow(0); + } + if (newFocus.column < 0) { + newFocus = newFocus.setColumn(0); + } + const column = new Array(table.getHeight() - 1).fill(new table_cell_1.TableCell("")); + const altered = (0, formatter_1.insertColumn)(table, newFocus.column, column, options); + this.formatAndApply(options, range, lines, formulaLines, altered, newFocus); + }); + } + /** + * Deletes a column at the current focus. + */ + deleteColumn(options) { + this.withCompletedTable(options, ({ range, lines, formulaLines, table, focus }) => { + let newFocus = focus; + if (newFocus.row === 1) { + newFocus = newFocus.setRow(0); + } + let altered = table; + let moved = false; + if (0 <= newFocus.column && newFocus.column <= altered.getHeaderWidth() - 1) { + altered = (0, formatter_1.deleteColumn)(table, newFocus.column, options); + moved = true; + if (newFocus.column > altered.getHeaderWidth() - 1) { + newFocus = newFocus.setColumn(altered.getHeaderWidth() - 1); + } + } + this.formatAndApply(options, range, lines, formulaLines, altered, newFocus, moved); + }); + } + /** + * Moves the focused column by the specified offset. + * + * @param offset - An offset the column is moved by. + */ + moveColumn(offset, options) { + this.withCompletedTable(options, ({ range, lines, formulaLines, table, focus }) => { + let newFocus = focus; + let altered = table; + if (0 <= newFocus.column && newFocus.column <= altered.getHeaderWidth() - 1) { + const dest = Math.min(Math.max(newFocus.column + offset, 0), altered.getHeaderWidth() - 1); + altered = (0, formatter_1.moveColumn)(altered, newFocus.column, dest); + newFocus = newFocus.setColumn(dest); + } + this.formatAndApply(options, range, lines, formulaLines, altered, newFocus); + }); + } + /** + * Formats all the tables in the text editor. + */ + formatAll(options) { + this._textEditor.transact(() => { + const re = (0, exports._createIsTableRowRegex)(options.leftMarginChars); + let pos = this._textEditor.getCursorPosition(); + let lines = []; + let startRow = void 0; + let lastRow = this._textEditor.getLastRow(); + for (let row = 0; row <= lastRow; row++) { + const line = this._textEditor.getLine(row); + if (this._textEditor.acceptsTableEdit(row) && re.test(line)) { + lines.push(line); + if (startRow === void 0) { + startRow = row; + } + } else if (startRow !== void 0) { + const endRow = row - 1; + const range = new range_1.Range(new point_1.Point(startRow, 0), new point_1.Point(endRow, lines[lines.length - 1].length)); + const table = (0, parser_1.readTable)(lines, options); + const focus = table.focusOfPosition(pos, startRow); + let diff; + if (focus !== void 0) { + let newFocus = focus; + const completed = (0, formatter_1.completeTable)(table, options); + if (completed.delimiterInserted && newFocus.row > 0) { + newFocus = newFocus.setRow(newFocus.row + 1); + } + const formatted = (0, formatter_1.formatTable)(completed.table, options); + newFocus = newFocus.setOffset((0, exports._computeNewOffset)(newFocus, completed.table, formatted, false)); + const newLines = formatted.table.toLines(); + this._updateLines(range.start.row, range.end.row + 1, newLines, lines); + diff = newLines.length - lines.length; + pos = formatted.table.positionOfFocus(newFocus, startRow); + } else { + const completed = (0, formatter_1.completeTable)(table, options); + const formatted = (0, formatter_1.formatTable)(completed.table, options); + const newLines = formatted.table.toLines(); + this._updateLines(range.start.row, range.end.row + 1, newLines, lines); + diff = newLines.length - lines.length; + if (pos.row > endRow) { + pos = new point_1.Point(pos.row + diff, pos.column); + } + } + lines = []; + startRow = void 0; + lastRow += diff; + row += diff; + } + } + if (startRow !== void 0) { + const endRow = lastRow; + const range = new range_1.Range(new point_1.Point(startRow, 0), new point_1.Point(endRow, lines[lines.length - 1].length)); + const table = (0, parser_1.readTable)(lines, options); + const focus = table.focusOfPosition(pos, startRow); + let newFocus = focus; + const completed = (0, formatter_1.completeTable)(table, options); + if (completed.delimiterInserted && newFocus.row > 0) { + newFocus = newFocus.setRow(newFocus.row + 1); + } + const formatted = (0, formatter_1.formatTable)(completed.table, options); + newFocus = newFocus.setOffset( + // @ts-expect-error TODO + (0, exports._computeNewOffset)(newFocus, completed.table, formatted, false) + ); + const newLines = formatted.table.toLines(); + this._updateLines(range.start.row, range.end.row + 1, newLines, lines); + pos = formatted.table.positionOfFocus(newFocus, startRow); + } + this._textEditor.setCursorPosition(pos); + }); + } + /** + * Exports the table as a two dimensional string array + */ + exportTable(withtHeaders, options) { + return this.withCompletedTable(options, ({ range, lines, formulaLines, table, focus }) => { + const bodyRows = table.getRows(); + if (bodyRows.length > 0 && !withtHeaders) { + bodyRows.splice(0, 2); + } + return bodyRows.map((row) => row.getCells().map((cell) => cell.content)); + }); + } + /** + * Exports the table as a two dimensional string array + */ + exportCSV(withtHeaders, options) { + const r = this.exportTable(withtHeaders, options); + return !r ? void 0 : r.map((row) => row.join(" ")).join("\n"); + } + /** + * Finds a table, completes it, then does an operation with it. + * + * @param func - A function that does some operation on table information obtained by + * {@link TableEditor#_findTable}. + */ + withCompletedTable(options, func) { + return this._withTable(options, (tableInfo) => { + let newFocus = tableInfo.focus; + const completed = (0, formatter_1.completeTable)(tableInfo.table, options); + if (completed.delimiterInserted && newFocus.row > 0) { + newFocus = newFocus.setRow(newFocus.row + 1); + } + const formatted = (0, formatter_1.formatTable)(completed.table, options); + newFocus = newFocus.setOffset((0, exports._computeNewOffset)(newFocus, completed.table, formatted, false)); + tableInfo.table = formatted.table; + tableInfo.focus = newFocus; + return func(tableInfo); + }); + } + /** + * Formats the table and applies any changes based on the difference between + * originalLines and the newTable. Should generally be the last function call + * in a TableEditor function. + */ + formatAndApply(options, range, originalLines, formulaLines, newTable, newFocus, moved = false) { + const formatted = (0, formatter_1.formatTable)(newTable, options); + newFocus = newFocus.setOffset((0, exports._computeNewOffset)(newFocus, newTable, formatted, moved)); + this._textEditor.transact(() => { + this._updateLines(range.start.row, range.end.row + 1, formatted.table.toLines(), originalLines); + if (moved) { + this._selectFocus(range.start.row, formatted.table, newFocus); + } else { + this._moveToFocus(range.start.row, formatted.table, newFocus); + } + }); + this.resetSmartCursor(); + return { + range, + lines: originalLines, + formulaLines, + table: formatted.table, + focus: newFocus + }; + } + }; + exports.TableEditor = TableEditor2; + } +}); + +// node_modules/@tgrosinger/md-advanced-tables/lib/index.js +var require_lib2 = __commonJS({ + "node_modules/@tgrosinger/md-advanced-tables/lib/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.SortOrder = exports.TableEditor = exports.optionsWithDefaults = exports.defaultOptions = exports.ITextEditor = exports.shortestEditScript = exports.applyEditScript = exports.Delete = exports.Insert = exports.moveColumn = exports.deleteColumn = exports.insertColumn = exports.moveRow = exports.deleteRow = exports.insertRow = exports.alterAlignment = exports.formatTable = exports.completeTable = exports.FormatType = exports.readTable = exports.Table = exports.TableRow = exports.TableCell = exports.HeaderAlignment = exports.DefaultAlignment = exports.Alignment = exports.Focus = exports.Range = exports.Point = void 0; + var point_1 = require_point(); + Object.defineProperty(exports, "Point", { enumerable: true, get: function() { + return point_1.Point; + } }); + var range_1 = require_range(); + Object.defineProperty(exports, "Range", { enumerable: true, get: function() { + return range_1.Range; + } }); + var focus_1 = require_focus(); + Object.defineProperty(exports, "Focus", { enumerable: true, get: function() { + return focus_1.Focus; + } }); + var alignment_1 = require_alignment(); + Object.defineProperty(exports, "Alignment", { enumerable: true, get: function() { + return alignment_1.Alignment; + } }); + Object.defineProperty(exports, "DefaultAlignment", { enumerable: true, get: function() { + return alignment_1.DefaultAlignment; + } }); + Object.defineProperty(exports, "HeaderAlignment", { enumerable: true, get: function() { + return alignment_1.HeaderAlignment; + } }); + var table_cell_1 = require_table_cell(); + Object.defineProperty(exports, "TableCell", { enumerable: true, get: function() { + return table_cell_1.TableCell; + } }); + var table_row_1 = require_table_row(); + Object.defineProperty(exports, "TableRow", { enumerable: true, get: function() { + return table_row_1.TableRow; + } }); + var table_1 = require_table(); + Object.defineProperty(exports, "Table", { enumerable: true, get: function() { + return table_1.Table; + } }); + var parser_1 = require_parser(); + Object.defineProperty(exports, "readTable", { enumerable: true, get: function() { + return parser_1.readTable; + } }); + var formatter_js_1 = require_formatter(); + Object.defineProperty(exports, "FormatType", { enumerable: true, get: function() { + return formatter_js_1.FormatType; + } }); + Object.defineProperty(exports, "completeTable", { enumerable: true, get: function() { + return formatter_js_1.completeTable; + } }); + Object.defineProperty(exports, "formatTable", { enumerable: true, get: function() { + return formatter_js_1.formatTable; + } }); + Object.defineProperty(exports, "alterAlignment", { enumerable: true, get: function() { + return formatter_js_1.alterAlignment; + } }); + Object.defineProperty(exports, "insertRow", { enumerable: true, get: function() { + return formatter_js_1.insertRow; + } }); + Object.defineProperty(exports, "deleteRow", { enumerable: true, get: function() { + return formatter_js_1.deleteRow; + } }); + Object.defineProperty(exports, "moveRow", { enumerable: true, get: function() { + return formatter_js_1.moveRow; + } }); + Object.defineProperty(exports, "insertColumn", { enumerable: true, get: function() { + return formatter_js_1.insertColumn; + } }); + Object.defineProperty(exports, "deleteColumn", { enumerable: true, get: function() { + return formatter_js_1.deleteColumn; + } }); + Object.defineProperty(exports, "moveColumn", { enumerable: true, get: function() { + return formatter_js_1.moveColumn; + } }); + var edit_script_1 = require_edit_script(); + Object.defineProperty(exports, "Insert", { enumerable: true, get: function() { + return edit_script_1.Insert; + } }); + Object.defineProperty(exports, "Delete", { enumerable: true, get: function() { + return edit_script_1.Delete; + } }); + Object.defineProperty(exports, "applyEditScript", { enumerable: true, get: function() { + return edit_script_1.applyEditScript; + } }); + Object.defineProperty(exports, "shortestEditScript", { enumerable: true, get: function() { + return edit_script_1.shortestEditScript; + } }); + var text_editor_1 = require_text_editor(); + Object.defineProperty(exports, "ITextEditor", { enumerable: true, get: function() { + return text_editor_1.ITextEditor; + } }); + var options_1 = require_options(); + Object.defineProperty(exports, "defaultOptions", { enumerable: true, get: function() { + return options_1.defaultOptions; + } }); + Object.defineProperty(exports, "optionsWithDefaults", { enumerable: true, get: function() { + return options_1.optionsWithDefaults; + } }); + var table_editor_1 = require_table_editor(); + Object.defineProperty(exports, "TableEditor", { enumerable: true, get: function() { + return table_editor_1.TableEditor; + } }); + Object.defineProperty(exports, "SortOrder", { enumerable: true, get: function() { + return table_editor_1.SortOrder; + } }); + } +}); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => TableEditorPlugin +}); +module.exports = __toCommonJS(main_exports); + +// src/icons.ts +var import_obsidian = require("obsidian"); +var icons = { + spreadsheet: ` + + +`, + alignLeft: ` + + + + + + + +`, + alignCenter: ` + + + + + + + +`, + alignRight: ` + + + + + +`, + deleteColumn: ` + + + +`, + deleteRow: ` + + + + +`, + insertColumn: ` + + + + + + + +`, + insertRow: ` + + + + + + + +`, + moveColumnLeft: ` + + + + +`, + moveColumnRight: ` + + + + +`, + moveRowDown: ` + + + + +`, + moveRowUp: ` + + + + +`, + transpose: ` + + + + +`, + sortAsc: ` + + + + + + + +`, + sortDesc: ` + + + + + + + +`, + formula: ` + + + +`, + help: ` + + + + +`, + csv: ` + + +`, + arrowenter: ` + + +`, + arrowtab: ` + + +` +}; +var addIcons = () => { + Object.keys(icons).forEach((key) => { + if (key !== "help") { + (0, import_obsidian.addIcon)(key, icons[key]); + } + }); +}; + +// src/settings.ts +var import_md_advanced_tables = __toESM(require_lib2()); +var defaultSettings = { + formatType: import_md_advanced_tables.FormatType.NORMAL, + showRibbonIcon: true, + bindEnter: true, + bindTab: true +}; +var TableEditorPluginSettings = class { + constructor(loadedData) { + const allFields = { ...defaultSettings, ...loadedData }; + this.formatType = allFields.formatType; + this.showRibbonIcon = allFields.showRibbonIcon; + this.bindEnter = allFields.bindEnter; + this.bindTab = allFields.bindTab; + } + asOptions() { + return (0, import_md_advanced_tables.optionsWithDefaults)({ formatType: this.formatType }); + } +}; + +// src/obsidian-text-editor.ts +var import_md_advanced_tables2 = __toESM(require_lib2()); +var ObsidianTextEditor = class { + constructor(app, file, editor) { + this.getCursorPosition = () => { + const position = this.editor.getCursor(); + return new import_md_advanced_tables2.Point(position.line, position.ch); + }; + this.setCursorPosition = (pos) => { + this.editor.setCursor({ line: pos.row, ch: pos.column }); + }; + this.setSelectionRange = (range) => { + this.editor.setSelection( + { line: range.start.row, ch: range.start.column }, + { line: range.end.row, ch: range.end.column } + ); + }; + this.getLastRow = () => this.editor.lastLine(); + this.acceptsTableEdit = (row) => { + const cache = this.app.metadataCache.getFileCache(this.file); + if (!cache.sections) { + return true; + } + const table = cache.sections.find( + (section) => section.position.start.line <= row && section.position.end.line >= row && section.type !== "code" && section.type !== "math" + ); + if (table === void 0) { + return false; + } + const preceedingLineIndex = table.position.start.line; + if (preceedingLineIndex >= 0) { + const preceedingLine = this.getLine(preceedingLineIndex); + if (preceedingLine === "-tx-") { + return false; + } + } + return true; + }; + this.getLine = (row) => this.editor.getLine(row); + this.insertLine = (row, line) => { + if (row > this.getLastRow()) { + this.editor.replaceRange("\n" + line, { line: row, ch: 0 }); + } else { + this.editor.replaceRange(line + "\n", { line: row, ch: 0 }); + } + }; + this.deleteLine = (row) => { + if (row === this.getLastRow()) { + const rowContents = this.getLine(row); + this.editor.replaceRange( + "", + { line: row, ch: 0 }, + { line: row, ch: rowContents.length } + ); + } else { + this.editor.replaceRange( + "", + { line: row, ch: 0 }, + { line: row + 1, ch: 0 } + ); + } + }; + this.replaceLines = (startRow, endRow, lines) => { + const realEndRow = endRow - 1; + const endRowContents = this.editor.getLine(realEndRow); + const endRowFinalIndex = endRowContents.length; + this.editor.replaceRange( + lines.join("\n"), + { line: startRow, ch: 0 }, + { line: realEndRow, ch: endRowFinalIndex } + ); + }; + this.transact = (func) => { + func(); + }; + this.app = app; + this.file = file; + this.editor = editor; + } +}; + +// src/table-editor.ts +var import_md_advanced_tables3 = __toESM(require_lib2()); +var import_obsidian2 = require("obsidian"); +var TableEditor = class { + constructor(app, file, editor, settings) { + this.cursorIsInTableFormula = () => this.mte.cursorIsInTableFormula(this.settings.asOptions()); + this.cursorIsInTable = () => this.mte.cursorIsInTable(this.settings.asOptions()); + this.nextCell = () => { + this.mte.nextCell(this.settings.asOptions()); + }; + this.previousCell = () => { + this.mte.previousCell(this.settings.asOptions()); + }; + this.nextRow = () => { + this.mte.nextRow(this.settings.asOptions()); + }; + this.formatTable = () => { + this.mte.format(this.settings.asOptions()); + }; + this.formatAllTables = () => { + this.mte.formatAll(this.settings.asOptions()); + }; + this.insertColumn = () => { + this.mte.insertColumn(this.settings.asOptions()); + }; + this.insertRow = () => { + this.mte.insertRow(this.settings.asOptions()); + }; + this.leftAlignColumn = () => { + this.mte.alignColumn(import_md_advanced_tables3.Alignment.LEFT, this.settings.asOptions()); + }; + this.centerAlignColumn = () => { + this.mte.alignColumn(import_md_advanced_tables3.Alignment.CENTER, this.settings.asOptions()); + }; + this.rightAlignColumn = () => { + this.mte.alignColumn(import_md_advanced_tables3.Alignment.RIGHT, this.settings.asOptions()); + }; + this.moveColumnLeft = () => { + this.mte.moveColumn(-1, this.settings.asOptions()); + }; + this.moveColumnRight = () => { + this.mte.moveColumn(1, this.settings.asOptions()); + }; + this.moveRowUp = () => { + this.mte.moveRow(-1, this.settings.asOptions()); + }; + this.moveRowDown = () => { + this.mte.moveRow(1, this.settings.asOptions()); + }; + this.deleteColumn = () => { + this.mte.deleteColumn(this.settings.asOptions()); + }; + this.deleteRow = () => { + this.mte.deleteRow(this.settings.asOptions()); + }; + this.sortRowsAsc = () => { + this.mte.sortRows(import_md_advanced_tables3.SortOrder.Ascending, this.settings.asOptions()); + }; + this.sortRowsDesc = () => { + this.mte.sortRows(import_md_advanced_tables3.SortOrder.Descending, this.settings.asOptions()); + }; + this.transpose = () => { + this.mte.transpose(this.settings.asOptions()); + }; + this.escape = () => { + this.mte.escape(this.settings.asOptions()); + }; + this.evaluateFormulas = () => { + const err = this.mte.evaluateFormulas(this.settings.asOptions()); + if (err) { + new import_obsidian2.Notice(err.message); + } + }; + this.exportCSVModal = () => { + new CSVModal(this.app, this.mte, this.settings).open(); + }; + this.app = app; + this.settings = settings; + const ote = new ObsidianTextEditor(app, file, editor); + this.mte = new import_md_advanced_tables3.TableEditor(ote); + } +}; +var CSVModal = class extends import_obsidian2.Modal { + constructor(app, mte, settings) { + super(app); + this.mte = mte; + this.settings = settings; + } + onOpen() { + const { contentEl } = this; + const div = contentEl.createDiv({ + cls: "advanced-tables-csv-export" + }); + const ta = div.createEl("textarea", { + attr: { + readonly: true + } + }); + ta.value = this.mte.exportCSV(true, this.settings.asOptions()); + ta.onClickEvent(() => ta.select()); + const lb = div.createEl("label"); + const cb = lb.createEl("input", { + type: "checkbox", + attr: { + checked: true + } + }); + lb.createSpan().setText("Include table headers"); + cb.onClickEvent(() => { + ta.value = this.mte.exportCSV(cb.checked, this.settings.asOptions()); + }); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/table-controls-view.ts +var import_obsidian3 = require("obsidian"); +var TableControlsViewType = "advanced-tables-toolbar"; +var TableControlsView = class extends import_obsidian3.ItemView { + constructor(leaf, settings) { + super(leaf); + this.draw = () => { + const container = this.containerEl.children[1]; + const rootEl = document.createElement("div"); + rootEl.addClass("advanced-tables-buttons"); + rootEl.createDiv().createSpan({ cls: "title" }).setText("Advanced Tables"); + const navHeader = rootEl.createDiv({ cls: "nav-header" }); + const rowOneBtns = navHeader.createDiv({ cls: "nav-buttons-container" }); + rowOneBtns.createSpan({ cls: "advanced-tables-row-label" }).setText("Align:"); + this.drawBtn( + rowOneBtns, + "alignLeft", + "left align column", + (te) => te.leftAlignColumn() + ); + this.drawBtn( + rowOneBtns, + "alignCenter", + "center align column", + (te) => te.centerAlignColumn() + ); + this.drawBtn( + rowOneBtns, + "alignRight", + "right align column", + (te) => te.rightAlignColumn() + ); + const rowTwoBtns = navHeader.createDiv({ cls: "nav-buttons-container" }); + rowTwoBtns.createSpan({ cls: "advanced-tables-row-label" }).setText("Move:"); + this.drawBtn( + rowTwoBtns, + "moveRowDown", + "move row down", + (te) => te.moveRowDown() + ); + this.drawBtn( + rowTwoBtns, + "moveRowUp", + "move row up", + (te) => te.moveRowUp() + ); + this.drawBtn( + rowTwoBtns, + "moveColumnRight", + "move column right", + (te) => te.moveColumnRight() + ); + this.drawBtn( + rowTwoBtns, + "moveColumnLeft", + "move column left", + (te) => te.moveColumnLeft() + ); + this.drawBtn( + rowTwoBtns, + "transpose", + "transpose", + (te) => te.transpose() + ); + const rowThreeBtns = navHeader.createDiv({ cls: "nav-buttons-container" }); + rowThreeBtns.createSpan({ cls: "advanced-tables-row-label" }).setText("Edit:"); + this.drawBtn( + rowThreeBtns, + "insertRow", + "insert row above", + (te) => te.insertRow() + ); + this.drawBtn( + rowThreeBtns, + "insertColumn", + "insert column left", + (te) => te.insertColumn() + ); + this.drawBtn( + rowThreeBtns, + "deleteRow", + "delete row", + (te) => te.deleteRow() + ); + this.drawBtn( + rowThreeBtns, + "deleteColumn", + "delete column", + (te) => te.deleteColumn() + ); + const rowFourBtns = navHeader.createDiv({ cls: "nav-buttons-container" }); + rowFourBtns.createSpan({ cls: "advanced-tables-row-label" }).setText("Sort/F:"); + this.drawBtn( + rowFourBtns, + "sortAsc", + "sort by column ascending", + (te) => te.sortRowsAsc() + ); + this.drawBtn( + rowFourBtns, + "sortDesc", + "sort by column descending", + (te) => te.sortRowsDesc() + ); + this.drawBtn( + rowFourBtns, + "formula", + "evaluate formulas", + (te) => te.evaluateFormulas() + ); + const rowFiveBtns = navHeader.createDiv({ cls: "nav-buttons-container" }); + rowFiveBtns.createSpan({ cls: "advanced-tables-row-label" }).setText("Misc:"); + this.drawBtn( + rowFiveBtns, + "csv", + "export as csv", + (te) => te.exportCSVModal() + ); + this.drawBtn( + rowFiveBtns, + "help", + "help", + () => window.open( + "https://github.com/tgrosinger/advanced-tables-obsidian/blob/main/docs/help.md" + ) + ); + container.empty(); + container.appendChild(rootEl); + }; + this.drawBtn = (parent, iconName, title, fn) => { + const cursorCheck = (te) => { + if (title === "evaluate formulas") { + return te.cursorIsInTable() || te.cursorIsInTableFormula(); + } + return te.cursorIsInTable(); + }; + const button = parent.createDiv({ cls: "advanced-tables-button nav-action-button", title }); + button.onClickEvent(() => this.withTE(fn, cursorCheck)); + button.appendChild(Element(icons[iconName])); + }; + this.withTE = (fn, cursorCheck, alertOnNoTable = true) => { + let editor; + const leaf = this.app.workspace.getMostRecentLeaf(); + if (leaf.view instanceof import_obsidian3.MarkdownView) { + editor = leaf.view.editor; + } else { + console.warn("Advanced Tables: Unable to determine current editor."); + return; + } + const te = new TableEditor(this.app, leaf.view.file, editor, this.settings); + if (!cursorCheck(te)) { + if (alertOnNoTable) { + new import_obsidian3.Notice("Advanced Tables: Cursor must be in a table."); + } + return; + } + fn(te); + }; + this.settings = settings; + } + getViewType() { + return TableControlsViewType; + } + getDisplayText() { + return "Advanced Tables"; + } + getIcon() { + return "spreadsheet"; + } + load() { + super.load(); + this.draw(); + } +}; +var Element = (svgText) => { + const parser = new DOMParser(); + return parser.parseFromString(svgText, "text/xml").documentElement; +}; + +// src/main.ts +var import_state = require("@codemirror/state"); +var import_view = require("@codemirror/view"); +var import_md_advanced_tables4 = __toESM(require_lib2()); +var import_obsidian4 = require("obsidian"); +var TableEditorPlugin = class extends import_obsidian4.Plugin { + constructor() { + super(...arguments); + // makeEditorExtension is used to bind Tab and Enter in the new CM6 Live Preview editor. + this.makeEditorExtension = () => { + const keymaps = []; + if (this.settings.bindEnter) { + keymaps.push({ + key: "Enter", + run: () => this.newPerformTableActionCM6((te) => te.nextRow())(), + preventDefault: true + }); + } + if (this.settings.bindTab) { + keymaps.push({ + key: "Tab", + run: () => this.newPerformTableActionCM6((te) => te.nextCell())(), + shift: () => this.newPerformTableActionCM6( + (te) => te.previousCell() + )(), + preventDefault: true + }); + } + return import_state.Prec.highest(import_view.keymap.of(keymaps)); + }; + this.newPerformTableActionCM6 = (fn) => () => { + const view = this.app.workspace.getActiveViewOfType(import_obsidian4.MarkdownView); + if (view) { + const currentMode = view.currentMode; + if ("sourceMode" in currentMode && !currentMode.sourceMode) { + return false; + } + const te = new TableEditor( + this.app, + view.file, + view.editor, + this.settings + ); + if (te.cursorIsInTable()) { + fn(te); + return true; + } + } + return false; + }; + this.newPerformTableAction = (fn, alertOnNoTable = true) => (checking, editor, view) => { + const te = new TableEditor(this.app, view.file, editor, this.settings); + if (checking) { + return te.cursorIsInTable(); + } + fn(te); + }; + // handleKeyDown is used to bind the tab and enter keys in the legacy CM5 editor. + this.handleKeyDown = (cm, event) => { + if (["Tab", "Enter"].contains(event.key)) { + const view = this.app.workspace.getActiveViewOfType(import_obsidian4.MarkdownView); + const editor = view ? view.editor : null; + const action = this.newPerformTableAction((te) => { + switch (event.key) { + case "Tab": + if (!this.settings.bindTab) { + return; + } + if (event.shiftKey) { + te.previousCell(); + } else { + te.nextCell(); + } + break; + case "Enter": + if (!this.settings.bindEnter) { + return; + } + if (event.shiftKey) { + te.escape(); + } else if (event.ctrlKey || event.metaKey || event.altKey) { + return; + } else { + te.nextRow(); + } + break; + } + event.preventDefault(); + }, false); + if (action(true, editor, view)) { + action(false, editor, view); + } + } + }; + this.toggleTableControlsView = async () => { + const existing = this.app.workspace.getLeavesOfType(TableControlsViewType); + if (existing.length) { + this.app.workspace.revealLeaf(existing[0]); + return; + } + await this.app.workspace.getRightLeaf(false).setViewState({ + type: TableControlsViewType, + active: true + }); + this.app.workspace.revealLeaf( + this.app.workspace.getLeavesOfType(TableControlsViewType)[0] + ); + }; + this.isMobile = () => this.app.isMobile; + } + async onload() { + console.log("loading markdown-table-editor plugin"); + await this.loadSettings(); + this.registerView( + TableControlsViewType, + (leaf) => new TableControlsView(leaf, this.settings) + ); + addIcons(); + if (this.settings.showRibbonIcon) { + this.addRibbonIcon("spreadsheet", "Advanced Tables Toolbar", () => { + this.toggleTableControlsView(); + }); + } + this.registerEditorExtension(this.makeEditorExtension()); + this.addCommand({ + id: "next-row", + name: "Go to next row", + icon: "arrowenter", + editorCheckCallback: this.newPerformTableAction((te) => { + if (this.settings.bindEnter && !this.isMobile) { + new import_obsidian4.Notice( + "Advanced Tables: Next row also bound to enter. Possibly producing double actions. See Advanced Tables settings." + ); + } + te.nextRow(); + }) + }); + this.addCommand({ + id: "next-cell", + name: "Go to next cell", + icon: "arrowtab", + editorCheckCallback: this.newPerformTableAction((te) => { + if (this.settings.bindTab && !this.isMobile) { + new import_obsidian4.Notice( + "Advanced Tables: Next cell also bound to tab. Possibly producing double actions. See Advanced Tables settings." + ); + } + te.nextCell(); + }) + }); + this.addCommand({ + id: "previous-cell", + name: "Go to previous cell", + editorCheckCallback: this.newPerformTableAction((te) => { + if (this.settings.bindTab && !this.isMobile) { + new import_obsidian4.Notice( + "Advanced Tables: Previous cell also bound to shift+tab. Possibly producing double actions. See Advanced Tables settings." + ); + } + te.previousCell(); + }) + }); + this.addCommand({ + id: "format-table", + name: "Format table at the cursor", + editorCheckCallback: this.newPerformTableAction((te) => { + te.formatTable(); + }) + }); + this.addCommand({ + id: "format-all-tables", + name: "Format all tables in this file", + editorCallback: (editor, view) => { + const te = new TableEditor(this.app, view.file, editor, this.settings); + te.formatAllTables(); + } + }); + this.addCommand({ + id: "insert-column", + name: "Insert column before current", + icon: "insertColumn", + editorCheckCallback: this.newPerformTableAction((te) => { + te.insertColumn(); + }) + }); + this.addCommand({ + id: "insert-row", + name: "Insert row before current", + icon: "insertRow", + editorCheckCallback: this.newPerformTableAction((te) => { + te.insertRow(); + }) + }); + this.addCommand({ + id: "escape-table", + name: "Move cursor out of table", + editorCheckCallback: this.newPerformTableAction((te) => { + te.escape(); + }) + }); + this.addCommand({ + id: "left-align-column", + name: "Left align column", + icon: "alignLeft", + editorCheckCallback: this.newPerformTableAction((te) => { + te.leftAlignColumn(); + }) + }); + this.addCommand({ + id: "center-align-column", + name: "Center align column", + icon: "alignCenter", + editorCheckCallback: this.newPerformTableAction((te) => { + te.centerAlignColumn(); + }) + }); + this.addCommand({ + id: "right-align-column", + name: "Right align column", + icon: "alignRight", + editorCheckCallback: this.newPerformTableAction((te) => { + te.rightAlignColumn(); + }) + }); + this.addCommand({ + id: "move-column-left", + name: "Move column left", + icon: "moveColumnLeft", + editorCheckCallback: this.newPerformTableAction((te) => { + te.moveColumnLeft(); + }) + }); + this.addCommand({ + id: "move-column-right", + name: "Move column right", + icon: "moveColumnRight", + editorCheckCallback: this.newPerformTableAction((te) => { + te.moveColumnRight(); + }) + }); + this.addCommand({ + id: "move-row-up", + name: "Move row up", + icon: "moveRowUp", + editorCheckCallback: this.newPerformTableAction((te) => { + te.moveRowUp(); + }) + }); + this.addCommand({ + id: "move-row-down", + name: "Move row down", + icon: "moveRowDown", + editorCheckCallback: this.newPerformTableAction((te) => { + te.moveRowDown(); + }) + }); + this.addCommand({ + id: "delete-column", + name: "Delete column", + icon: "deleteColumn", + editorCheckCallback: this.newPerformTableAction((te) => { + te.deleteColumn(); + }) + }); + this.addCommand({ + id: "delete-row", + name: "Delete row", + icon: "deleteRow", + editorCheckCallback: this.newPerformTableAction((te) => { + te.deleteRow(); + }) + }); + this.addCommand({ + id: "sort-rows-ascending", + name: "Sort rows ascending", + icon: "sortAsc", + editorCheckCallback: this.newPerformTableAction((te) => { + te.sortRowsAsc(); + }) + }); + this.addCommand({ + id: "sort-rows-descending", + name: "Sort rows descending", + icon: "sortDesc", + editorCheckCallback: this.newPerformTableAction((te) => { + te.sortRowsDesc(); + }) + }); + this.addCommand({ + id: "transpose", + name: "Transpose", + icon: "transpose", + editorCheckCallback: this.newPerformTableAction((te) => { + te.transpose(); + }) + }); + this.addCommand({ + id: "evaluate-formulas", + name: "Evaluate table formulas", + icon: "formula", + editorCheckCallback: (checking, editor, view) => { + const te = new TableEditor(this.app, view.file, editor, this.settings); + if (checking) { + return te.cursorIsInTable() || te.cursorIsInTableFormula(); + } + te.evaluateFormulas(); + } + }); + this.addCommand({ + id: "table-control-bar", + name: "Open table controls toolbar", + hotkeys: [ + { + modifiers: ["Mod", "Shift"], + key: "d" + } + ], + callback: () => { + this.toggleTableControlsView(); + } + }); + this.addSettingTab(new TableEditorSettingsTab(this.app, this)); + } + async loadSettings() { + const settingsOptions = Object.assign( + defaultSettings, + await this.loadData() + ); + this.settings = new TableEditorPluginSettings(settingsOptions); + this.saveData(this.settings); + } +}; +var TableEditorSettingsTab = class extends import_obsidian4.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + const { containerEl } = this; + containerEl.empty(); + containerEl.createEl("h2", { text: "Advanced Tables Plugin - Settings" }); + new import_obsidian4.Setting(containerEl).setName("Bind enter to table navigation").setDesc( + 'Requires restart of Obsidian. If enabled, when the cursor is in a table, enter advances to the next row. Disabling this can help avoid conflicting with tag or CJK autocompletion. If disabling, bind "Go to ..." in the Obsidian Hotkeys settings.' + ).addToggle( + (toggle) => toggle.setValue(this.plugin.settings.bindEnter).onChange((value) => { + this.plugin.settings.bindEnter = value; + this.plugin.saveData(this.plugin.settings); + this.display(); + }) + ); + new import_obsidian4.Setting(containerEl).setName("Bind tab to table navigation").setDesc( + 'Requires restart of Obsidian. If enabled, when the cursor is in a table, tab/shift+tab navigate between cells. Disabling this can help avoid conflicting with tag or CJK autocompletion. If disabling, bind "Go to ..." in the Obsidian Hotkeys settings.' + ).addToggle( + (toggle) => toggle.setValue(this.plugin.settings.bindTab).onChange((value) => { + this.plugin.settings.bindTab = value; + this.plugin.saveData(this.plugin.settings); + this.display(); + }) + ); + new import_obsidian4.Setting(containerEl).setName("Pad cell width using spaces").setDesc( + "If enabled, table cells will have spaces added to match the width of the longest cell in the column." + ).addToggle( + (toggle) => toggle.setValue(this.plugin.settings.formatType === import_md_advanced_tables4.FormatType.NORMAL).onChange((value) => { + this.plugin.settings.formatType = value ? import_md_advanced_tables4.FormatType.NORMAL : import_md_advanced_tables4.FormatType.WEAK; + this.plugin.saveData(this.plugin.settings); + this.display(); + }) + ); + new import_obsidian4.Setting(containerEl).setName("Show icon in sidebar").setDesc( + "If enabled, a button which opens the table controls toolbar will be added to the Obsidian sidebar. The toolbar can also be opened with a Hotkey. Changes only take effect on reload." + ).addToggle( + (toggle) => toggle.setValue(this.plugin.settings.showRibbonIcon).onChange((value) => { + this.plugin.settings.showRibbonIcon = value; + this.plugin.saveData(this.plugin.settings); + this.display(); + }) + ); + const div = containerEl.createEl("div", { + cls: "advanced-tables-donation" + }); + const donateText = document.createElement("p"); + donateText.appendText( + "If this plugin adds value for you and you would like to help support continued development, please use the buttons below:" + ); + div.appendChild(donateText); + const parser = new DOMParser(); + div.appendChild( + createDonateButton( + "https://paypal.me/tgrosinger", + parser.parseFromString(paypal, "text/xml").documentElement + ) + ); + div.appendChild( + createDonateButton( + "https://www.buymeacoffee.com/tgrosinger", + parser.parseFromString(buyMeACoffee, "text/xml").documentElement + ) + ); + } +}; +var createDonateButton = (link, img) => { + const a = document.createElement("a"); + a.setAttribute("href", link); + a.addClass("advanced-tables-donate-button"); + a.appendChild(img); + return a; +}; +var buyMeACoffee = ` + + + + + + + + + + + + + + + + + + + + + +`; +var paypal = ` + + + + + + + +`; +/*! Bundled license information: + +decimal.js/decimal.js: + (*! + * decimal.js v10.4.3 + * An arbitrary-precision Decimal type for JavaScript. + * https://github.com/MikeMcl/decimal.js + * Copyright (c) 2022 Michael Mclaughlin + * MIT Licence + *) + +lodash/lodash.js: + (** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + *) +*/ diff --git a/.obsidian/plugins/table-editor-obsidian/manifest.json b/.obsidian/plugins/table-editor-obsidian/manifest.json new file mode 100644 index 0000000..5d03cdf --- /dev/null +++ b/.obsidian/plugins/table-editor-obsidian/manifest.json @@ -0,0 +1,17 @@ +{ + "id": "table-editor-obsidian", + "name": "Advanced Tables", + "author": "Tony Grosinger", + "authorUrl": "https://grosinger.net", + "description": "Improved table navigation, formatting, manipulation, and formulas", + "isDesktopOnly": false, + "minAppVersion": "1.0.0", + "version": "0.22.0", + "js": "main.js", + "fundingUrl": { + "Github Sponsor": "https://github.com/sponsors/tgrosinger", + "Buy me a Coffee": "https://buymeacoffee.com/tgrosinger", + "Paypal": "https://paypal.me/tgrosinger" + }, + "donation": "https://buymeacoffee.com/tgrosinger" +} \ No newline at end of file diff --git a/.obsidian/plugins/table-editor-obsidian/styles.css b/.obsidian/plugins/table-editor-obsidian/styles.css new file mode 100644 index 0000000..089b8cd --- /dev/null +++ b/.obsidian/plugins/table-editor-obsidian/styles.css @@ -0,0 +1,78 @@ +:root { + --advanced-tables-helper-size: 28px; +} + +.HyperMD-table-row span.cm-inline-code { + font-size: 100%; + padding: 0px; +} + +.advanced-tables-buttons>div>.title { + font-weight: var(--font-medium); + font-size: var(--nav-item-size); + color: var(--nav-item-color); + text-decoration: underline; +} + +[data-type="advanced-tables-toolbar"] .nav-buttons-container { + column-gap: 0.2rem; + margin: 0.2rem 0 0.2rem 0; + justify-content: start; +} + +[data-type="advanced-tables-toolbar"] .nav-buttons-container::before { + min-width: 2.6rem; + line-height: var(--advanced-tables-helper-size); + font-size: var(--nav-item-size); + font-weight: var(--nav-item-weight); + color: var(--nav-item-color); +} + +[data-type="advanced-tables-toolbar"] .nav-buttons-container>* { + height: var(--advanced-tables-helper-size); + line-height: var(--advanced-tables-helper-size); +} + +[data-type="advanced-tables-toolbar"] .nav-buttons-container .nav-action-button { + width: var(--advanced-tables-helper-size); + height: var(--advanced-tables-helper-size); + display: flex; + justify-content: center; + align-items: center; + border-radius: var(--radius-s); +} + +[data-type="advanced-tables-toolbar"] .nav-buttons-container .nav-action-button:hover { + background-color: var(--nav-item-background-hover); + color: var(--nav-item-color-hover); + font-weight: var(--nav-item-weight-hover); +} + +.advanced-tables-row-label { + width: 50px; +} + +.widget-icon { + width: 20px; + height: 20px; + fill: var(--text-muted); +} + +.widget-icon:hover { + fill: var(--text-normal); +} + +.advanced-tables-csv-export textarea { + height: 200px; + width: 100%; +} + +.advanced-tables-donation { + width: 70%; + margin: 0 auto; + text-align: center; +} + +.advanced-tables-donate-button { + margin: 10px; +} \ No newline at end of file diff --git a/.obsidian/plugins/waypoint/main.js b/.obsidian/plugins/waypoint/main.js new file mode 100644 index 0000000..60068d1 --- /dev/null +++ b/.obsidian/plugins/waypoint/main.js @@ -0,0 +1,23 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var I=Object.create;var P=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var S=h=>P(h,"__esModule",{value:!0});var L=(h,t)=>{S(h);for(var e in t)P(h,e,{get:t[e],enumerable:!0})},$=(h,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of A(t))!x.call(h,i)&&i!=="default"&&P(h,i,{get:()=>t[i],enumerable:!(e=T(t,i))||e.enumerable});return h},v=h=>$(S(P(h!=null?I(C(h)):{},"default",h&&h.__esModule&&"default"in h?{get:()=>h.default,enumerable:!0}:{value:h,enumerable:!0})),h);var l=(h,t,e)=>new Promise((i,s)=>{var n=g=>{try{p(e.next(g))}catch(c){s(c)}},o=g=>{try{p(e.throw(g))}catch(c){s(c)}},p=g=>g.done?i(g.value):Promise.resolve(g.value).then(n,o);p((e=e.apply(h,t)).next())});L(exports,{default:()=>y});var a=v(require("obsidian")),u;(function(e){e.InsideFolder="INSIDE_FOLDER",e.OutsideFolder="OUTSIDE_FOLDER"})(u||(u={}));var f;(function(e){e.Waypoint="waypoint",e.Landmark="landmark"})(f||(f={}));var N={waypointFlag:"%% Waypoint %%",landmarkFlag:"%% Landmark %%",stopScanAtFolderNotes:!1,showFolderNotes:!1,showNonMarkdownFiles:!1,debugLogging:!1,useWikiLinks:!0,useFrontMatterTitle:!1,showEnclosingNote:!1,folderNoteType:u.InsideFolder,ignorePaths:["_attachments"],useSpaces:!1,numSpaces:2},F=class extends a.Plugin{constructor(){super(...arguments);this.foldersWithChanges=new Set;this.detectFlags=t=>l(this,null,function*(){this.detectFlag(t,f.Waypoint),this.detectFlag(t,f.Landmark)});this.detectFlag=(t,e)=>l(this,null,function*(){this.log("Modification on "+t.name),this.log("Scanning for "+e+" flags...");let i=yield this.getWaypointFlag(e),n=(yield this.app.vault.cachedRead(t)).split(` +`);for(let o=0;ol(this,null,function*(){this.log("Updating changed folders..."),this.foldersWithChanges.forEach(t=>{this.log("Updating "+t.path),this.updateParentPoint(t,!0)}),this.foldersWithChanges.clear()});this.scheduleUpdate=(0,a.debounce)(this.updateChangedFolders.bind(this),500,!0);this.updateParentPoint=(t,e)=>l(this,null,function*(){let[i,s]=yield this.locateParentPoint(t,e);s!==null&&(this.updateWaypoint(s,i),this.updateParentPoint(s.parent,!1))})}onload(){return l(this,null,function*(){yield this.loadSettings(),this.addCommand({id:"go_to_parent_waypoint",name:"Go to parent Waypoint",callback:()=>l(this,null,function*(){let t=this.app.workspace.getActiveFile(),[,e]=yield this.locateParentPoint(t,!1);this.app.workspace.activeLeaf.openFile(e)})}),this.app.workspace.onLayoutReady(()=>l(this,null,function*(){this.registerEvent(this.app.vault.on("create",t=>{this.log("create "+t.name),this.foldersWithChanges.add(t.parent),this.scheduleUpdate()})),this.registerEvent(this.app.vault.on("delete",t=>{this.log("delete "+t.name);let e=this.getParentFolder(t.path);e!==null&&(this.foldersWithChanges.add(e),this.scheduleUpdate())})),this.registerEvent(this.app.vault.on("rename",(t,e)=>{this.log("rename "+t.name),this.foldersWithChanges.add(t.parent);let i=this.getParentFolder(e);i!==null&&this.foldersWithChanges.add(i),this.scheduleUpdate()})),this.registerEvent(this.app.vault.on("modify",this.detectFlags))})),this.addSettingTab(new W(this.app,this))})}onunload(){}isFolderNote(t){return this.settings.folderNoteType===u.InsideFolder?t.basename==t.parent.name:t.parent?this.app.vault.getAbstractFileByPath(this.getCleanParentPath(t)+t.basename)instanceof a.TFolder:!1}getCleanParentPath(t){return t.parent instanceof a.TFolder&&t.parent.isRoot()?"":t.parent.path+"/"}printError(t,e,i){return l(this,null,function*(){this.log("Creating "+i+" error in "+t.path);let n=(yield this.app.vault.read(t)).split(` +`),o=-1,p=yield this.getWaypointFlag(i);for(let g=0;g"),E=b.includes(p),m=w;continue}if(m!==-1&&b===n){r=w;break}}if(m===-1){console.error("Error: No "+e+" found while trying to update "+t.path);return}this.log(e+" found at "+m+" to "+r),d&&(E&&(o=(e===f.Landmark?`[!landmark] +`:`[!waypoint] +`)+o),o=o.split(` +`).map(k=>`>${k}`).join(` +`)),c.splice(m,r!==-1?r-m+1:1,o),yield this.app.vault.modify(t,c.join(` +`))})}getFileTreeRepresentation(t,e,i,s=!1){return l(this,null,function*(){var c,m;let o=(this.settings.useSpaces?" ".repeat(this.settings.numSpaces):" ").repeat(i)+"-";if(!(e instanceof a.TFile)&&!(e instanceof a.TFolder)||(this.log(e.path),this.ignorePath(e.path)))return null;if(e instanceof a.TFile){this.settings.debugLogging&&console.log(e);let r;if(this.settings.useFrontMatterTitle){let d=(m=(c=this.app.metadataCache)==null?void 0:c.getFileCache(e))==null?void 0:m.frontmatter;d&&d.hasOwnProperty("title")&&(r=d.title)}else r=null;return e.extension=="md"?this.settings.useWikiLinks?r?`${o} [[${e.basename}|${r}]]`:`${o} [[${e.basename}]]`:r?`${o} [${r}](${this.getEncodedUri(t,e)})`:`${o} [${e.basename}](${this.getEncodedUri(t,e)})`:this.settings.showNonMarkdownFiles?this.settings.useWikiLinks?`${o} [[${e.name}]]`:`${o} [${e.name}](${this.getEncodedUri(t,e)})`:null}let p="";if(!s||this.settings.showEnclosingNote){p=`${o} **${e.name}**`;let r;if(this.settings.folderNoteType===u.InsideFolder?r=this.app.vault.getAbstractFileByPath(e.path+"/"+e.name+".md"):e.parent&&(r=this.app.vault.getAbstractFileByPath(e.parent.path+"/"+e.name+".md")),r instanceof a.TFile&&(this.settings.useWikiLinks?p=`${o} **[[${r.basename}]]**`:p=`${o} **[${r.basename}](${this.getEncodedUri(t,r)})**`,!s)){if(this.settings.stopScanAtFolderNotes)return p;let d=yield this.app.vault.cachedRead(r);if(d.includes(F.BEGIN_WAYPOINT)||d.includes(this.settings.waypointFlag))return p}}if(!e.children||e.children.length==0)return`${o} **${e.name}**`;let g=e.children;if(g=g.sort((r,d)=>r.name.localeCompare(d.name,void 0,{numeric:!0,sensitivity:"base"})),!this.settings.showFolderNotes)if(this.settings.folderNoteType===u.InsideFolder)g=g.filter(r=>(this.settings.showFolderNotes||r.name!==e.name+".md")&&!this.ignorePath(r.path));else{let r=new Set;for(let d of g)d instanceof a.TFolder&&r.add(d.name+".md");g=g.filter(d=>(d instanceof a.TFolder||!r.has(d.name))&&!this.ignorePath(d.path))}if(g.length>0){let r=s&&!this.settings.showEnclosingNote?i:i+1;p+=(p===""?"":` +`)+(yield Promise.all(g.map(d=>this.getFileTreeRepresentation(t,d,r)))).filter(Boolean).join(` +`)}return p})}getEncodedUri(t,e){return t.isRoot()?`./${encodeURI(e.path)}`:`./${encodeURI(e.path.substring(t.path.length+1))}`}ignorePath(t){let e=!1;return this.settings.ignorePaths.forEach(i=>{if(i==="")return;let s=new RegExp(i);t.match(s)&&(this.log(`Ignoring path: ${t}`),e=!0)}),!!e}locateParentPoint(t,e){return l(this,null,function*(){this.log("Locating parent flag and file of "+t.name);let i=e?t:t.parent;for(;i;){let s;if(this.settings.folderNoteType===u.InsideFolder?s=this.app.vault.getAbstractFileByPath(i.path+"/"+i.name+".md"):i.parent&&(s=this.app.vault.getAbstractFileByPath(this.getCleanParentPath(i)+i.name+".md")),s instanceof a.TFile){this.log("Found folder note: "+s.path);let n=yield this.app.vault.cachedRead(s);if(n.includes(F.BEGIN_WAYPOINT)||n.includes(this.settings.waypointFlag))return this.log("Found parent waypoint!"),[f.Waypoint,s];if(n.includes(F.BEGIN_LANDMARK)||n.includes(this.settings.landmarkFlag))return this.log("Found parent landmark!"),[f.Landmark,s]}i=i.parent}return this.log("No parent flag found."),[null,null]})}getParentFolder(t){let e=this.app.vault.getAbstractFileByPath(t.split("/").slice(0,-1).join("/"));return e instanceof a.TFolder?e:null}log(t){this.settings.debugLogging&&console.log(t)}loadSettings(){return l(this,null,function*(){this.settings=Object.assign({},N,yield this.loadData())})}saveSettings(){return l(this,null,function*(){yield this.saveData(this.settings)})}},y=F;y.BEGIN_WAYPOINT="%% Begin Waypoint %%",y.END_WAYPOINT="%% End Waypoint %%",y.BEGIN_LANDMARK="%% Begin Landmark %%",y.END_LANDMARK="%% End Landmark %%";var W=class extends a.PluginSettingTab{constructor(t,e){super(t,e);this.plugin=e}display(){let{containerEl:t}=this;t.empty(),t.createEl("h2",{text:"Waypoint Settings"}),new a.Setting(this.containerEl).setName("Folder Note Style").setDesc("Select the style of folder note used.").addDropdown(s=>s.addOption(u.InsideFolder,"Folder Name Inside").addOption(u.OutsideFolder,"Folder Name Outside").setValue(this.plugin.settings.folderNoteType).onChange(n=>l(this,null,function*(){this.plugin.settings.folderNoteType=n,yield this.plugin.saveSettings()}))),new a.Setting(t).setName("Show Folder Notes").setDesc("If enabled, folder notes will be listed alongside other notes in the generated waypoints.").addToggle(s=>s.setValue(this.plugin.settings.showFolderNotes).onChange(n=>l(this,null,function*(){this.plugin.settings.showFolderNotes=n,yield this.plugin.saveSettings()}))),new a.Setting(t).setName("Show Non-Markdown Files").setDesc("If enabled, non-Markdown files will be listed alongside other notes in the generated waypoints.").addToggle(s=>s.setValue(this.plugin.settings.showNonMarkdownFiles).onChange(n=>l(this,null,function*(){this.plugin.settings.showNonMarkdownFiles=n,yield this.plugin.saveSettings()}))),new a.Setting(t).setName("Show Enclosing Note").setDesc("If enabled, the name of the folder note containing the waypoint will be listed at the top of the generated waypoints.").addToggle(s=>s.setValue(this.plugin.settings.showEnclosingNote).onChange(n=>l(this,null,function*(){this.plugin.settings.showEnclosingNote=n,yield this.plugin.saveSettings()}))),new a.Setting(t).setName("Stop Scan at Folder Notes").setDesc("If enabled, the waypoint generator will stop scanning nested folders when it encounters a folder note. Otherwise, it will only stop if the folder note contains a waypoint.").addToggle(s=>s.setValue(this.plugin.settings.stopScanAtFolderNotes).onChange(n=>l(this,null,function*(){this.plugin.settings.stopScanAtFolderNotes=n,yield this.plugin.saveSettings()}))),new a.Setting(t).setName("Use WikiLinks").setDesc("If enabled, links will be generated like [[My Page]] instead of [My Page](../Folder/My%Page.md).").addToggle(s=>s.setValue(this.plugin.settings.useWikiLinks).onChange(n=>l(this,null,function*(){this.plugin.settings.useWikiLinks=n,yield this.plugin.saveSettings()}))),new a.Setting(t).setName("Use Title Property").setDesc('If enabled, links will use the "title" frontmatter property for the displayed text (if it exists).').addToggle(s=>s.setValue(this.plugin.settings.useFrontMatterTitle).onChange(n=>l(this,null,function*(){this.plugin.settings.useFrontMatterTitle=n,yield this.plugin.saveSettings()}))),new a.Setting(t).setName("Use Spaces for Indentation").setDesc("If enabled, the waypoint list will be indented with spaces rather than with tabs.").addToggle(s=>s.setValue(this.plugin.settings.useSpaces).onChange(n=>l(this,null,function*(){this.plugin.settings.useSpaces=n,yield this.plugin.saveSettings()}))),new a.Setting(t).setName("Number of Spaces for Indentation").setDesc("If spaces are used for indentation, this is the number of spaces that will be used per indentation level.").addText(s=>s.setPlaceholder("2").setValue(""+this.plugin.settings.numSpaces).onChange(n=>l(this,null,function*(){let o=parseInt(n,10);isNaN(o)||(this.plugin.settings.numSpaces=o,yield this.plugin.saveSettings())}))),new a.Setting(t).setName("Waypoint Flag").setDesc("Text flag that triggers waypoint generation in a folder note. Must be surrounded by double-percent signs.").addText(s=>s.setPlaceholder(N.waypointFlag).setValue(this.plugin.settings.waypointFlag).onChange(n=>l(this,null,function*(){n&&n.startsWith("%%")&&n.endsWith("%%")&&n!=="%%"&&n!=="%%%"&&n!=="%%%%"?this.plugin.settings.waypointFlag=n:(this.plugin.settings.waypointFlag=N.waypointFlag,console.error("Error: Waypoint flag must be surrounded by double-percent signs.")),yield this.plugin.saveSettings()}))),new a.Setting(t).setName("Landmark Flag").setDesc("Text flag that triggers landmark generation in a folder note. Must be surrounded by double-percent signs.").addText(s=>s.setPlaceholder(N.landmarkFlag).setValue(this.plugin.settings.landmarkFlag).onChange(n=>l(this,null,function*(){n&&n.startsWith("%%")&&n.endsWith("%%")&&n!=="%%"&&n!=="%%%"&&n!=="%%%%"?this.plugin.settings.landmarkFlag=n:(this.plugin.settings.landmarkFlag=N.landmarkFlag,console.error("Error: Landmark flag must be surrounded by double-percent signs.")),yield this.plugin.saveSettings()}))),new a.Setting(t).setName("Ignored Files/Folders").setDesc("Regex list of files or folders to ignore while making indices. Enter only one regex per line.").addTextArea(s=>s.setPlaceholder(N.ignorePaths.join(` +`)).setValue(this.plugin.settings.ignorePaths.join(` +`)).onChange(n=>l(this,null,function*(){let o=n.trim().split(` +`).map(p=>this.getNormalizedPath(p));this.plugin.settings.ignorePaths=o,yield this.plugin.saveSettings()})));let e=t.createEl("div",{cls:"setting-item"}),i=e.createDiv({cls:"setting-item-description"});i.createSpan({text:"For instructions on how to use this plugin, check out the README on "}),i.createEl("a",{attr:{href:"https://github.com/IdreesInc/Waypoint"},text:"GitHub"}),i.createSpan({text:" or get in touch with the author "}),i.createEl("a",{attr:{href:"https://github.com/IdreesInc"},text:"@IdreesInc"}),e.appendChild(i)}getNormalizedPath(t){return t.length==0?t:(0,a.normalizePath)(t)}}; diff --git a/.obsidian/plugins/waypoint/manifest.json b/.obsidian/plugins/waypoint/manifest.json new file mode 100644 index 0000000..ab0226a --- /dev/null +++ b/.obsidian/plugins/waypoint/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "waypoint", + "name": "Waypoint", + "version": "2.1.0", + "minAppVersion": "0.12.0", + "description": "Easily generate dynamic content maps in your folder notes using waypoints. Enables folders to show up in the graph view and removes the need for messy tags!", + "author": "Idrees Hassan", + "authorUrl": "https://idreesinc.com", + "isDesktopOnly": false +} \ No newline at end of file diff --git a/.obsidian/workspace-mobile.json b/.obsidian/workspace-mobile.json index 4573f73..0897bb8 100644 --- a/.obsidian/workspace-mobile.json +++ b/.obsidian/workspace-mobile.json @@ -127,12 +127,13 @@ }, "left-ribbon": { "hiddenItems": { - "dashboard-navigator:Open dashboard navigator": false, "graph:Open graph view": true, "canvas:Create new canvas": true, "command-palette:Open command palette": false, "zk-prefixer:Create new unique note": true, - "smart-random-note:Open Random Note from Search": true + "smart-random-note:Open Random Note from Search": true, + "dashboard-navigator:Open dashboard navigator": false, + "table-editor-obsidian:Advanced Tables Toolbar": true } }, "active": "9fab42d2d7ba44d4", diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index a4c3812..6c4540e 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -155,8 +155,9 @@ "canvas:Create new canvas": true, "zk-prefixer:Create new unique note": true, "command-palette:Open command palette": false, - "smart-random-note:Open Random Note from Search": false, - "dashboard-navigator:Open dashboard navigator": false + "smart-random-note:Open Random Note from Search": true, + "dashboard-navigator:Open dashboard navigator": false, + "table-editor-obsidian:Advanced Tables Toolbar": true } }, "active": "7d5274162457b1c7", diff --git a/Dot to Dot/.nomedia b/Dot to Dot/.nomedia index 8863c00..4cd0c0b 100644 --- a/Dot to Dot/.nomedia +++ b/Dot to Dot/.nomedia @@ -1 +1 @@ -/storage/emulated/0/Krita \ No newline at end of file +/storage/emulated/0/obsidian/digital-art-composition-book/Dot to Dot \ No newline at end of file diff --git a/Dot to Dot/In Progress/.nomedia b/Dot to Dot/In Progress/.nomedia index 8863c00..5440a01 100644 --- a/Dot to Dot/In Progress/.nomedia +++ b/Dot to Dot/In Progress/.nomedia @@ -1 +1 @@ -/storage/emulated/0/Krita \ No newline at end of file +/storage/emulated/0/obsidian/digital-art-composition-book/Dot to Dot/In Progress \ No newline at end of file diff --git a/Dot to Dot/Prepped/.nomedia b/Dot to Dot/Prepped/.nomedia index 8863c00..1304fbf 100644 --- a/Dot to Dot/Prepped/.nomedia +++ b/Dot to Dot/Prepped/.nomedia @@ -1 +1 @@ -/storage/emulated/0/Krita \ No newline at end of file +/storage/emulated/0/obsidian/digital-art-composition-book/Dot to Dot/Prepped \ No newline at end of file diff --git a/Ideas - Inspiration/.nomedia b/Ideas - Inspiration/.nomedia index 8863c00..709aca0 100644 --- a/Ideas - Inspiration/.nomedia +++ b/Ideas - Inspiration/.nomedia @@ -1 +1 @@ -/storage/emulated/0/Krita \ No newline at end of file +/storage/emulated/0/obsidian/digital-art-composition-book/Ideas - Inspiration \ No newline at end of file