obsidian-dev-utils 82.0.0-beta.3 → 82.0.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 82.0.0-beta.5
4
+
5
+ - feat: add EditorLockComponent for per-plugin lock ownership and auto-release Adds EditorLockComponent, a per-plugin ComponentEx handle for note-scoped locking: a plugin does `this.addChild(new EditorLockComponent(this.app))` and locks via lockForPath/unlockForPath/isLockedForPath. Its onunload releases every lock the plugin still holds (new EditorPathLockManager.unlockAllForPlugin), so a note is never left stuck read-only because the locking plugin was disabled or reloaded mid-operation. Other plugins' locks on the same note are untouched. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XxKwqvKdb73qgXQjJcEvav
6
+
7
+ ## 82.0.0-beta.4
8
+
9
+ - feat: list the locking plugins in the editor-lock indicator tooltip Lock counts are now tracked per locking plugin (the caller is identified via getPluginId), so the tab-header, action-bar, and status-bar indicators show a "Locked by\n<plugin names>" tooltip naming every plugin that currently holds a lock on the note, updated live as plugins lock and unlock. Plugin display names are resolved from app.plugins.manifests, falling back to the plugin id. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XxKwqvKdb73qgXQjJcEvav
10
+
3
11
  ## 82.0.0-beta.3
4
12
 
5
13
  - feat: pulse the minimized modal bar to keep it noticeable A minimized modal is easy to forget; the floating bar now gently pulses an accent ring so the user remembers an operation is still in progress. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XxKwqvKdb73qgXQjJcEvav
@@ -130,7 +130,7 @@ __export(library_exports, {
130
130
  LIBRARY_VERSION: () => LIBRARY_VERSION
131
131
  });
132
132
  module.exports = __toCommonJS(library_exports);
133
- const LIBRARY_VERSION = "82.0.0-beta.3";
133
+ const LIBRARY_VERSION = "82.0.0-beta.5";
134
134
  const LIBRARY_NAME = "obsidian-dev-utils";
135
135
  const LIBRARY_STYLES = ".obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component pre, .obsidian-dev-utils.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-dev-utils.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-dev-utils.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-dev-utils.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-dev-utils.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-dev-utils.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-dev-utils-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-dev-utils-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n.obsidian-dev-utils input[type=url] {\n height: var(--input-height);\n}\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=tel],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=url],\n.obsidian-dev-utils input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-dev-utils input[type=month]:hover,\n .obsidian-dev-utils input[type=tel]:hover,\n .obsidian-dev-utils input[type=time]:hover,\n .obsidian-dev-utils input[type=url]:hover,\n .obsidian-dev-utils input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus, .obsidian-dev-utils input[type=month]:focus-visible,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=tel]:focus-visible,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=time]:focus-visible,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=url]:focus-visible,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus,\n.obsidian-dev-utils input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-dev-utils input[type=month]::placeholder,\n.obsidian-dev-utils input[type=tel]::placeholder,\n.obsidian-dev-utils input[type=time]::placeholder,\n.obsidian-dev-utils input[type=url]::placeholder,\n.obsidian-dev-utils input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-dev-utils input[type=month], .is-rtl .obsidian-dev-utils input[type=month], .rtl .obsidian-dev-utils input[type=month],\n.mod-rtl .obsidian-dev-utils input[type=time],\n.is-rtl .obsidian-dev-utils input[type=time],\n.rtl .obsidian-dev-utils input[type=time],\n.mod-rtl .obsidian-dev-utils input[type=week],\n.is-rtl .obsidian-dev-utils input[type=week],\n.rtl .obsidian-dev-utils input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\n.obsidian-dev-utilsprogress.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-dev-utils-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-dev-utils.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: var(--size-4-4);\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n animation: obsidian-dev-utils-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-dev-utils.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-dev-utils.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-dev-utils .multiple-dropdown-component select,\n.obsidian-dev-utils .multiple-dropdown-component select:focus,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-dev-utils .multiple-dropdown-component select option:checked,\n.obsidian-dev-utils .multiple-dropdown-component select:focus option:checked,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown option:checked {\n background-color: #1967d2;\n color: #fff;\n}\n\n.obsidian-dev-utils.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-dev-utils.prompt-modal .text-box {\n width: 100%;\n}\n\nbody button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid, .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid, .obsidian-dev-utils input.metadata-input-text:focus:invalid,\n.obsidian-dev-utils input[type=date]:active:invalid,\n.obsidian-dev-utils input[type=date]:focus-visible:invalid,\n.obsidian-dev-utils input[type=date]:focus:invalid,\n.obsidian-dev-utils input[type=datetime-local]:active:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid,\n.obsidian-dev-utils input[type=email]:active:invalid,\n.obsidian-dev-utils input[type=email]:focus-visible:invalid,\n.obsidian-dev-utils input[type=email]:focus:invalid,\n.obsidian-dev-utils input[type=number]:active:invalid,\n.obsidian-dev-utils input[type=number]:focus-visible:invalid,\n.obsidian-dev-utils input[type=number]:focus:invalid,\n.obsidian-dev-utils input[type=password]:active:invalid,\n.obsidian-dev-utils input[type=password]:focus-visible:invalid,\n.obsidian-dev-utils input[type=password]:focus:invalid,\n.obsidian-dev-utils input[type=search]:active:invalid,\n.obsidian-dev-utils input[type=search]:focus-visible:invalid,\n.obsidian-dev-utils input[type=search]:focus:invalid,\n.obsidian-dev-utils input[type=text]:active:invalid,\n.obsidian-dev-utils input[type=text]:focus-visible:invalid,\n.obsidian-dev-utils input[type=text]:focus:invalid,\n.obsidian-dev-utils textarea:active:invalid,\n.obsidian-dev-utils textarea:focus-visible:invalid,\n.obsidian-dev-utils textarea:focus:invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-dev-utils.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-dev-utils.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;ACTF;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;ACjDJ;EACE;;;ACFJ;EACE;IAEE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAON;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;ACrEJ;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACRJ;EACE;;;ACDF;EACE;;;ACON;EACE;;;ACTE;EACE;;;ACEJ;EAJA;;AAoBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EApBJ;;AA0BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-dev-utils%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-dev-utils%60.%5Cn.obsidian-dev-utils-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&progress.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-dev-utils-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20var(--size-4-4);%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20%231967d2;%5Cn%20%20%20%20%20%20%20%20color:%20%23fff;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20with%20a%5Cn//%20%60body%60-prefixed%20selector%20(specificity%200,1,2)%20so%20it%20wins%20over%20tldraw's%20(0,1,1)%20while%5Cn//%20Staying%20correct%20for%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cnbody%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cr%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cr%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cr%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cr%5Cn%20%20%20%20%7D%5Cr%5Cn%20%20%7D%5Cr%5Cn%7D%5Cr%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
136
136
  // Annotate the CommonJS export names for ESM import in node:
@@ -125,6 +125,7 @@ var __copyProps = (to, from, except, desc) => {
125
125
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
126
126
  var editor_lock_exports = {};
127
127
  __export(editor_lock_exports, {
128
+ EditorLockComponent: () => EditorLockComponent,
128
129
  isEditorLockedForPath: () => isEditorLockedForPath,
129
130
  lockEditorForPath: () => lockEditorForPath,
130
131
  unlockEditorForPath: () => unlockEditorForPath
@@ -135,10 +136,12 @@ var import_obsidian = require('obsidian');
135
136
  var import_disposable = require('../disposable.cjs');
136
137
  var import_function = require('../function.cjs');
137
138
  var import_obsidian_dev_utils_state = require('../obsidian-dev-utils-state.cjs');
139
+ var import_type_guards = require('../type-guards.cjs');
138
140
  var import_component_ex = require('./components/component-ex.cjs');
139
141
  var import_editor = require('./editor.cjs');
140
142
  var import_file_system = require('./file-system.cjs');
141
143
  var import_i18n = require('./i18n/i18n.cjs');
144
+ var import_plugin_id = require('./plugin/plugin-id.cjs');
142
145
  const EDITOR_LOCK_STATE_KEY = "editorLock";
143
146
  const LOCK_ICON_ID = "lock";
144
147
  const LOCK_INDICATOR_CSS_CLASS = "obsidian-dev-utils-lock-indicator";
@@ -162,28 +165,40 @@ class EditorLockEventsComponent extends import_component_ex.ComponentEx {
162
165
  class EditorPathLockManager {
163
166
  eventsComponent;
164
167
  indicatorsByView = /* @__PURE__ */ new Map();
165
- lockCountByPath = /* @__PURE__ */ new Map();
168
+ lockCountByPluginIdByPath = /* @__PURE__ */ new Map();
166
169
  statusBarItemEl = null;
167
170
  isLocked(app, pathOrFile) {
168
- return (this.lockCountByPath.get((0, import_file_system.getPath)(app, pathOrFile)) ?? 0) > 0;
171
+ return this.isPathLocked((0, import_file_system.getPath)(app, pathOrFile));
169
172
  }
170
- lock(app, pathOrFile) {
173
+ lock(app, pathOrFile, pluginId) {
171
174
  const path = (0, import_file_system.getPath)(app, pathOrFile);
172
- this.lockCountByPath.set(path, (this.lockCountByPath.get(path) ?? 0) + 1);
175
+ let lockCountByPluginId = this.lockCountByPluginIdByPath.get(path);
176
+ if (!lockCountByPluginId) {
177
+ lockCountByPluginId = /* @__PURE__ */ new Map();
178
+ this.lockCountByPluginIdByPath.set(path, lockCountByPluginId);
179
+ }
180
+ lockCountByPluginId.set(pluginId, (lockCountByPluginId.get(pluginId) ?? 0) + 1);
173
181
  this.ensureSubscribed(app);
174
182
  this.reconcile(app);
175
183
  return new import_disposable.CallbackDisposable({
176
184
  callback: () => {
177
- this.unlockPath(app, path);
185
+ this.unlockPath(app, path, pluginId);
178
186
  },
179
187
  multipleDisposeBehavior: import_disposable.MultipleDisposeBehavior.Ignore
180
188
  });
181
189
  }
182
- unlock(app, pathOrFile) {
183
- this.unlockPath(app, (0, import_file_system.getPath)(app, pathOrFile));
190
+ unlock(app, pathOrFile, pluginId) {
191
+ this.unlockPath(app, (0, import_file_system.getPath)(app, pathOrFile), pluginId);
192
+ }
193
+ unlockAllForPlugin(app, pluginId) {
194
+ for (const [path, lockCountByPluginId] of this.lockCountByPluginIdByPath) {
195
+ if (lockCountByPluginId.delete(pluginId) && lockCountByPluginId.size === 0) {
196
+ this.lockCountByPluginIdByPath.delete(path);
197
+ }
198
+ }
199
+ this.reconcileAndCleanup(app);
184
200
  }
185
- createIndicators(view) {
186
- const tooltip = (0, import_i18n.t)(($) => $.obsidianDevUtils.editorLock.lockedNoteTooltip);
201
+ createIndicators(view, tooltip) {
187
202
  const actionIconEl = view.addAction(LOCK_ICON_ID, tooltip, import_function.noop);
188
203
  let tabIconEl = null;
189
204
  const tabStatusContainerEl = view.leaf.tabHeaderStatusContainerEl;
@@ -206,6 +221,16 @@ class EditorPathLockManager {
206
221
  });
207
222
  this.eventsComponent.load();
208
223
  }
224
+ isPathLocked(path) {
225
+ return (this.lockCountByPluginIdByPath.get(path)?.size ?? 0) > 0;
226
+ }
227
+ lockTooltip(app, path) {
228
+ const lockCountByPluginId = this.lockCountByPluginIdByPath.get(path);
229
+ (0, import_type_guards.assertNonNullable)(lockCountByPluginId);
230
+ const header = (0, import_i18n.t)(($) => $.obsidianDevUtils.editorLock.lockedByTooltip);
231
+ const pluginNames = Array.from(lockCountByPluginId.keys()).map((pluginId) => app.plugins.manifests[pluginId]?.name ?? pluginId);
232
+ return [header, ...pluginNames].join("\n");
233
+ }
209
234
  reconcile(app) {
210
235
  const viewsToLock = /* @__PURE__ */ new Set();
211
236
  for (const leaf of app.workspace.getLeavesOfType(import_implementations.ViewType.Markdown)) {
@@ -217,11 +242,15 @@ class EditorPathLockManager {
217
242
  if (path === void 0) {
218
243
  continue;
219
244
  }
220
- if ((this.lockCountByPath.get(path) ?? 0) > 0) {
245
+ if (this.isPathLocked(path)) {
221
246
  viewsToLock.add(view);
222
- if (!this.indicatorsByView.has(view)) {
247
+ const tooltip = this.lockTooltip(app, path);
248
+ const indicators = this.indicatorsByView.get(view);
249
+ if (indicators) {
250
+ this.updateIndicatorTooltips(indicators, tooltip);
251
+ } else {
223
252
  (0, import_editor.lockEditor)(view.editor);
224
- this.indicatorsByView.set(view, this.createIndicators(view));
253
+ this.indicatorsByView.set(view, this.createIndicators(view, tooltip));
225
254
  }
226
255
  }
227
256
  }
@@ -235,59 +264,125 @@ class EditorPathLockManager {
235
264
  }
236
265
  this.updateStatusBar(app);
237
266
  }
238
- unlockPath(app, path) {
239
- const count = this.lockCountByPath.get(path) ?? 0;
267
+ reconcileAndCleanup(app) {
268
+ this.reconcile(app);
269
+ if (this.lockCountByPluginIdByPath.size === 0) {
270
+ this.eventsComponent?.unload();
271
+ this.eventsComponent = void 0;
272
+ }
273
+ }
274
+ unlockPath(app, path, pluginId) {
275
+ const lockCountByPluginId = this.lockCountByPluginIdByPath.get(path);
276
+ if (!lockCountByPluginId) {
277
+ return;
278
+ }
279
+ const count = lockCountByPluginId.get(pluginId) ?? 0;
240
280
  if (count <= 0) {
241
281
  return;
242
282
  }
243
283
  if (count === 1) {
244
- this.lockCountByPath.delete(path);
284
+ lockCountByPluginId.delete(pluginId);
245
285
  } else {
246
- this.lockCountByPath.set(path, count - 1);
286
+ lockCountByPluginId.set(pluginId, count - 1);
247
287
  }
248
- this.reconcile(app);
249
- if (this.lockCountByPath.size === 0) {
250
- this.eventsComponent?.unload();
251
- this.eventsComponent = void 0;
288
+ if (lockCountByPluginId.size === 0) {
289
+ this.lockCountByPluginIdByPath.delete(path);
290
+ }
291
+ this.reconcileAndCleanup(app);
292
+ }
293
+ updateIndicatorTooltips(indicators, tooltip) {
294
+ (0, import_obsidian.setTooltip)(indicators.actionIconEl, tooltip);
295
+ if (indicators.tabIconEl) {
296
+ (0, import_obsidian.setTooltip)(indicators.tabIconEl, tooltip);
252
297
  }
253
298
  }
254
299
  updateStatusBar(app) {
255
300
  const activeView = app.workspace.getActiveViewOfType(import_obsidian.MarkdownView);
256
301
  const activePath = activeView?.file?.path;
257
- const isActiveLocked = activePath !== void 0 && (this.lockCountByPath.get(activePath) ?? 0) > 0;
302
+ const isActiveLocked = activePath !== void 0 && this.isPathLocked(activePath);
258
303
  if (!isActiveLocked || !activeView) {
259
304
  this.statusBarItemEl?.remove();
260
305
  this.statusBarItemEl = null;
261
306
  return;
262
307
  }
263
- if (this.statusBarItemEl) {
264
- return;
265
- }
266
- const statusBarEl = activeView.containerEl.ownerDocument.body.querySelector(STATUS_BAR_CSS_SELECTOR);
267
- if (!statusBarEl) {
268
- return;
308
+ if (!this.statusBarItemEl) {
309
+ const statusBarEl = activeView.containerEl.ownerDocument.body.querySelector(STATUS_BAR_CSS_SELECTOR);
310
+ if (!statusBarEl) {
311
+ return;
312
+ }
313
+ this.statusBarItemEl = statusBarEl.createDiv({ cls: [STATUS_BAR_ITEM_CSS_CLASS, LOCK_INDICATOR_CSS_CLASS] });
314
+ (0, import_obsidian.setIcon)(this.statusBarItemEl, LOCK_ICON_ID);
269
315
  }
270
- this.statusBarItemEl = statusBarEl.createDiv({ cls: [STATUS_BAR_ITEM_CSS_CLASS, LOCK_INDICATOR_CSS_CLASS] });
271
- (0, import_obsidian.setIcon)(this.statusBarItemEl, LOCK_ICON_ID);
272
- (0, import_obsidian.setTooltip)(this.statusBarItemEl, (0, import_i18n.t)(($) => $.obsidianDevUtils.editorLock.lockedNoteTooltip));
316
+ (0, import_obsidian.setTooltip)(this.statusBarItemEl, this.lockTooltip(app, activePath));
317
+ }
318
+ }
319
+ class EditorLockComponent extends import_component_ex.ComponentEx {
320
+ app;
321
+ pluginId;
322
+ /**
323
+ * Creates an editor-lock handle owned by the current plugin (identified via its plugin context).
324
+ *
325
+ * @param app - The Obsidian app instance.
326
+ */
327
+ constructor(app) {
328
+ super();
329
+ this.app = app;
330
+ this.pluginId = (0, import_plugin_id.getPluginId)();
331
+ }
332
+ /**
333
+ * Checks whether the note at the given path is currently locked by any plugin.
334
+ *
335
+ * @param pathOrFile - The path or file of the note to check.
336
+ * @returns `true` if the note has at least one active lock, `false` otherwise.
337
+ */
338
+ isLockedForPath(pathOrFile) {
339
+ return getManager().isLocked(this.app, pathOrFile);
340
+ }
341
+ /**
342
+ * Locks the note at the given path on behalf of this plugin, making it read-only in every current
343
+ * and future {@link MarkdownView} until the lock is released. Reference-counted: balance each call
344
+ * with a dispose of the returned {@link Disposable} (ideally via `using`) or {@link unlockForPath}.
345
+ *
346
+ * @param pathOrFile - The path or file of the note to lock.
347
+ * @returns A {@link Disposable} that releases this lock when disposed. Disposing more than once is a no-op.
348
+ */
349
+ lockForPath(pathOrFile) {
350
+ return getManager().lock(this.app, pathOrFile, this.pluginId);
351
+ }
352
+ /**
353
+ * Releases every lock still held by this plugin when the component (and thus the plugin) unloads,
354
+ * so no note is left stuck read-only by an operation that never completed.
355
+ */
356
+ onunload() {
357
+ getManager().unlockAllForPlugin(this.app, this.pluginId);
358
+ super.onunload();
359
+ }
360
+ /**
361
+ * Releases one lock previously acquired for the note at the given path via {@link lockForPath}.
362
+ *
363
+ * @param pathOrFile - The path or file of the note to unlock.
364
+ */
365
+ unlockForPath(pathOrFile) {
366
+ getManager().unlock(this.app, pathOrFile, this.pluginId);
273
367
  }
274
368
  }
275
369
  function isEditorLockedForPath(app, pathOrFile) {
276
370
  return getManager().isLocked(app, pathOrFile);
277
371
  }
278
372
  function lockEditorForPath(app, pathOrFile) {
279
- return getManager().lock(app, pathOrFile);
373
+ return getManager().lock(app, pathOrFile, (0, import_plugin_id.getPluginId)());
280
374
  }
281
375
  function unlockEditorForPath(app, pathOrFile) {
282
- getManager().unlock(app, pathOrFile);
376
+ getManager().unlock(app, pathOrFile, (0, import_plugin_id.getPluginId)());
283
377
  }
284
378
  function getManager() {
285
379
  return (0, import_obsidian_dev_utils_state.getObsidianDevUtilsState)(EDITOR_LOCK_STATE_KEY, new EditorPathLockManager()).value;
286
380
  }
287
381
  // Annotate the CommonJS export names for ESM import in node:
288
382
  0 && (module.exports = {
383
+ EditorLockComponent,
289
384
  isEditorLockedForPath,
290
385
  lockEditorForPath,
291
386
  unlockEditorForPath
292
387
  });
293
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2VkaXRvci1sb2NrLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTm90ZS1zY29wZWQsIHJlZmVyZW5jZS1jb3VudGVkIGVkaXRvciBsb2NraW5nLlxuICpcbiAqIFdoZXJlIHtAbGluayBsb2NrRWRpdG9yfSAvIHtAbGluayB1bmxvY2tFZGl0b3J9IGZyb20gYC4vZWRpdG9yLnRzYCB0b2dnbGUgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiBhXG4gKiBzaW5nbGUge0BsaW5rIEVkaXRvcn0gaW5zdGFuY2UsIHRoZSBoZWxwZXJzIGhlcmUgbG9jayBhIG5vdGUgYnkgaXRzICoqcGF0aCoqOiB3aGlsZSBhIHBhdGggaXNcbiAqIGxvY2tlZCwgZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlIHtAbGluayBNYXJrZG93blZpZXd9IG9mIHRoYXQgbm90ZSAoaW4gYW55IHdpbmRvdywgaW5jbHVkaW5nXG4gKiBwb3BvdXRzKSBpcyBtYWRlIHJlYWQtb25seSBhbmQgc2hvd3MgYSBsb2NrIGluZGljYXRvciBpbiBpdHMgdGFiIGhlYWRlciwgaXRzIHZpZXcgYWN0aW9uIGJhciwgYW5kXG4gKiB0aGUgc3RhdHVzIGJhciAod2hpbGUgdGhlIG5vdGUgaXMgYWN0aXZlKS4gTG9ja3MgYXJlIHJlZmVyZW5jZS1jb3VudGVkLCBzbyBuZXN0ZWQgb3IgY29uY3VycmVudFxuICogb3BlcmF0aW9ucyBvbiB0aGUgc2FtZSBub3RlIGFyZSBzYWZlIFx1MjAxNCB0aGUgbm90ZSBpcyB1bmxvY2tlZCBvbmx5IHdoZW4gdGhlIGxhc3QgbG9jayBpcyByZWxlYXNlZC5cbiAqXG4gKiBUaGUgYWNxdWlyZXJzIHJldHVybiBhIHtAbGluayBEaXNwb3NhYmxlfSwgc28gdGhlIHByZWZlcnJlZCBjYWxsIHN0eWxlIGlzIGEgYHVzaW5nYCBkZWNsYXJhdGlvblxuICogdGhhdCByZWxlYXNlcyBhdXRvbWF0aWNhbGx5IGF0IHNjb3BlIGV4aXQgKGluY2x1ZGluZyBvbiB0aHJvdyk6XG4gKlxuICogYGBgdHNcbiAqIHVzaW5nIF9sb2NrID0gbG9ja0VkaXRvckZvclBhdGgoYXBwLCBwYXRoKTtcbiAqIC8vIC4uLiBsb25nLXJ1bm5pbmcgd29yayAocHJvY2VzcywgcHJvY2Vzc0Zyb250TWF0dGVyLCBtZXJnZS9zcGxpdCkgLi4uXG4gKiAvLyBhdXRvLXVubG9ja2VkIGF0IHNjb3BlIGV4aXRcbiAqIGBgYFxuICpcbiAqIFRoZSBleHBsaWNpdCB7QGxpbmsgdW5sb2NrRWRpdG9yRm9yUGF0aH0gcGFpciByZW1haW5zIGF2YWlsYWJsZSBmb3Igbm9uLWB1c2luZ2AgY2FsbCBzaXRlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgVmlld1R5cGUgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQge1xuICBNYXJrZG93blZpZXcsXG4gIHNldEljb24sXG4gIHNldFRvb2x0aXBcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICcuLi9kaXNwb3NhYmxlLnRzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuLi9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7XG4gIGxvY2tFZGl0b3IsXG4gIHVubG9ja0VkaXRvclxufSBmcm9tICcuL2VkaXRvci50cyc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuXG5jb25zdCBFRElUT1JfTE9DS19TVEFURV9LRVkgPSAnZWRpdG9yTG9jayc7XG5jb25zdCBMT0NLX0lDT05fSUQgPSAnbG9jayc7XG5jb25zdCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yJztcbmNvbnN0IFNUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MgPSAnc3RhdHVzLWJhci1pdGVtJztcbmNvbnN0IFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SID0gJy5zdGF0dXMtYmFyJztcblxuaW50ZXJmYWNlIExvY2tJbmRpY2F0b3JzIHtcbiAgcmVhZG9ubHkgYWN0aW9uSWNvbkVsOiBIVE1MRWxlbWVudDtcbiAgcmVhZG9ubHkgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbi8qKlxuICogU3Vic2NyaWJlcyB0byB0aGUgd29ya3NwYWNlIGV2ZW50cyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgbG9jayByZWNvbmNpbGUuIEltcGxlbWVudGVkIGFzIGFcbiAqIHtAbGluayBDb21wb25lbnRFeH0gc28gdGhlIHN1YnNjcmlwdGlvbnMgYXJlIHJlZ2lzdGVyZWQgb24gYGxvYWQoKWAgYW5kIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBvblxuICogYHVubG9hZCgpYCwgaW5zdGVhZCBvZiBiZWluZyB0cmFja2VkIGFuZCB0b3JuIGRvd24gYnkgaGFuZC5cbiAqL1xuY2xhc3MgRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHAsIHByaXZhdGUgcmVhZG9ubHkgb25DaGFuZ2U6ICgpID0+IHZvaWQpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdhY3RpdmUtbGVhZi1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBTYW1lLWxlYWYgbmF2aWdhdGlvbiB0byBhbm90aGVyIG5vdGUgZmlyZXMgbm8gbGVhZi9sYXlvdXQgY2hhbmdlOyB3aXRob3V0IHRoaXMgaXQgc3RheXMgcmVhZC1vbmx5LlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtb3BlbicsIHRoaXMub25DaGFuZ2UpKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYWNrcyByZWZlcmVuY2UtY291bnRlZCwgcGF0aC1zY29wZWQgZWRpdG9yIGxvY2tzIGFuZCBrZWVwcyBldmVyeSBvcGVuIHtAbGluayBNYXJrZG93blZpZXd9IGluXG4gKiBzeW5jIHdpdGggdGhlIGxvY2tlZC1wYXRoIHNldC4gQSBzaW5nbGUgaW5zdGFuY2UgbGl2ZXMgb24gdGhlIHNoYXJlZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBzdGF0ZS5cbiAqL1xuY2xhc3MgRWRpdG9yUGF0aExvY2tNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBldmVudHNDb21wb25lbnQ6IEVkaXRvckxvY2tFdmVudHNDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yc0J5VmlldyA9IG5ldyBNYXA8TWFya2Rvd25WaWV3LCBMb2NrSW5kaWNhdG9ycz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NrQ291bnRCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIHN0YXR1c0Jhckl0ZW1FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgaXNMb2NrZWQoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMubG9ja0NvdW50QnlQYXRoLmdldChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpID8/IDApID4gMDtcbiAgfVxuXG4gIHB1YmxpYyBsb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICB0aGlzLmxvY2tDb3VudEJ5UGF0aC5zZXQocGF0aCwgKHRoaXMubG9ja0NvdW50QnlQYXRoLmdldChwYXRoKSA/PyAwKSArIDEpO1xuICAgIHRoaXMuZW5zdXJlU3Vic2NyaWJlZChhcHApO1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG5cbiAgICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnVubG9ja1BhdGgoYXBwLCBwYXRoKTtcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgdGhpcy51bmxvY2tQYXRoKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW5kaWNhdG9ycyh2aWV3OiBNYXJrZG93blZpZXcpOiBMb2NrSW5kaWNhdG9ycyB7XG4gICAgY29uc3QgdG9vbHRpcCA9IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5lZGl0b3JMb2NrLmxvY2tlZE5vdGVUb29sdGlwKTtcbiAgICBjb25zdCBhY3Rpb25JY29uRWwgPSB2aWV3LmFkZEFjdGlvbihMT0NLX0lDT05fSUQsIHRvb2x0aXAsIG5vb3ApO1xuXG4gICAgbGV0IHRhYkljb25FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCB0YWJTdGF0dXNDb250YWluZXJFbCA9IHZpZXcubGVhZi50YWJIZWFkZXJTdGF0dXNDb250YWluZXJFbDtcbiAgICBpZiAodGFiU3RhdHVzQ29udGFpbmVyRWwpIHtcbiAgICAgIHRhYkljb25FbCA9IHRhYlN0YXR1c0NvbnRhaW5lckVsLmNyZWF0ZVNwYW4oeyBjbHM6IExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTUyB9KTtcbiAgICAgIHNldEljb24odGFiSWNvbkVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgc2V0VG9vbHRpcCh0YWJJY29uRWwsIHRvb2x0aXApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25JY29uRWwsXG4gICAgICB0YWJJY29uRWxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTdWJzY3JpYmVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXZlbnRzQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gbmV3IEVkaXRvckxvY2tFdmVudHNDb21wb25lbnQoYXBwLCAoKSA9PiB7XG4gICAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgIH0pO1xuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50LmxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3NUb0xvY2sgPSBuZXcgU2V0PE1hcmtkb3duVmlldz4oKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHRoaXMubG9ja0NvdW50QnlQYXRoLmdldChwYXRoKSA/PyAwKSA+IDApIHtcbiAgICAgICAgdmlld3NUb0xvY2suYWRkKHZpZXcpO1xuICAgICAgICBpZiAoIXRoaXMuaW5kaWNhdG9yc0J5Vmlldy5oYXModmlldykpIHtcbiAgICAgICAgICBsb2NrRWRpdG9yKHZpZXcuZWRpdG9yKTtcbiAgICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuc2V0KHZpZXcsIHRoaXMuY3JlYXRlSW5kaWNhdG9ycyh2aWV3KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFt2aWV3LCBpbmRpY2F0b3JzXSBvZiB0aGlzLmluZGljYXRvcnNCeVZpZXcpIHtcbiAgICAgIGlmICghdmlld3NUb0xvY2suaGFzKHZpZXcpKSB7XG4gICAgICAgIHVubG9ja0VkaXRvcih2aWV3LmVkaXRvcik7XG4gICAgICAgIGluZGljYXRvcnMuYWN0aW9uSWNvbkVsLnJlbW92ZSgpO1xuICAgICAgICBpbmRpY2F0b3JzLnRhYkljb25FbD8ucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5kZWxldGUodmlldyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTdGF0dXNCYXIoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5sb2NrUGF0aChhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLmxvY2tDb3VudEJ5UGF0aC5nZXQocGF0aCkgPz8gMDtcbiAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgdGhpcy5sb2NrQ291bnRCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvY2tDb3VudEJ5UGF0aC5zZXQocGF0aCwgY291bnQgLSAxKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuXG4gICAgaWYgKHRoaXMubG9ja0NvdW50QnlQYXRoLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhdHVzQmFyKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlVmlldyA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICAgIGNvbnN0IGFjdGl2ZVBhdGggPSBhY3RpdmVWaWV3Py5maWxlPy5wYXRoO1xuICAgIGNvbnN0IGlzQWN0aXZlTG9ja2VkID0gYWN0aXZlUGF0aCAhPT0gdW5kZWZpbmVkICYmICh0aGlzLmxvY2tDb3VudEJ5UGF0aC5nZXQoYWN0aXZlUGF0aCkgPz8gMCkgPiAwO1xuXG4gICAgaWYgKCFpc0FjdGl2ZUxvY2tlZCB8fCAhYWN0aXZlVmlldykge1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWw/LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXR1c0Jhckl0ZW1FbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1c0JhckVsID0gYWN0aXZlVmlldy5jb250YWluZXJFbC5vd25lckRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oU1RBVFVTX0JBUl9DU1NfU0VMRUNUT1IpO1xuICAgIGlmICghc3RhdHVzQmFyRWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbCA9IHN0YXR1c0JhckVsLmNyZWF0ZURpdih7IGNsczogW1NUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MsIExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTU10gfSk7XG4gICAgc2V0SWNvbih0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgTE9DS19JQ09OX0lEKTtcbiAgICBzZXRUb29sdGlwKHRoaXMuc3RhdHVzQmFySXRlbUVsLCB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMuZWRpdG9yTG9jay5sb2NrZWROb3RlVG9vbHRpcCkpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWRpdG9yTG9ja2VkRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGgsIG1ha2luZyBpdCByZWFkLW9ubHkgaW4gZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlXG4gKiB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZCwgYW5kIHNob3dpbmcgYSBsb2NrIGluZGljYXRvciBpbiB0aGUgdGFiIGhlYWRlcixcbiAqIHZpZXcgYWN0aW9uIGJhciwgYW5kICh3aGlsZSBhY3RpdmUpIHRoZSBzdGF0dXMgYmFyLlxuICpcbiAqIFRoZSBsb2NrIGlzIHJlZmVyZW5jZS1jb3VudGVkOiBlYWNoIGNhbGwgbXVzdCBiZSBiYWxhbmNlZCBieSBleGFjdGx5IG9uZSByZWxlYXNlIChlaXRoZXIgZGlzcG9zaW5nXG4gKiB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IFx1MjAxNCBpZGVhbGx5IHZpYSBhIGB1c2luZ2AgZGVjbGFyYXRpb24gXHUyMDE0IG9yIGEgbWF0Y2hpbmdcbiAqIHtAbGluayB1bmxvY2tFZGl0b3JGb3JQYXRofSBjYWxsKS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCByZWxlYXNlcyB0aGlzIGxvY2sgd2hlbiBkaXNwb3NlZC4gRGlzcG9zaW5nIG1vcmUgdGhhbiBvbmNlIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NrRWRpdG9yRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IERpc3Bvc2FibGUge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmxvY2soYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tFZGl0b3JGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tFZGl0b3JGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS51bmxvY2soYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBFZGl0b3JQYXRoTG9ja01hbmFnZXIge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPEVkaXRvclBhdGhMb2NrTWFuYWdlcj4oRURJVE9SX0xPQ0tfU1RBVEVfS0VZLCBuZXcgRWRpdG9yUGF0aExvY2tNYW5hZ2VyKCkpLnZhbHVlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBCQSw2QkFBeUI7QUFDekIsc0JBSU87QUFJUCx3QkFHTztBQUNQLHNCQUFxQjtBQUNyQixzQ0FBeUM7QUFDekMsMEJBQTRCO0FBQzVCLG9CQUdPO0FBQ1AseUJBQXdCO0FBQ3hCLGtCQUFrQjtBQUVsQixNQUFNLHdCQUF3QjtBQUM5QixNQUFNLGVBQWU7QUFDckIsTUFBTSwyQkFBMkI7QUFDakMsTUFBTSw0QkFBNEI7QUFDbEMsTUFBTSwwQkFBMEI7QUFZaEMsTUFBTSxrQ0FBa0MsZ0NBQVk7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
388
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2VkaXRvci1sb2NrLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTm90ZS1zY29wZWQsIHJlZmVyZW5jZS1jb3VudGVkIGVkaXRvciBsb2NraW5nLlxuICpcbiAqIFdoZXJlIHtAbGluayBsb2NrRWRpdG9yfSAvIHtAbGluayB1bmxvY2tFZGl0b3J9IGZyb20gYC4vZWRpdG9yLnRzYCB0b2dnbGUgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiBhXG4gKiBzaW5nbGUge0BsaW5rIEVkaXRvcn0gaW5zdGFuY2UsIHRoZSBoZWxwZXJzIGhlcmUgbG9jayBhIG5vdGUgYnkgaXRzICoqcGF0aCoqOiB3aGlsZSBhIHBhdGggaXNcbiAqIGxvY2tlZCwgZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlIHtAbGluayBNYXJrZG93blZpZXd9IG9mIHRoYXQgbm90ZSAoaW4gYW55IHdpbmRvdywgaW5jbHVkaW5nXG4gKiBwb3BvdXRzKSBpcyBtYWRlIHJlYWQtb25seSBhbmQgc2hvd3MgYSBsb2NrIGluZGljYXRvciBpbiBpdHMgdGFiIGhlYWRlciwgaXRzIHZpZXcgYWN0aW9uIGJhciwgYW5kXG4gKiB0aGUgc3RhdHVzIGJhciAod2hpbGUgdGhlIG5vdGUgaXMgYWN0aXZlKS4gTG9ja3MgYXJlIHJlZmVyZW5jZS1jb3VudGVkIHBlciBsb2NraW5nIHBsdWdpbiwgc29cbiAqIG5lc3RlZCBvciBjb25jdXJyZW50IG9wZXJhdGlvbnMgb24gdGhlIHNhbWUgbm90ZSBhcmUgc2FmZSBcdTIwMTQgdGhlIG5vdGUgaXMgdW5sb2NrZWQgb25seSB3aGVuIHRoZVxuICogbGFzdCBsb2NrIGlzIHJlbGVhc2VkIFx1MjAxNCBhbmQgdGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgd2hpY2ggcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb25cbiAqIHRoYXQgcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tFZGl0b3JGb3JQYXRoKGFwcCwgcGF0aCk7XG4gKiAvLyAuLi4gbG9uZy1ydW5uaW5nIHdvcmsgKHByb2Nlc3MsIHByb2Nlc3NGcm9udE1hdHRlciwgbWVyZ2Uvc3BsaXQpIC4uLlxuICogLy8gYXV0by11bmxvY2tlZCBhdCBzY29wZSBleGl0XG4gKiBgYGBcbiAqXG4gKiBUaGUgZXhwbGljaXQge0BsaW5rIHVubG9ja0VkaXRvckZvclBhdGh9IHBhaXIgcmVtYWlucyBhdmFpbGFibGUgZm9yIG5vbi1gdXNpbmdgIGNhbGwgc2l0ZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFZpZXdUeXBlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgTWFya2Rvd25WaWV3LFxuICBzZXRJY29uLFxuICBzZXRUb29sdGlwXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5cbmltcG9ydCB7XG4gIENhbGxiYWNrRGlzcG9zYWJsZSxcbiAgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3Jcbn0gZnJvbSAnLi4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7XG4gIGxvY2tFZGl0b3IsXG4gIHVubG9ja0VkaXRvclxufSBmcm9tICcuL2VkaXRvci50cyc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgZ2V0UGx1Z2luSWQgfSBmcm9tICcuL3BsdWdpbi9wbHVnaW4taWQudHMnO1xuXG5jb25zdCBFRElUT1JfTE9DS19TVEFURV9LRVkgPSAnZWRpdG9yTG9jayc7XG5jb25zdCBMT0NLX0lDT05fSUQgPSAnbG9jayc7XG5jb25zdCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yJztcbmNvbnN0IFNUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MgPSAnc3RhdHVzLWJhci1pdGVtJztcbmNvbnN0IFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SID0gJy5zdGF0dXMtYmFyJztcblxuaW50ZXJmYWNlIExvY2tJbmRpY2F0b3JzIHtcbiAgcmVhZG9ubHkgYWN0aW9uSWNvbkVsOiBIVE1MRWxlbWVudDtcbiAgcmVhZG9ubHkgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbi8qKlxuICogU3Vic2NyaWJlcyB0byB0aGUgd29ya3NwYWNlIGV2ZW50cyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgbG9jayByZWNvbmNpbGUuIEltcGxlbWVudGVkIGFzIGFcbiAqIHtAbGluayBDb21wb25lbnRFeH0gc28gdGhlIHN1YnNjcmlwdGlvbnMgYXJlIHJlZ2lzdGVyZWQgb24gYGxvYWQoKWAgYW5kIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBvblxuICogYHVubG9hZCgpYCwgaW5zdGVhZCBvZiBiZWluZyB0cmFja2VkIGFuZCB0b3JuIGRvd24gYnkgaGFuZC5cbiAqL1xuY2xhc3MgRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHAsIHByaXZhdGUgcmVhZG9ubHkgb25DaGFuZ2U6ICgpID0+IHZvaWQpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdhY3RpdmUtbGVhZi1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBTYW1lLWxlYWYgbmF2aWdhdGlvbiB0byBhbm90aGVyIG5vdGUgZmlyZXMgbm8gbGVhZi9sYXlvdXQgY2hhbmdlOyB3aXRob3V0IHRoaXMgaXQgc3RheXMgcmVhZC1vbmx5LlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtb3BlbicsIHRoaXMub25DaGFuZ2UpKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYWNrcyByZWZlcmVuY2UtY291bnRlZCwgcGF0aC1zY29wZWQgZWRpdG9yIGxvY2tzIGFuZCBrZWVwcyBldmVyeSBvcGVuIHtAbGluayBNYXJrZG93blZpZXd9IGluXG4gKiBzeW5jIHdpdGggdGhlIGxvY2tlZC1wYXRoIHNldC4gQSBzaW5nbGUgaW5zdGFuY2UgbGl2ZXMgb24gdGhlIHNoYXJlZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBzdGF0ZS5cbiAqIEZvciBlYWNoIGxvY2tlZCBwYXRoIHRoZSBsb2NrIGNvdW50IGlzIHRyYWNrZWQgcGVyIGxvY2tpbmcgcGx1Z2luLCBzbyB0aGUgaW5kaWNhdG9ycyBjYW4gcmVwb3J0XG4gKiB3aGljaCBwbHVnaW5zIGN1cnJlbnRseSBob2xkIGEgbG9jay5cbiAqL1xuY2xhc3MgRWRpdG9yUGF0aExvY2tNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBldmVudHNDb21wb25lbnQ6IEVkaXRvckxvY2tFdmVudHNDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yc0J5VmlldyA9IG5ldyBNYXA8TWFya2Rvd25WaWV3LCBMb2NrSW5kaWNhdG9ycz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlcj4+KCk7XG4gIHByaXZhdGUgc3RhdHVzQmFySXRlbUVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBpc0xvY2tlZChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUGF0aExvY2tlZChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICB9XG5cbiAgcHVibGljIGxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiBEaXNwb3NhYmxlIHtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGxldCBsb2NrQ291bnRCeVBsdWdpbklkID0gdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoIWxvY2tDb3VudEJ5UGx1Z2luSWQpIHtcbiAgICAgIGxvY2tDb3VudEJ5UGx1Z2luSWQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLnNldChwYXRoLCBsb2NrQ291bnRCeVBsdWdpbklkKTtcbiAgICB9XG4gICAgbG9ja0NvdW50QnlQbHVnaW5JZC5zZXQocGx1Z2luSWQsIChsb2NrQ291bnRCeVBsdWdpbklkLmdldChwbHVnaW5JZCkgPz8gMCkgKyAxKTtcbiAgICB0aGlzLmVuc3VyZVN1YnNjcmliZWQoYXBwKTtcbiAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuXG4gICAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy51bmxvY2tQYXRoKGFwcCwgcGF0aCwgcGx1Z2luSWQpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVubG9ja1BhdGgoYXBwLCBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSksIHBsdWdpbklkKTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2tBbGxGb3JQbHVnaW4oYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBsb2NrQ291bnRCeVBsdWdpbklkXSBvZiB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGgpIHtcbiAgICAgIGlmIChsb2NrQ291bnRCeVBsdWdpbklkLmRlbGV0ZShwbHVnaW5JZCkgJiYgbG9ja0NvdW50QnlQbHVnaW5JZC5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5kZWxldGUocGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbmRpY2F0b3JzKHZpZXc6IE1hcmtkb3duVmlldywgdG9vbHRpcDogc3RyaW5nKTogTG9ja0luZGljYXRvcnMge1xuICAgIGNvbnN0IGFjdGlvbkljb25FbCA9IHZpZXcuYWRkQWN0aW9uKExPQ0tfSUNPTl9JRCwgdG9vbHRpcCwgbm9vcCk7XG5cbiAgICBsZXQgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHRhYlN0YXR1c0NvbnRhaW5lckVsID0gdmlldy5sZWFmLnRhYkhlYWRlclN0YXR1c0NvbnRhaW5lckVsO1xuICAgIGlmICh0YWJTdGF0dXNDb250YWluZXJFbCkge1xuICAgICAgdGFiSWNvbkVsID0gdGFiU3RhdHVzQ29udGFpbmVyRWwuY3JlYXRlU3Bhbih7IGNsczogTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTIH0pO1xuICAgICAgc2V0SWNvbih0YWJJY29uRWwsIExPQ0tfSUNPTl9JRCk7XG4gICAgICBzZXRUb29sdGlwKHRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbkljb25FbCxcbiAgICAgIHRhYkljb25FbFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVN1YnNjcmliZWQoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudHNDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBuZXcgRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudChhcHAsICgpID0+IHtcbiAgICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgfSk7XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhdGhMb2NrZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZ2V0KHBhdGgpPy5zaXplID8/IDApID4gMDtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja1Rvb2x0aXAoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9ja0NvdW50QnlQbHVnaW5JZCA9IHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5nZXQocGF0aCk7XG4gICAgLy8gYGxvY2tUb29sdGlwYCBpcyBvbmx5IGV2ZXIgY2FsbGVkIGZvciBhIGxvY2tlZCBwYXRoLCBzbyB0aGUgcGVyLXBsdWdpbiBtYXAgaXMgYWx3YXlzIHByZXNlbnQuXG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUobG9ja0NvdW50QnlQbHVnaW5JZCk7XG4gICAgY29uc3QgaGVhZGVyID0gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLmVkaXRvckxvY2subG9ja2VkQnlUb29sdGlwKTtcbiAgICBjb25zdCBwbHVnaW5OYW1lcyA9IEFycmF5LmZyb20obG9ja0NvdW50QnlQbHVnaW5JZC5rZXlzKCkpLm1hcCgocGx1Z2luSWQpID0+IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF0/Lm5hbWUgPz8gcGx1Z2luSWQpO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiBwbHVnaW4gbmFtZXMsIG9uZSBwZXIgbGluZSB1bmRlciB0aGUgaGVhZGVyLlxuICAgIHJldHVybiBbaGVhZGVyLCAuLi5wbHVnaW5OYW1lc10uam9pbignXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZShhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXdzVG9Mb2NrID0gbmV3IFNldDxNYXJrZG93blZpZXc+KCk7XG4gICAgZm9yIChjb25zdCBsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZpZXdUeXBlLk1hcmtkb3duKSkge1xuICAgICAgY29uc3QgdmlldyA9IGxlYWYudmlldztcbiAgICAgIGlmICghKHZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRoID0gdmlldy5maWxlPy5wYXRoO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNQYXRoTG9ja2VkKHBhdGgpKSB7XG4gICAgICAgIHZpZXdzVG9Mb2NrLmFkZCh2aWV3KTtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBwYXRoKTtcbiAgICAgICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgICAgIGlmIChpbmRpY2F0b3JzKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzLCB0b29sdGlwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2NrRWRpdG9yKHZpZXcuZWRpdG9yKTtcbiAgICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuc2V0KHZpZXcsIHRoaXMuY3JlYXRlSW5kaWNhdG9ycyh2aWV3LCB0b29sdGlwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFt2aWV3LCBpbmRpY2F0b3JzXSBvZiB0aGlzLmluZGljYXRvcnNCeVZpZXcpIHtcbiAgICAgIGlmICghdmlld3NUb0xvY2suaGFzKHZpZXcpKSB7XG4gICAgICAgIHVubG9ja0VkaXRvcih2aWV3LmVkaXRvcik7XG4gICAgICAgIGluZGljYXRvcnMuYWN0aW9uSWNvbkVsLnJlbW92ZSgpO1xuICAgICAgICBpbmRpY2F0b3JzLnRhYkljb25FbD8ucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5kZWxldGUodmlldyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTdGF0dXNCYXIoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlQW5kQ2xlYW51cChhcHA6IEFwcCk6IHZvaWQge1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgaWYgKHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVubG9ja1BhdGgoYXBwOiBBcHAsIHBhdGg6IHN0cmluZywgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGxvY2tDb3VudEJ5UGx1Z2luSWQgPSB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghbG9ja0NvdW50QnlQbHVnaW5JZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gbG9ja0NvdW50QnlQbHVnaW5JZC5nZXQocGx1Z2luSWQpID8/IDA7XG4gICAgaWYgKGNvdW50IDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgIGxvY2tDb3VudEJ5UGx1Z2luSWQuZGVsZXRlKHBsdWdpbklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9ja0NvdW50QnlQbHVnaW5JZC5zZXQocGx1Z2luSWQsIGNvdW50IC0gMSk7XG4gICAgfVxuXG4gICAgaWYgKGxvY2tDb3VudEJ5UGx1Z2luSWQuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9yczogTG9ja0luZGljYXRvcnMsIHRvb2x0aXA6IHN0cmluZyk6IHZvaWQge1xuICAgIHNldFRvb2x0aXAoaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwsIHRvb2x0aXApO1xuICAgIGlmIChpbmRpY2F0b3JzLnRhYkljb25FbCkge1xuICAgICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLnRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNCYXIoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgY29uc3QgYWN0aXZlUGF0aCA9IGFjdGl2ZVZpZXc/LmZpbGU/LnBhdGg7XG4gICAgY29uc3QgaXNBY3RpdmVMb2NrZWQgPSBhY3RpdmVQYXRoICE9PSB1bmRlZmluZWQgJiYgdGhpcy5pc1BhdGhMb2NrZWQoYWN0aXZlUGF0aCk7XG5cbiAgICBpZiAoIWlzQWN0aXZlTG9ja2VkIHx8ICFhY3RpdmVWaWV3KSB7XG4gICAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbD8ucmVtb3ZlKCk7XG4gICAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0YXR1c0Jhckl0ZW1FbCkge1xuICAgICAgY29uc3Qgc3RhdHVzQmFyRWwgPSBhY3RpdmVWaWV3LmNvbnRhaW5lckVsLm93bmVyRG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihTVEFUVVNfQkFSX0NTU19TRUxFQ1RPUik7XG4gICAgICBpZiAoIXN0YXR1c0JhckVsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsID0gc3RhdHVzQmFyRWwuY3JlYXRlRGl2KHsgY2xzOiBbU1RBVFVTX0JBUl9JVEVNX0NTU19DTEFTUywgTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTXSB9KTtcbiAgICAgIHNldEljb24odGhpcy5zdGF0dXNCYXJJdGVtRWwsIExPQ0tfSUNPTl9JRCk7XG4gICAgfVxuXG4gICAgc2V0VG9vbHRpcCh0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgdGhpcy5sb2NrVG9vbHRpcChhcHAsIGFjdGl2ZVBhdGgpKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcGVyLXBsdWdpbiBoYW5kbGUgZm9yIG5vdGUtc2NvcGVkIGVkaXRvciBsb2NraW5nLiBBZGQgaXQgYXMgYSBjaGlsZCBvZiB5b3VyIHBsdWdpblxuICogKGB0aGlzLmFkZENoaWxkKG5ldyBFZGl0b3JMb2NrQ29tcG9uZW50KHRoaXMuYXBwKSlgKSBzbyB0aGF0IGFueSBsb2NrcyBpdCBzdGlsbCBob2xkcyBhcmUgcmVsZWFzZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMgXHUyMDE0IGEgbm90ZSBjYW4gbmV2ZXIgYmUgbGVmdCBzdHVjayByZWFkLW9ubHkgYmVjYXVzZSB0aGVcbiAqIHBsdWdpbiB0aGF0IGxvY2tlZCBpdCB3YXMgZGlzYWJsZWQgb3IgcmVsb2FkZWQgbWlkLW9wZXJhdGlvbi5cbiAqXG4gKiBMb2NrcyBhcmUgcmVmZXJlbmNlLWNvdW50ZWQgYW5kIGF0dHJpYnV0ZWQgdG8gdGhpcyBwbHVnaW4sIHNvIHRoZSBsb2NrIGluZGljYXRvcnMnIHRvb2x0aXAgbmFtZXNcbiAqIGl0IGFtb25nIHRoZSBwbHVnaW5zIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jay5cbiAqL1xuZXhwb3J0IGNsYXNzIEVkaXRvckxvY2tDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlZGl0b3ItbG9jayBoYW5kbGUgb3duZWQgYnkgdGhlIGN1cnJlbnQgcGx1Z2luIChpZGVudGlmaWVkIHZpYSBpdHMgcGx1Z2luIGNvbnRleHQpLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihhcHA6IEFwcCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgdGhpcy5wbHVnaW5JZCA9IGdldFBsdWdpbklkKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZCBieSBhbnkgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWQodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIG9uIGJlaGFsZiBvZiB0aGlzIHBsdWdpbiwgbWFraW5nIGl0IHJlYWQtb25seSBpbiBldmVyeSBjdXJyZW50XG4gICAqIGFuZCBmdXR1cmUge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQuIFJlZmVyZW5jZS1jb3VudGVkOiBiYWxhbmNlIGVhY2ggY2FsbFxuICAgKiB3aXRoIGEgZGlzcG9zZSBvZiB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IChpZGVhbGx5IHZpYSBgdXNpbmdgKSBvciB7QGxpbmsgdW5sb2NrRm9yUGF0aH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAgICovXG4gIHB1YmxpYyBsb2NrRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKHRoaXMuYXBwLCBwYXRoT3JGaWxlLCB0aGlzLnBsdWdpbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBldmVyeSBsb2NrIHN0aWxsIGhlbGQgYnkgdGhpcyBwbHVnaW4gd2hlbiB0aGUgY29tcG9uZW50IChhbmQgdGh1cyB0aGUgcGx1Z2luKSB1bmxvYWRzLFxuICAgKiBzbyBubyBub3RlIGlzIGxlZnQgc3R1Y2sgcmVhZC1vbmx5IGJ5IGFuIG9wZXJhdGlvbiB0aGF0IG5ldmVyIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkudW5sb2NrQWxsRm9yUGx1Z2luKHRoaXMuYXBwLCB0aGlzLnBsdWdpbklkKTtcbiAgICBzdXBlci5vbnVubG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIG9uZSBsb2NrIHByZXZpb3VzbHkgYWNxdWlyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIHZpYSB7QGxpbmsgbG9ja0ZvclBhdGh9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIHVubG9ja0ZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUsIHRoaXMucGx1Z2luSWQpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWRpdG9yTG9ja2VkRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGgsIG1ha2luZyBpdCByZWFkLW9ubHkgaW4gZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlXG4gKiB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZCwgYW5kIHNob3dpbmcgYSBsb2NrIGluZGljYXRvciBpbiB0aGUgdGFiIGhlYWRlcixcbiAqIHZpZXcgYWN0aW9uIGJhciwgYW5kICh3aGlsZSBhY3RpdmUpIHRoZSBzdGF0dXMgYmFyLiBUaGUgaW5kaWNhdG9ycycgdG9vbHRpcCBsaXN0cyB0aGUgcGx1Z2luc1xuICogdGhhdCBjdXJyZW50bHkgaG9sZCBhIGxvY2sgb24gdGhlIG5vdGUuXG4gKlxuICogVGhlIGxvY2sgaXMgcmVmZXJlbmNlLWNvdW50ZWQgcGVyIGNhbGxpbmcgcGx1Z2luOiBlYWNoIGNhbGwgbXVzdCBiZSBiYWxhbmNlZCBieSBleGFjdGx5IG9uZVxuICogcmVsZWFzZSAoZWl0aGVyIGRpc3Bvc2luZyB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IFx1MjAxNCBpZGVhbGx5IHZpYSBhIGB1c2luZ2AgZGVjbGFyYXRpb24gXHUyMDE0IG9yXG4gKiBhIG1hdGNoaW5nIHtAbGluayB1bmxvY2tFZGl0b3JGb3JQYXRofSBjYWxsKS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCByZWxlYXNlcyB0aGlzIGxvY2sgd2hlbiBkaXNwb3NlZC4gRGlzcG9zaW5nIG1vcmUgdGhhbiBvbmNlIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NrRWRpdG9yRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IERpc3Bvc2FibGUge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmxvY2soYXBwLCBwYXRoT3JGaWxlLCBnZXRQbHVnaW5JZCgpKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tFZGl0b3JGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tFZGl0b3JGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS51bmxvY2soYXBwLCBwYXRoT3JGaWxlLCBnZXRQbHVnaW5JZCgpKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBFZGl0b3JQYXRoTG9ja01hbmFnZXIge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPEVkaXRvclBhdGhMb2NrTWFuYWdlcj4oRURJVE9SX0xPQ0tfU1RBVEVfS0VZLCBuZXcgRWRpdG9yUGF0aExvY2tNYW5hZ2VyKCkpLnZhbHVlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMkJBLDZCQUF5QjtBQUN6QixzQkFJTztBQUlQLHdCQUdPO0FBQ1Asc0JBQXFCO0FBQ3JCLHNDQUF5QztBQUN6Qyx5QkFBa0M7QUFDbEMsMEJBQTRCO0FBQzVCLG9CQUdPO0FBQ1AseUJBQXdCO0FBQ3hCLGtCQUFrQjtBQUNsQix1QkFBNEI7QUFFNUIsTUFBTSx3QkFBd0I7QUFDOUIsTUFBTSxlQUFlO0FBQ3JCLE1BQU0sMkJBQTJCO0FBQ2pDLE1BQU0sNEJBQTRCO0FBQ2xDLE1BQU0sMEJBQTBCO0FBWWhDLE1BQU0sa0NBQWtDLGdDQUFZO0FBQUEsRUFDM0MsWUFBNkIsS0FBMkIsVUFBc0I7QUFDbkYsVUFBTTtBQUQ0QjtBQUEyQjtBQUFBLEVBRS9EO0FBQUEsRUFGb0M7QUFBQSxFQUEyQjtBQUFBLEVBSS9DLFNBQWU7QUFDN0IsVUFBTSxPQUFPO0FBQ2IsU0FBSyxjQUFjLEtBQUssSUFBSSxVQUFVLEdBQUcsc0JBQXNCLEtBQUssUUFBUSxDQUFDO0FBQzdFLFNBQUssY0FBYyxLQUFLLElBQUksVUFBVSxHQUFHLGlCQUFpQixLQUFLLFFBQVEsQ0FBQztBQUV4RSxTQUFLLGNBQWMsS0FBSyxJQUFJLFVBQVUsR0FBRyxhQUFhLEtBQUssUUFBUSxDQUFDO0FBQUEsRUFDdEU7QUFDRjtBQVFBLE1BQU0sc0JBQXNCO0FBQUEsRUFDbEI7QUFBQSxFQUNTLG1CQUFtQixvQkFBSSxJQUFrQztBQUFBLEVBQ3pELDRCQUE0QixvQkFBSSxJQUFpQztBQUFBLEVBQzFFLGtCQUFzQztBQUFBLEVBRXZDLFNBQVMsS0FBVSxZQUFpQztBQUN6RCxXQUFPLEtBQUssaUJBQWEsNEJBQVEsS0FBSyxVQUFVLENBQUM7QUFBQSxFQUNuRDtBQUFBLEVBRU8sS0FBSyxLQUFVLFlBQXdCLFVBQThCO0FBQzFFLFVBQU0sV0FBTyw0QkFBUSxLQUFLLFVBQVU7QUFDcEMsUUFBSSxzQkFBc0IsS0FBSywwQkFBMEIsSUFBSSxJQUFJO0FBQ2pFLFFBQUksQ0FBQyxxQkFBcUI7QUFDeEIsNEJBQXNCLG9CQUFJLElBQW9CO0FBQzlDLFdBQUssMEJBQTBCLElBQUksTUFBTSxtQkFBbUI7QUFBQSxJQUM5RDtBQUNBLHdCQUFvQixJQUFJLFdBQVcsb0JBQW9CLElBQUksUUFBUSxLQUFLLEtBQUssQ0FBQztBQUM5RSxTQUFLLGlCQUFpQixHQUFHO0FBQ3pCLFNBQUssVUFBVSxHQUFHO0FBRWxCLFdBQU8sSUFBSSxxQ0FBbUI7QUFBQSxNQUM1QixVQUFVLE1BQVk7QUFDcEIsYUFBSyxXQUFXLEtBQUssTUFBTSxRQUFRO0FBQUEsTUFDckM7QUFBQSxNQUNBLHlCQUF5QiwwQ0FBd0I7QUFBQSxJQUNuRCxDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRU8sT0FBTyxLQUFVLFlBQXdCLFVBQXdCO0FBQ3RFLFNBQUssV0FBVyxTQUFLLDRCQUFRLEtBQUssVUFBVSxHQUFHLFFBQVE7QUFBQSxFQUN6RDtBQUFBLEVBRU8sbUJBQW1CLEtBQVUsVUFBd0I7QUFDMUQsZUFBVyxDQUFDLE1BQU0sbUJBQW1CLEtBQUssS0FBSywyQkFBMkI7QUFDeEUsVUFBSSxvQkFBb0IsT0FBTyxRQUFRLEtBQUssb0JBQW9CLFNBQVMsR0FBRztBQUMxRSxhQUFLLDBCQUEwQixPQUFPLElBQUk7QUFBQSxNQUM1QztBQUFBLElBQ0Y7QUFDQSxTQUFLLG9CQUFvQixHQUFHO0FBQUEsRUFDOUI7QUFBQSxFQUVRLGlCQUFpQixNQUFvQixTQUFpQztBQUM1RSxVQUFNLGVBQWUsS0FBSyxVQUFVLGNBQWMsU0FBUyxvQkFBSTtBQUUvRCxRQUFJLFlBQWdDO0FBQ3BDLFVBQU0sdUJBQXVCLEtBQUssS0FBSztBQUN2QyxRQUFJLHNCQUFzQjtBQUN4QixrQkFBWSxxQkFBcUIsV0FBVyxFQUFFLEtBQUsseUJBQXlCLENBQUM7QUFDN0UsbUNBQVEsV0FBVyxZQUFZO0FBQy9CLHNDQUFXLFdBQVcsT0FBTztBQUFBLElBQy9CO0FBRUEsV0FBTztBQUFBLE1BQ0w7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLGlCQUFpQixLQUFnQjtBQUN2QyxRQUFJLEtBQUssaUJBQWlCO0FBQ3hCO0FBQUEsSUFDRjtBQUNBLFNBQUssa0JBQWtCLElBQUksMEJBQTBCLEtBQUssTUFBTTtBQUM5RCxXQUFLLFVBQVUsR0FBRztBQUFBLElBQ3BCLENBQUM7QUFDRCxTQUFLLGdCQUFnQixLQUFLO0FBQUEsRUFDNUI7QUFBQSxFQUVRLGFBQWEsTUFBdUI7QUFDMUMsWUFBUSxLQUFLLDBCQUEwQixJQUFJLElBQUksR0FBRyxRQUFRLEtBQUs7QUFBQSxFQUNqRTtBQUFBLEVBRVEsWUFBWSxLQUFVLE1BQXNCO0FBQ2xELFVBQU0sc0JBQXNCLEtBQUssMEJBQTBCLElBQUksSUFBSTtBQUVuRSw4Q0FBa0IsbUJBQW1CO0FBQ3JDLFVBQU0sYUFBUyxlQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixXQUFXLGVBQWU7QUFDckUsVUFBTSxjQUFjLE1BQU0sS0FBSyxvQkFBb0IsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLFVBQVUsUUFBUSxHQUFHLFFBQVEsUUFBUTtBQUU5SCxXQUFPLENBQUMsUUFBUSxHQUFHLFdBQVcsRUFBRSxLQUFLLElBQUk7QUFBQSxFQUMzQztBQUFBLEVBRVEsVUFBVSxLQUFnQjtBQUNoQyxVQUFNLGNBQWMsb0JBQUksSUFBa0I7QUFDMUMsZUFBVyxRQUFRLElBQUksVUFBVSxnQkFBZ0IsZ0NBQVMsUUFBUSxHQUFHO0FBQ25FLFlBQU0sT0FBTyxLQUFLO0FBQ2xCLFVBQUksRUFBRSxnQkFBZ0IsK0JBQWU7QUFDbkM7QUFBQSxNQUNGO0FBRUEsWUFBTSxPQUFPLEtBQUssTUFBTTtBQUN4QixVQUFJLFNBQVMsUUFBVztBQUN0QjtBQUFBLE1BQ0Y7QUFFQSxVQUFJLEtBQUssYUFBYSxJQUFJLEdBQUc7QUFDM0Isb0JBQVksSUFBSSxJQUFJO0FBQ3BCLGNBQU0sVUFBVSxLQUFLLFlBQVksS0FBSyxJQUFJO0FBQzFDLGNBQU0sYUFBYSxLQUFLLGlCQUFpQixJQUFJLElBQUk7QUFDakQsWUFBSSxZQUFZO0FBQ2QsZUFBSyx3QkFBd0IsWUFBWSxPQUFPO0FBQUEsUUFDbEQsT0FBTztBQUNMLHdDQUFXLEtBQUssTUFBTTtBQUN0QixlQUFLLGlCQUFpQixJQUFJLE1BQU0sS0FBSyxpQkFBaUIsTUFBTSxPQUFPLENBQUM7QUFBQSxRQUN0RTtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsZUFBVyxDQUFDLE1BQU0sVUFBVSxLQUFLLEtBQUssa0JBQWtCO0FBQ3RELFVBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxHQUFHO0FBQzFCLHdDQUFhLEtBQUssTUFBTTtBQUN4QixtQkFBVyxhQUFhLE9BQU87QUFDL0IsbUJBQVcsV0FBVyxPQUFPO0FBQzdCLGFBQUssaUJBQWlCLE9BQU8sSUFBSTtBQUFBLE1BQ25DO0FBQUEsSUFDRjtBQUVBLFNBQUssZ0JBQWdCLEdBQUc7QUFBQSxFQUMxQjtBQUFBLEVBRVEsb0JBQW9CLEtBQWdCO0FBQzFDLFNBQUssVUFBVSxHQUFHO0FBQ2xCLFFBQUksS0FBSywwQkFBMEIsU0FBUyxHQUFHO0FBQzdDLFdBQUssaUJBQWlCLE9BQU87QUFDN0IsV0FBSyxrQkFBa0I7QUFBQSxJQUN6QjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLFdBQVcsS0FBVSxNQUFjLFVBQXdCO0FBQ2pFLFVBQU0sc0JBQXNCLEtBQUssMEJBQTBCLElBQUksSUFBSTtBQUNuRSxRQUFJLENBQUMscUJBQXFCO0FBQ3hCO0FBQUEsSUFDRjtBQUVBLFVBQU0sUUFBUSxvQkFBb0IsSUFBSSxRQUFRLEtBQUs7QUFDbkQsUUFBSSxTQUFTLEdBQUc7QUFDZDtBQUFBLElBQ0Y7QUFFQSxRQUFJLFVBQVUsR0FBRztBQUNmLDBCQUFvQixPQUFPLFFBQVE7QUFBQSxJQUNyQyxPQUFPO0FBQ0wsMEJBQW9CLElBQUksVUFBVSxRQUFRLENBQUM7QUFBQSxJQUM3QztBQUVBLFFBQUksb0JBQW9CLFNBQVMsR0FBRztBQUNsQyxXQUFLLDBCQUEwQixPQUFPLElBQUk7QUFBQSxJQUM1QztBQUVBLFNBQUssb0JBQW9CLEdBQUc7QUFBQSxFQUM5QjtBQUFBLEVBRVEsd0JBQXdCLFlBQTRCLFNBQXVCO0FBQ2pGLG9DQUFXLFdBQVcsY0FBYyxPQUFPO0FBQzNDLFFBQUksV0FBVyxXQUFXO0FBQ3hCLHNDQUFXLFdBQVcsV0FBVyxPQUFPO0FBQUEsSUFDMUM7QUFBQSxFQUNGO0FBQUEsRUFFUSxnQkFBZ0IsS0FBZ0I7QUFDdEMsVUFBTSxhQUFhLElBQUksVUFBVSxvQkFBb0IsNEJBQVk7QUFDakUsVUFBTSxhQUFhLFlBQVksTUFBTTtBQUNyQyxVQUFNLGlCQUFpQixlQUFlLFVBQWEsS0FBSyxhQUFhLFVBQVU7QUFFL0UsUUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVk7QUFDbEMsV0FBSyxpQkFBaUIsT0FBTztBQUM3QixXQUFLLGtCQUFrQjtBQUN2QjtBQUFBLElBQ0Y7QUFFQSxRQUFJLENBQUMsS0FBSyxpQkFBaUI7QUFDekIsWUFBTSxjQUFjLFdBQVcsWUFBWSxjQUFjLEtBQUssY0FBMkIsdUJBQXVCO0FBQ2hILFVBQUksQ0FBQyxhQUFhO0FBQ2hCO0FBQUEsTUFDRjtBQUNBLFdBQUssa0JBQWtCLFlBQVksVUFBVSxFQUFFLEtBQUssQ0FBQywyQkFBMkIsd0JBQXdCLEVBQUUsQ0FBQztBQUMzRyxtQ0FBUSxLQUFLLGlCQUFpQixZQUFZO0FBQUEsSUFDNUM7QUFFQSxvQ0FBVyxLQUFLLGlCQUFpQixLQUFLLFlBQVksS0FBSyxVQUFVLENBQUM7QUFBQSxFQUNwRTtBQUNGO0FBV08sTUFBTSw0QkFBNEIsZ0NBQVk7QUFBQSxFQUNsQztBQUFBLEVBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLEtBQVU7QUFDM0IsVUFBTTtBQUNOLFNBQUssTUFBTTtBQUNYLFNBQUssZUFBVyw4QkFBWTtBQUFBLEVBQzlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRTyxnQkFBZ0IsWUFBaUM7QUFDdEQsV0FBTyxXQUFXLEVBQUUsU0FBUyxLQUFLLEtBQUssVUFBVTtBQUFBLEVBQ25EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVU8sWUFBWSxZQUFvQztBQUNyRCxXQUFPLFdBQVcsRUFBRSxLQUFLLEtBQUssS0FBSyxZQUFZLEtBQUssUUFBUTtBQUFBLEVBQzlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1nQixXQUFpQjtBQUMvQixlQUFXLEVBQUUsbUJBQW1CLEtBQUssS0FBSyxLQUFLLFFBQVE7QUFDdkQsVUFBTSxTQUFTO0FBQUEsRUFDakI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxjQUFjLFlBQThCO0FBQ2pELGVBQVcsRUFBRSxPQUFPLEtBQUssS0FBSyxZQUFZLEtBQUssUUFBUTtBQUFBLEVBQ3pEO0FBQ0Y7QUFTTyxTQUFTLHNCQUFzQixLQUFVLFlBQWlDO0FBQy9FLFNBQU8sV0FBVyxFQUFFLFNBQVMsS0FBSyxVQUFVO0FBQzlDO0FBZ0JPLFNBQVMsa0JBQWtCLEtBQVUsWUFBb0M7QUFDOUUsU0FBTyxXQUFXLEVBQUUsS0FBSyxLQUFLLGdCQUFZLDhCQUFZLENBQUM7QUFDekQ7QUFXTyxTQUFTLG9CQUFvQixLQUFVLFlBQThCO0FBQzFFLGFBQVcsRUFBRSxPQUFPLEtBQUssZ0JBQVksOEJBQVksQ0FBQztBQUNwRDtBQUVBLFNBQVMsYUFBb0M7QUFDM0MsYUFBTywwREFBZ0QsdUJBQXVCLElBQUksc0JBQXNCLENBQUMsRUFBRTtBQUM3RzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -8,8 +8,9 @@
8
8
  * single {@link Editor} instance, the helpers here lock a note by its **path**: while a path is
9
9
  * locked, every current and future {@link MarkdownView} of that note (in any window, including
10
10
  * popouts) is made read-only and shows a lock indicator in its tab header, its view action bar, and
11
- * the status bar (while the note is active). Locks are reference-counted, so nested or concurrent
12
- * operations on the same note are safe — the note is unlocked only when the last lock is released.
11
+ * the status bar (while the note is active). Locks are reference-counted per locking plugin, so
12
+ * nested or concurrent operations on the same note are safe — the note is unlocked only when the
13
+ * last lock is released — and the indicators' tooltip lists which plugins currently hold a lock.
13
14
  *
14
15
  * The acquirers return a {@link Disposable}, so the preferred call style is a `using` declaration
15
16
  * that releases automatically at scope exit (including on throw):
@@ -24,6 +25,53 @@
24
25
  */
25
26
  import type { App } from 'obsidian' with { 'resolution-mode': 'import' };
26
27
  import type { PathOrFile } from './file-system.cjs';
28
+ import { ComponentEx } from './components/component-ex.cjs';
29
+ /**
30
+ * A per-plugin handle for note-scoped editor locking. Add it as a child of your plugin
31
+ * (`this.addChild(new EditorLockComponent(this.app))`) so that any locks it still holds are released
32
+ * automatically when the plugin unloads — a note can never be left stuck read-only because the
33
+ * plugin that locked it was disabled or reloaded mid-operation.
34
+ *
35
+ * Locks are reference-counted and attributed to this plugin, so the lock indicators' tooltip names
36
+ * it among the plugins currently holding a lock.
37
+ */
38
+ export declare class EditorLockComponent extends ComponentEx {
39
+ private readonly app;
40
+ private readonly pluginId;
41
+ /**
42
+ * Creates an editor-lock handle owned by the current plugin (identified via its plugin context).
43
+ *
44
+ * @param app - The Obsidian app instance.
45
+ */
46
+ constructor(app: App);
47
+ /**
48
+ * Checks whether the note at the given path is currently locked by any plugin.
49
+ *
50
+ * @param pathOrFile - The path or file of the note to check.
51
+ * @returns `true` if the note has at least one active lock, `false` otherwise.
52
+ */
53
+ isLockedForPath(pathOrFile: PathOrFile): boolean;
54
+ /**
55
+ * Locks the note at the given path on behalf of this plugin, making it read-only in every current
56
+ * and future {@link MarkdownView} until the lock is released. Reference-counted: balance each call
57
+ * with a dispose of the returned {@link Disposable} (ideally via `using`) or {@link unlockForPath}.
58
+ *
59
+ * @param pathOrFile - The path or file of the note to lock.
60
+ * @returns A {@link Disposable} that releases this lock when disposed. Disposing more than once is a no-op.
61
+ */
62
+ lockForPath(pathOrFile: PathOrFile): Disposable;
63
+ /**
64
+ * Releases every lock still held by this plugin when the component (and thus the plugin) unloads,
65
+ * so no note is left stuck read-only by an operation that never completed.
66
+ */
67
+ onunload(): void;
68
+ /**
69
+ * Releases one lock previously acquired for the note at the given path via {@link lockForPath}.
70
+ *
71
+ * @param pathOrFile - The path or file of the note to unlock.
72
+ */
73
+ unlockForPath(pathOrFile: PathOrFile): void;
74
+ }
27
75
  /**
28
76
  * Checks whether the note at the given path is currently locked.
29
77
  *
@@ -35,11 +83,12 @@ export declare function isEditorLockedForPath(app: App, pathOrFile: PathOrFile):
35
83
  /**
36
84
  * Locks the note at the given path, making it read-only in every current and future
37
85
  * {@link MarkdownView} until the lock is released, and showing a lock indicator in the tab header,
38
- * view action bar, and (while active) the status bar.
86
+ * view action bar, and (while active) the status bar. The indicators' tooltip lists the plugins
87
+ * that currently hold a lock on the note.
39
88
  *
40
- * The lock is reference-counted: each call must be balanced by exactly one release (either disposing
41
- * the returned {@link Disposable} — ideally via a `using` declaration — or a matching
42
- * {@link unlockEditorForPath} call).
89
+ * The lock is reference-counted per calling plugin: each call must be balanced by exactly one
90
+ * release (either disposing the returned {@link Disposable} — ideally via a `using` declaration — or
91
+ * a matching {@link unlockEditorForPath} call).
43
92
  *
44
93
  * @param app - The Obsidian app instance.
45
94
  * @param pathOrFile - The path or file of the note to lock.
@@ -150,6 +150,7 @@ const en = {
150
150
  pageHeader: "Page {{pageNumber, number}} of {{totalPages, number}}, Total items: {{totalItems, number}}"
151
151
  },
152
152
  editorLock: {
153
+ lockedByTooltip: "Locked by",
153
154
  lockedNoteTooltip: "This note is locked while an operation is in progress."
154
155
  },
155
156
  metadataCache: {
@@ -177,4 +178,4 @@ const en = {
177
178
  0 && (module.exports = {
178
179
  en
179
180
  });
180
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2kxOG4vbG9jYWxlcy9lbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFbmdsaXNoIHRyYW5zbGF0aW9ucyBmb3IgdGhlIGBpMThuYCBtb2R1bGUuXG4gKi9cblxuLyoqXG4gKiBUaGUgRW5nbGlzaCB0cmFuc2xhdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBlbiA9IHtcbiAgb2JzaWRpYW5EZXZVdGlsczoge1xuICAgIGFzeW5jV2l0aE5vdGljZToge1xuICAgICAgbWlsbGlzZWNvbmRzOiAnbWlsbGlzZWNvbmRzLi4uJyxcbiAgICAgIG9wZXJhdGlvbjogJ09wZXJhdGlvbicsXG4gICAgICBydW5uaW5nRm9yOiAnUnVubmluZyBmb3InLFxuICAgICAgdGVybWluYXRlT3BlcmF0aW9uOiAnWW91IGNhbiB0ZXJtaW5hdGUgdGhlIG9wZXJhdGlvbiBieSBjbGlja2luZyB0aGUgYnV0dG9uIGJlbG93LCBidXQgYmUgYXdhcmUgaXQgbWlnaHQgbGVhdmUgdGhlIHZhdWx0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4nLFxuICAgICAgdGltZWRPdXQ6ICdUaGUgb3BlcmF0aW9uIHRpbWVkIG91dCBhZnRlciB7e2R1cmF0aW9uLCBudW1iZXJ9fSBtaWxsaXNlY29uZHMuJ1xuICAgIH0sXG4gICAgYnV0dG9uczoge1xuICAgICAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgICAgIG9rOiAnT0snXG4gICAgfSxcbiAgICBjYWxsb3V0OiB7XG4gICAgICBsb2FkQ29udGVudDogJ0xvYWQgY29udGVudCBmb3IgY2FsbG91dCdcbiAgICB9LFxuICAgIGRhdGF2aWV3OiB7XG4gICAgICBpdGVtc1BlclBhZ2U6ICdJdGVtcyBwZXIgcGFnZTonLFxuICAgICAganVtcFRvUGFnZTogJ0p1bXAgdG8gcGFnZTonLFxuICAgICAgcGFnZUhlYWRlcjogJ1BhZ2Uge3twYWdlTnVtYmVyLCBudW1iZXJ9fSBvZiB7e3RvdGFsUGFnZXMsIG51bWJlcn19LCBUb3RhbCBpdGVtczoge3t0b3RhbEl0ZW1zLCBudW1iZXJ9fSdcbiAgICB9LFxuICAgIGVkaXRvckxvY2s6IHtcbiAgICAgIGxvY2tlZE5vdGVUb29sdGlwOiAnVGhpcyBub3RlIGlzIGxvY2tlZCB3aGlsZSBhbiBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuJ1xuICAgIH0sXG4gICAgbWV0YWRhdGFDYWNoZToge1xuICAgICAgZ2V0QmFja2xpbmtzRm9yRmlsZVBhdGg6ICdHZXQgYmFja2xpbmtzIGZvciB7e2ZpbGVQYXRofX0nXG4gICAgfSxcbiAgICBub3RpY2VzOiB7XG4gICAgICBhdHRhY2htZW50SXNTdGlsbFVzZWQ6ICdBdHRhY2htZW50IHt7YXR0YWNobWVudFBhdGh9fSBpcyBzdGlsbCB1c2VkIGJ5IG90aGVyIG5vdGVzLiBJdCB3aWxsIG5vdCBiZSBkZWxldGVkLicsXG4gICAgICB1bmhhbmRsZWRFcnJvcjogJ0FuIHVuaGFuZGxlZCBlcnJvciBvY2N1cnJlZC4gUGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9uLidcbiAgICB9LFxuICAgIHF1ZXVlOiB7XG4gICAgICBmbHVzaFF1ZXVlOiAnRmx1c2ggcXVldWUnXG4gICAgfSxcbiAgICByZW5hbWVEZWxldGVIYW5kbGVyOiB7XG4gICAgICBoYW5kbGVEZWxldGU6ICdIYW5kbGUgZGVsZXRlOiB7e2ZpbGVQYXRofX0nLFxuICAgICAgaGFuZGxlT3JwaGFuZWRSZW5hbWVzOiAnSGFuZGxlIG9ycGhhbmVkIHJlbmFtZXMnLFxuICAgICAgaGFuZGxlUmVuYW1lOiAnSGFuZGxlIHJlbmFtZToge3tvbGRQYXRofX0gLT4ge3tuZXdQYXRofX0nLFxuICAgICAgdXBkYXRlZExpbmtzOiAnVXBkYXRlZCB7e2xpbmtzQ291bnQsIG51bWJlcn19IGxpbmtzIGluIHt7ZmlsZXNDb3VudCwgbnVtYmVyfX0gZmlsZXMuJ1xuICAgIH0sXG4gICAgdmF1bHQ6IHtcbiAgICAgIHByb2Nlc3NGaWxlOiAnUHJvY2VzcyBmaWxlIHt7ZmlsZVBhdGh9fSdcbiAgICB9XG4gIH1cbn0gYXMgY29uc3Q7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTTyxNQUFNLEtBQUs7QUFBQSxFQUNoQixrQkFBa0I7QUFBQSxJQUNoQixpQkFBaUI7QUFBQSxNQUNmLGNBQWM7QUFBQSxNQUNkLFdBQVc7QUFBQSxNQUNYLFlBQVk7QUFBQSxNQUNaLG9CQUFvQjtBQUFBLE1BQ3BCLFVBQVU7QUFBQSxJQUNaO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxRQUFRO0FBQUEsTUFDUixJQUFJO0FBQUEsSUFDTjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLGNBQWM7QUFBQSxNQUNkLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxJQUNkO0FBQUEsSUFDQSxZQUFZO0FBQUEsTUFDVixtQkFBbUI7QUFBQSxJQUNyQjtBQUFBLElBQ0EsZUFBZTtBQUFBLE1BQ2IseUJBQXlCO0FBQUEsSUFDM0I7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLHVCQUF1QjtBQUFBLE1BQ3ZCLGdCQUFnQjtBQUFBLElBQ2xCO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTCxZQUFZO0FBQUEsSUFDZDtBQUFBLElBQ0EscUJBQXFCO0FBQUEsTUFDbkIsY0FBYztBQUFBLE1BQ2QsdUJBQXVCO0FBQUEsTUFDdkIsY0FBYztBQUFBLE1BQ2QsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTCxhQUFhO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
181
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2kxOG4vbG9jYWxlcy9lbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFbmdsaXNoIHRyYW5zbGF0aW9ucyBmb3IgdGhlIGBpMThuYCBtb2R1bGUuXG4gKi9cblxuLyoqXG4gKiBUaGUgRW5nbGlzaCB0cmFuc2xhdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBlbiA9IHtcbiAgb2JzaWRpYW5EZXZVdGlsczoge1xuICAgIGFzeW5jV2l0aE5vdGljZToge1xuICAgICAgbWlsbGlzZWNvbmRzOiAnbWlsbGlzZWNvbmRzLi4uJyxcbiAgICAgIG9wZXJhdGlvbjogJ09wZXJhdGlvbicsXG4gICAgICBydW5uaW5nRm9yOiAnUnVubmluZyBmb3InLFxuICAgICAgdGVybWluYXRlT3BlcmF0aW9uOiAnWW91IGNhbiB0ZXJtaW5hdGUgdGhlIG9wZXJhdGlvbiBieSBjbGlja2luZyB0aGUgYnV0dG9uIGJlbG93LCBidXQgYmUgYXdhcmUgaXQgbWlnaHQgbGVhdmUgdGhlIHZhdWx0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4nLFxuICAgICAgdGltZWRPdXQ6ICdUaGUgb3BlcmF0aW9uIHRpbWVkIG91dCBhZnRlciB7e2R1cmF0aW9uLCBudW1iZXJ9fSBtaWxsaXNlY29uZHMuJ1xuICAgIH0sXG4gICAgYnV0dG9uczoge1xuICAgICAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgICAgIG9rOiAnT0snXG4gICAgfSxcbiAgICBjYWxsb3V0OiB7XG4gICAgICBsb2FkQ29udGVudDogJ0xvYWQgY29udGVudCBmb3IgY2FsbG91dCdcbiAgICB9LFxuICAgIGRhdGF2aWV3OiB7XG4gICAgICBpdGVtc1BlclBhZ2U6ICdJdGVtcyBwZXIgcGFnZTonLFxuICAgICAganVtcFRvUGFnZTogJ0p1bXAgdG8gcGFnZTonLFxuICAgICAgcGFnZUhlYWRlcjogJ1BhZ2Uge3twYWdlTnVtYmVyLCBudW1iZXJ9fSBvZiB7e3RvdGFsUGFnZXMsIG51bWJlcn19LCBUb3RhbCBpdGVtczoge3t0b3RhbEl0ZW1zLCBudW1iZXJ9fSdcbiAgICB9LFxuICAgIGVkaXRvckxvY2s6IHtcbiAgICAgIGxvY2tlZEJ5VG9vbHRpcDogJ0xvY2tlZCBieScsXG4gICAgICBsb2NrZWROb3RlVG9vbHRpcDogJ1RoaXMgbm90ZSBpcyBsb2NrZWQgd2hpbGUgYW4gb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLidcbiAgICB9LFxuICAgIG1ldGFkYXRhQ2FjaGU6IHtcbiAgICAgIGdldEJhY2tsaW5rc0ZvckZpbGVQYXRoOiAnR2V0IGJhY2tsaW5rcyBmb3Ige3tmaWxlUGF0aH19J1xuICAgIH0sXG4gICAgbm90aWNlczoge1xuICAgICAgYXR0YWNobWVudElzU3RpbGxVc2VkOiAnQXR0YWNobWVudCB7e2F0dGFjaG1lbnRQYXRofX0gaXMgc3RpbGwgdXNlZCBieSBvdGhlciBub3Rlcy4gSXQgd2lsbCBub3QgYmUgZGVsZXRlZC4nLFxuICAgICAgdW5oYW5kbGVkRXJyb3I6ICdBbiB1bmhhbmRsZWQgZXJyb3Igb2NjdXJyZWQuIFBsZWFzZSBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nXG4gICAgfSxcbiAgICBxdWV1ZToge1xuICAgICAgZmx1c2hRdWV1ZTogJ0ZsdXNoIHF1ZXVlJ1xuICAgIH0sXG4gICAgcmVuYW1lRGVsZXRlSGFuZGxlcjoge1xuICAgICAgaGFuZGxlRGVsZXRlOiAnSGFuZGxlIGRlbGV0ZToge3tmaWxlUGF0aH19JyxcbiAgICAgIGhhbmRsZU9ycGhhbmVkUmVuYW1lczogJ0hhbmRsZSBvcnBoYW5lZCByZW5hbWVzJyxcbiAgICAgIGhhbmRsZVJlbmFtZTogJ0hhbmRsZSByZW5hbWU6IHt7b2xkUGF0aH19IC0+IHt7bmV3UGF0aH19JyxcbiAgICAgIHVwZGF0ZWRMaW5rczogJ1VwZGF0ZWQge3tsaW5rc0NvdW50LCBudW1iZXJ9fSBsaW5rcyBpbiB7e2ZpbGVzQ291bnQsIG51bWJlcn19IGZpbGVzLidcbiAgICB9LFxuICAgIHZhdWx0OiB7XG4gICAgICBwcm9jZXNzRmlsZTogJ1Byb2Nlc3MgZmlsZSB7e2ZpbGVQYXRofX0nXG4gICAgfVxuICB9XG59IGFzIGNvbnN0O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU08sTUFBTSxLQUFLO0FBQUEsRUFDaEIsa0JBQWtCO0FBQUEsSUFDaEIsaUJBQWlCO0FBQUEsTUFDZixjQUFjO0FBQUEsTUFDZCxXQUFXO0FBQUEsTUFDWCxZQUFZO0FBQUEsTUFDWixvQkFBb0I7QUFBQSxNQUNwQixVQUFVO0FBQUEsSUFDWjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsSUFBSTtBQUFBLElBQ047QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQSxVQUFVO0FBQUEsTUFDUixjQUFjO0FBQUEsTUFDZCxZQUFZO0FBQUEsTUFDWixZQUFZO0FBQUEsSUFDZDtBQUFBLElBQ0EsWUFBWTtBQUFBLE1BQ1YsaUJBQWlCO0FBQUEsTUFDakIsbUJBQW1CO0FBQUEsSUFDckI7QUFBQSxJQUNBLGVBQWU7QUFBQSxNQUNiLHlCQUF5QjtBQUFBLElBQzNCO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCx1QkFBdUI7QUFBQSxNQUN2QixnQkFBZ0I7QUFBQSxJQUNsQjtBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ0wsWUFBWTtBQUFBLElBQ2Q7QUFBQSxJQUNBLHFCQUFxQjtBQUFBLE1BQ25CLGNBQWM7QUFBQSxNQUNkLHVCQUF1QjtBQUFBLE1BQ3ZCLGNBQWM7QUFBQSxNQUNkLGNBQWM7QUFBQSxJQUNoQjtBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ0wsYUFBYTtBQUFBLElBQ2Y7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -29,6 +29,7 @@ export declare const en: {
29
29
  readonly pageHeader: "Page {{pageNumber, number}} of {{totalPages, number}}, Total items: {{totalItems, number}}";
30
30
  };
31
31
  readonly editorLock: {
32
+ readonly lockedByTooltip: "Locked by";
32
33
  readonly lockedNoteTooltip: "This note is locked while an operation is in progress.";
33
34
  };
34
35
  readonly metadataCache: {
@@ -32,6 +32,7 @@ declare const translationsMapImpl: {
32
32
  readonly pageHeader: "Page {{pageNumber, number}} of {{totalPages, number}}, Total items: {{totalItems, number}}";
33
33
  };
34
34
  readonly editorLock: {
35
+ readonly lockedByTooltip: "Locked by";
35
36
  readonly lockedNoteTooltip: "This note is locked while an operation is in progress.";
36
37
  };
37
38
  readonly metadataCache: {
@@ -21,7 +21,7 @@ if you want to view the source, please visit the github repository of this plugi
21
21
  globalThis.process = browserProcess;
22
22
  })();
23
23
 
24
- const LIBRARY_VERSION = "82.0.0-beta.3";
24
+ const LIBRARY_VERSION = "82.0.0-beta.5";
25
25
  const LIBRARY_NAME = "obsidian-dev-utils";
26
26
  const LIBRARY_STYLES = ".obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component pre, .obsidian-dev-utils.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-dev-utils.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-dev-utils.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-dev-utils.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-dev-utils.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-dev-utils.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-dev-utils-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-dev-utils-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n.obsidian-dev-utils input[type=url] {\n height: var(--input-height);\n}\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=tel],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=url],\n.obsidian-dev-utils input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-dev-utils input[type=month]:hover,\n .obsidian-dev-utils input[type=tel]:hover,\n .obsidian-dev-utils input[type=time]:hover,\n .obsidian-dev-utils input[type=url]:hover,\n .obsidian-dev-utils input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus, .obsidian-dev-utils input[type=month]:focus-visible,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=tel]:focus-visible,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=time]:focus-visible,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=url]:focus-visible,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus,\n.obsidian-dev-utils input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-dev-utils input[type=month]::placeholder,\n.obsidian-dev-utils input[type=tel]::placeholder,\n.obsidian-dev-utils input[type=time]::placeholder,\n.obsidian-dev-utils input[type=url]::placeholder,\n.obsidian-dev-utils input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-dev-utils input[type=month], .is-rtl .obsidian-dev-utils input[type=month], .rtl .obsidian-dev-utils input[type=month],\n.mod-rtl .obsidian-dev-utils input[type=time],\n.is-rtl .obsidian-dev-utils input[type=time],\n.rtl .obsidian-dev-utils input[type=time],\n.mod-rtl .obsidian-dev-utils input[type=week],\n.is-rtl .obsidian-dev-utils input[type=week],\n.rtl .obsidian-dev-utils input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\n.obsidian-dev-utilsprogress.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-dev-utils-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-dev-utils.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: var(--size-4-4);\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n animation: obsidian-dev-utils-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-dev-utils.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-dev-utils.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-dev-utils .multiple-dropdown-component select,\n.obsidian-dev-utils .multiple-dropdown-component select:focus,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-dev-utils .multiple-dropdown-component select option:checked,\n.obsidian-dev-utils .multiple-dropdown-component select:focus option:checked,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown option:checked {\n background-color: #1967d2;\n color: #fff;\n}\n\n.obsidian-dev-utils.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-dev-utils.prompt-modal .text-box {\n width: 100%;\n}\n\nbody button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid, .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid, .obsidian-dev-utils input.metadata-input-text:focus:invalid,\n.obsidian-dev-utils input[type=date]:active:invalid,\n.obsidian-dev-utils input[type=date]:focus-visible:invalid,\n.obsidian-dev-utils input[type=date]:focus:invalid,\n.obsidian-dev-utils input[type=datetime-local]:active:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid,\n.obsidian-dev-utils input[type=email]:active:invalid,\n.obsidian-dev-utils input[type=email]:focus-visible:invalid,\n.obsidian-dev-utils input[type=email]:focus:invalid,\n.obsidian-dev-utils input[type=number]:active:invalid,\n.obsidian-dev-utils input[type=number]:focus-visible:invalid,\n.obsidian-dev-utils input[type=number]:focus:invalid,\n.obsidian-dev-utils input[type=password]:active:invalid,\n.obsidian-dev-utils input[type=password]:focus-visible:invalid,\n.obsidian-dev-utils input[type=password]:focus:invalid,\n.obsidian-dev-utils input[type=search]:active:invalid,\n.obsidian-dev-utils input[type=search]:focus-visible:invalid,\n.obsidian-dev-utils input[type=search]:focus:invalid,\n.obsidian-dev-utils input[type=text]:active:invalid,\n.obsidian-dev-utils input[type=text]:focus-visible:invalid,\n.obsidian-dev-utils input[type=text]:focus:invalid,\n.obsidian-dev-utils textarea:active:invalid,\n.obsidian-dev-utils textarea:focus-visible:invalid,\n.obsidian-dev-utils textarea:focus:invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-dev-utils.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-dev-utils.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;ACTF;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;ACjDJ;EACE;;;ACFJ;EACE;IAEE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAON;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;ACrEJ;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACRJ;EACE;;;ACDF;EACE;;;ACON;EACE;;;ACTE;EACE;;;ACEJ;EAJA;;AAoBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EApBJ;;AA0BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-dev-utils%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-dev-utils%60.%5Cn.obsidian-dev-utils-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&progress.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-dev-utils-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20var(--size-4-4);%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20%231967d2;%5Cn%20%20%20%20%20%20%20%20color:%20%23fff;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20with%20a%5Cn//%20%60body%60-prefixed%20selector%20(specificity%200,1,2)%20so%20it%20wins%20over%20tldraw's%20(0,1,1)%20while%5Cn//%20Staying%20correct%20for%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cnbody%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cr%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cr%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cr%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cr%5Cn%20%20%20%20%7D%5Cr%5Cn%20%20%7D%5Cr%5Cn%7D%5Cr%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
27
27
  export {
@@ -8,8 +8,9 @@
8
8
  * single {@link Editor} instance, the helpers here lock a note by its **path**: while a path is
9
9
  * locked, every current and future {@link MarkdownView} of that note (in any window, including
10
10
  * popouts) is made read-only and shows a lock indicator in its tab header, its view action bar, and
11
- * the status bar (while the note is active). Locks are reference-counted, so nested or concurrent
12
- * operations on the same note are safe — the note is unlocked only when the last lock is released.
11
+ * the status bar (while the note is active). Locks are reference-counted per locking plugin, so
12
+ * nested or concurrent operations on the same note are safe — the note is unlocked only when the
13
+ * last lock is released — and the indicators' tooltip lists which plugins currently hold a lock.
13
14
  *
14
15
  * The acquirers return a {@link Disposable}, so the preferred call style is a `using` declaration
15
16
  * that releases automatically at scope exit (including on throw):
@@ -24,6 +25,53 @@
24
25
  */
25
26
  import type { App } from 'obsidian';
26
27
  import type { PathOrFile } from './file-system.mjs';
28
+ import { ComponentEx } from './components/component-ex.mjs';
29
+ /**
30
+ * A per-plugin handle for note-scoped editor locking. Add it as a child of your plugin
31
+ * (`this.addChild(new EditorLockComponent(this.app))`) so that any locks it still holds are released
32
+ * automatically when the plugin unloads — a note can never be left stuck read-only because the
33
+ * plugin that locked it was disabled or reloaded mid-operation.
34
+ *
35
+ * Locks are reference-counted and attributed to this plugin, so the lock indicators' tooltip names
36
+ * it among the plugins currently holding a lock.
37
+ */
38
+ export declare class EditorLockComponent extends ComponentEx {
39
+ private readonly app;
40
+ private readonly pluginId;
41
+ /**
42
+ * Creates an editor-lock handle owned by the current plugin (identified via its plugin context).
43
+ *
44
+ * @param app - The Obsidian app instance.
45
+ */
46
+ constructor(app: App);
47
+ /**
48
+ * Checks whether the note at the given path is currently locked by any plugin.
49
+ *
50
+ * @param pathOrFile - The path or file of the note to check.
51
+ * @returns `true` if the note has at least one active lock, `false` otherwise.
52
+ */
53
+ isLockedForPath(pathOrFile: PathOrFile): boolean;
54
+ /**
55
+ * Locks the note at the given path on behalf of this plugin, making it read-only in every current
56
+ * and future {@link MarkdownView} until the lock is released. Reference-counted: balance each call
57
+ * with a dispose of the returned {@link Disposable} (ideally via `using`) or {@link unlockForPath}.
58
+ *
59
+ * @param pathOrFile - The path or file of the note to lock.
60
+ * @returns A {@link Disposable} that releases this lock when disposed. Disposing more than once is a no-op.
61
+ */
62
+ lockForPath(pathOrFile: PathOrFile): Disposable;
63
+ /**
64
+ * Releases every lock still held by this plugin when the component (and thus the plugin) unloads,
65
+ * so no note is left stuck read-only by an operation that never completed.
66
+ */
67
+ onunload(): void;
68
+ /**
69
+ * Releases one lock previously acquired for the note at the given path via {@link lockForPath}.
70
+ *
71
+ * @param pathOrFile - The path or file of the note to unlock.
72
+ */
73
+ unlockForPath(pathOrFile: PathOrFile): void;
74
+ }
27
75
  /**
28
76
  * Checks whether the note at the given path is currently locked.
29
77
  *
@@ -35,11 +83,12 @@ export declare function isEditorLockedForPath(app: App, pathOrFile: PathOrFile):
35
83
  /**
36
84
  * Locks the note at the given path, making it read-only in every current and future
37
85
  * {@link MarkdownView} until the lock is released, and showing a lock indicator in the tab header,
38
- * view action bar, and (while active) the status bar.
86
+ * view action bar, and (while active) the status bar. The indicators' tooltip lists the plugins
87
+ * that currently hold a lock on the note.
39
88
  *
40
- * The lock is reference-counted: each call must be balanced by exactly one release (either disposing
41
- * the returned {@link Disposable} — ideally via a `using` declaration — or a matching
42
- * {@link unlockEditorForPath} call).
89
+ * The lock is reference-counted per calling plugin: each call must be balanced by exactly one
90
+ * release (either disposing the returned {@link Disposable} — ideally via a `using` declaration — or
91
+ * a matching {@link unlockEditorForPath} call).
43
92
  *
44
93
  * @param app - The Obsidian app instance.
45
94
  * @param pathOrFile - The path or file of the note to lock.
@@ -33,6 +33,7 @@ import {
33
33
  } from "../disposable.mjs";
34
34
  import { noop } from "../function.mjs";
35
35
  import { getObsidianDevUtilsState } from "../obsidian-dev-utils-state.mjs";
36
+ import { assertNonNullable } from "../type-guards.mjs";
36
37
  import { ComponentEx } from "./components/component-ex.mjs";
37
38
  import {
38
39
  lockEditor,
@@ -40,6 +41,7 @@ import {
40
41
  } from "./editor.mjs";
41
42
  import { getPath } from "./file-system.mjs";
42
43
  import { t } from "./i18n/i18n.mjs";
44
+ import { getPluginId } from "./plugin/plugin-id.mjs";
43
45
  const EDITOR_LOCK_STATE_KEY = "editorLock";
44
46
  const LOCK_ICON_ID = "lock";
45
47
  const LOCK_INDICATOR_CSS_CLASS = "obsidian-dev-utils-lock-indicator";
@@ -63,28 +65,40 @@ class EditorLockEventsComponent extends ComponentEx {
63
65
  class EditorPathLockManager {
64
66
  eventsComponent;
65
67
  indicatorsByView = /* @__PURE__ */ new Map();
66
- lockCountByPath = /* @__PURE__ */ new Map();
68
+ lockCountByPluginIdByPath = /* @__PURE__ */ new Map();
67
69
  statusBarItemEl = null;
68
70
  isLocked(app, pathOrFile) {
69
- return (this.lockCountByPath.get(getPath(app, pathOrFile)) ?? 0) > 0;
71
+ return this.isPathLocked(getPath(app, pathOrFile));
70
72
  }
71
- lock(app, pathOrFile) {
73
+ lock(app, pathOrFile, pluginId) {
72
74
  const path = getPath(app, pathOrFile);
73
- this.lockCountByPath.set(path, (this.lockCountByPath.get(path) ?? 0) + 1);
75
+ let lockCountByPluginId = this.lockCountByPluginIdByPath.get(path);
76
+ if (!lockCountByPluginId) {
77
+ lockCountByPluginId = /* @__PURE__ */ new Map();
78
+ this.lockCountByPluginIdByPath.set(path, lockCountByPluginId);
79
+ }
80
+ lockCountByPluginId.set(pluginId, (lockCountByPluginId.get(pluginId) ?? 0) + 1);
74
81
  this.ensureSubscribed(app);
75
82
  this.reconcile(app);
76
83
  return new CallbackDisposable({
77
84
  callback: () => {
78
- this.unlockPath(app, path);
85
+ this.unlockPath(app, path, pluginId);
79
86
  },
80
87
  multipleDisposeBehavior: MultipleDisposeBehavior.Ignore
81
88
  });
82
89
  }
83
- unlock(app, pathOrFile) {
84
- this.unlockPath(app, getPath(app, pathOrFile));
90
+ unlock(app, pathOrFile, pluginId) {
91
+ this.unlockPath(app, getPath(app, pathOrFile), pluginId);
92
+ }
93
+ unlockAllForPlugin(app, pluginId) {
94
+ for (const [path, lockCountByPluginId] of this.lockCountByPluginIdByPath) {
95
+ if (lockCountByPluginId.delete(pluginId) && lockCountByPluginId.size === 0) {
96
+ this.lockCountByPluginIdByPath.delete(path);
97
+ }
98
+ }
99
+ this.reconcileAndCleanup(app);
85
100
  }
86
- createIndicators(view) {
87
- const tooltip = t(($) => $.obsidianDevUtils.editorLock.lockedNoteTooltip);
101
+ createIndicators(view, tooltip) {
88
102
  const actionIconEl = view.addAction(LOCK_ICON_ID, tooltip, noop);
89
103
  let tabIconEl = null;
90
104
  const tabStatusContainerEl = view.leaf.tabHeaderStatusContainerEl;
@@ -107,6 +121,16 @@ class EditorPathLockManager {
107
121
  });
108
122
  this.eventsComponent.load();
109
123
  }
124
+ isPathLocked(path) {
125
+ return (this.lockCountByPluginIdByPath.get(path)?.size ?? 0) > 0;
126
+ }
127
+ lockTooltip(app, path) {
128
+ const lockCountByPluginId = this.lockCountByPluginIdByPath.get(path);
129
+ assertNonNullable(lockCountByPluginId);
130
+ const header = t(($) => $.obsidianDevUtils.editorLock.lockedByTooltip);
131
+ const pluginNames = Array.from(lockCountByPluginId.keys()).map((pluginId) => app.plugins.manifests[pluginId]?.name ?? pluginId);
132
+ return [header, ...pluginNames].join("\n");
133
+ }
110
134
  reconcile(app) {
111
135
  const viewsToLock = /* @__PURE__ */ new Set();
112
136
  for (const leaf of app.workspace.getLeavesOfType(ViewType.Markdown)) {
@@ -118,11 +142,15 @@ class EditorPathLockManager {
118
142
  if (path === void 0) {
119
143
  continue;
120
144
  }
121
- if ((this.lockCountByPath.get(path) ?? 0) > 0) {
145
+ if (this.isPathLocked(path)) {
122
146
  viewsToLock.add(view);
123
- if (!this.indicatorsByView.has(view)) {
147
+ const tooltip = this.lockTooltip(app, path);
148
+ const indicators = this.indicatorsByView.get(view);
149
+ if (indicators) {
150
+ this.updateIndicatorTooltips(indicators, tooltip);
151
+ } else {
124
152
  lockEditor(view.editor);
125
- this.indicatorsByView.set(view, this.createIndicators(view));
153
+ this.indicatorsByView.set(view, this.createIndicators(view, tooltip));
126
154
  }
127
155
  }
128
156
  }
@@ -136,58 +164,124 @@ class EditorPathLockManager {
136
164
  }
137
165
  this.updateStatusBar(app);
138
166
  }
139
- unlockPath(app, path) {
140
- const count = this.lockCountByPath.get(path) ?? 0;
167
+ reconcileAndCleanup(app) {
168
+ this.reconcile(app);
169
+ if (this.lockCountByPluginIdByPath.size === 0) {
170
+ this.eventsComponent?.unload();
171
+ this.eventsComponent = void 0;
172
+ }
173
+ }
174
+ unlockPath(app, path, pluginId) {
175
+ const lockCountByPluginId = this.lockCountByPluginIdByPath.get(path);
176
+ if (!lockCountByPluginId) {
177
+ return;
178
+ }
179
+ const count = lockCountByPluginId.get(pluginId) ?? 0;
141
180
  if (count <= 0) {
142
181
  return;
143
182
  }
144
183
  if (count === 1) {
145
- this.lockCountByPath.delete(path);
184
+ lockCountByPluginId.delete(pluginId);
146
185
  } else {
147
- this.lockCountByPath.set(path, count - 1);
186
+ lockCountByPluginId.set(pluginId, count - 1);
148
187
  }
149
- this.reconcile(app);
150
- if (this.lockCountByPath.size === 0) {
151
- this.eventsComponent?.unload();
152
- this.eventsComponent = void 0;
188
+ if (lockCountByPluginId.size === 0) {
189
+ this.lockCountByPluginIdByPath.delete(path);
190
+ }
191
+ this.reconcileAndCleanup(app);
192
+ }
193
+ updateIndicatorTooltips(indicators, tooltip) {
194
+ setTooltip(indicators.actionIconEl, tooltip);
195
+ if (indicators.tabIconEl) {
196
+ setTooltip(indicators.tabIconEl, tooltip);
153
197
  }
154
198
  }
155
199
  updateStatusBar(app) {
156
200
  const activeView = app.workspace.getActiveViewOfType(MarkdownView);
157
201
  const activePath = activeView?.file?.path;
158
- const isActiveLocked = activePath !== void 0 && (this.lockCountByPath.get(activePath) ?? 0) > 0;
202
+ const isActiveLocked = activePath !== void 0 && this.isPathLocked(activePath);
159
203
  if (!isActiveLocked || !activeView) {
160
204
  this.statusBarItemEl?.remove();
161
205
  this.statusBarItemEl = null;
162
206
  return;
163
207
  }
164
- if (this.statusBarItemEl) {
165
- return;
166
- }
167
- const statusBarEl = activeView.containerEl.ownerDocument.body.querySelector(STATUS_BAR_CSS_SELECTOR);
168
- if (!statusBarEl) {
169
- return;
208
+ if (!this.statusBarItemEl) {
209
+ const statusBarEl = activeView.containerEl.ownerDocument.body.querySelector(STATUS_BAR_CSS_SELECTOR);
210
+ if (!statusBarEl) {
211
+ return;
212
+ }
213
+ this.statusBarItemEl = statusBarEl.createDiv({ cls: [STATUS_BAR_ITEM_CSS_CLASS, LOCK_INDICATOR_CSS_CLASS] });
214
+ setIcon(this.statusBarItemEl, LOCK_ICON_ID);
170
215
  }
171
- this.statusBarItemEl = statusBarEl.createDiv({ cls: [STATUS_BAR_ITEM_CSS_CLASS, LOCK_INDICATOR_CSS_CLASS] });
172
- setIcon(this.statusBarItemEl, LOCK_ICON_ID);
173
- setTooltip(this.statusBarItemEl, t(($) => $.obsidianDevUtils.editorLock.lockedNoteTooltip));
216
+ setTooltip(this.statusBarItemEl, this.lockTooltip(app, activePath));
217
+ }
218
+ }
219
+ class EditorLockComponent extends ComponentEx {
220
+ app;
221
+ pluginId;
222
+ /**
223
+ * Creates an editor-lock handle owned by the current plugin (identified via its plugin context).
224
+ *
225
+ * @param app - The Obsidian app instance.
226
+ */
227
+ constructor(app) {
228
+ super();
229
+ this.app = app;
230
+ this.pluginId = getPluginId();
231
+ }
232
+ /**
233
+ * Checks whether the note at the given path is currently locked by any plugin.
234
+ *
235
+ * @param pathOrFile - The path or file of the note to check.
236
+ * @returns `true` if the note has at least one active lock, `false` otherwise.
237
+ */
238
+ isLockedForPath(pathOrFile) {
239
+ return getManager().isLocked(this.app, pathOrFile);
240
+ }
241
+ /**
242
+ * Locks the note at the given path on behalf of this plugin, making it read-only in every current
243
+ * and future {@link MarkdownView} until the lock is released. Reference-counted: balance each call
244
+ * with a dispose of the returned {@link Disposable} (ideally via `using`) or {@link unlockForPath}.
245
+ *
246
+ * @param pathOrFile - The path or file of the note to lock.
247
+ * @returns A {@link Disposable} that releases this lock when disposed. Disposing more than once is a no-op.
248
+ */
249
+ lockForPath(pathOrFile) {
250
+ return getManager().lock(this.app, pathOrFile, this.pluginId);
251
+ }
252
+ /**
253
+ * Releases every lock still held by this plugin when the component (and thus the plugin) unloads,
254
+ * so no note is left stuck read-only by an operation that never completed.
255
+ */
256
+ onunload() {
257
+ getManager().unlockAllForPlugin(this.app, this.pluginId);
258
+ super.onunload();
259
+ }
260
+ /**
261
+ * Releases one lock previously acquired for the note at the given path via {@link lockForPath}.
262
+ *
263
+ * @param pathOrFile - The path or file of the note to unlock.
264
+ */
265
+ unlockForPath(pathOrFile) {
266
+ getManager().unlock(this.app, pathOrFile, this.pluginId);
174
267
  }
175
268
  }
176
269
  function isEditorLockedForPath(app, pathOrFile) {
177
270
  return getManager().isLocked(app, pathOrFile);
178
271
  }
179
272
  function lockEditorForPath(app, pathOrFile) {
180
- return getManager().lock(app, pathOrFile);
273
+ return getManager().lock(app, pathOrFile, getPluginId());
181
274
  }
182
275
  function unlockEditorForPath(app, pathOrFile) {
183
- getManager().unlock(app, pathOrFile);
276
+ getManager().unlock(app, pathOrFile, getPluginId());
184
277
  }
185
278
  function getManager() {
186
279
  return getObsidianDevUtilsState(EDITOR_LOCK_STATE_KEY, new EditorPathLockManager()).value;
187
280
  }
188
281
  export {
282
+ EditorLockComponent,
189
283
  isEditorLockedForPath,
190
284
  lockEditorForPath,
191
285
  unlockEditorForPath
192
286
  };
193
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2VkaXRvci1sb2NrLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTm90ZS1zY29wZWQsIHJlZmVyZW5jZS1jb3VudGVkIGVkaXRvciBsb2NraW5nLlxuICpcbiAqIFdoZXJlIHtAbGluayBsb2NrRWRpdG9yfSAvIHtAbGluayB1bmxvY2tFZGl0b3J9IGZyb20gYC4vZWRpdG9yLnRzYCB0b2dnbGUgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiBhXG4gKiBzaW5nbGUge0BsaW5rIEVkaXRvcn0gaW5zdGFuY2UsIHRoZSBoZWxwZXJzIGhlcmUgbG9jayBhIG5vdGUgYnkgaXRzICoqcGF0aCoqOiB3aGlsZSBhIHBhdGggaXNcbiAqIGxvY2tlZCwgZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlIHtAbGluayBNYXJrZG93blZpZXd9IG9mIHRoYXQgbm90ZSAoaW4gYW55IHdpbmRvdywgaW5jbHVkaW5nXG4gKiBwb3BvdXRzKSBpcyBtYWRlIHJlYWQtb25seSBhbmQgc2hvd3MgYSBsb2NrIGluZGljYXRvciBpbiBpdHMgdGFiIGhlYWRlciwgaXRzIHZpZXcgYWN0aW9uIGJhciwgYW5kXG4gKiB0aGUgc3RhdHVzIGJhciAod2hpbGUgdGhlIG5vdGUgaXMgYWN0aXZlKS4gTG9ja3MgYXJlIHJlZmVyZW5jZS1jb3VudGVkLCBzbyBuZXN0ZWQgb3IgY29uY3VycmVudFxuICogb3BlcmF0aW9ucyBvbiB0aGUgc2FtZSBub3RlIGFyZSBzYWZlIFx1MjAxNCB0aGUgbm90ZSBpcyB1bmxvY2tlZCBvbmx5IHdoZW4gdGhlIGxhc3QgbG9jayBpcyByZWxlYXNlZC5cbiAqXG4gKiBUaGUgYWNxdWlyZXJzIHJldHVybiBhIHtAbGluayBEaXNwb3NhYmxlfSwgc28gdGhlIHByZWZlcnJlZCBjYWxsIHN0eWxlIGlzIGEgYHVzaW5nYCBkZWNsYXJhdGlvblxuICogdGhhdCByZWxlYXNlcyBhdXRvbWF0aWNhbGx5IGF0IHNjb3BlIGV4aXQgKGluY2x1ZGluZyBvbiB0aHJvdyk6XG4gKlxuICogYGBgdHNcbiAqIHVzaW5nIF9sb2NrID0gbG9ja0VkaXRvckZvclBhdGgoYXBwLCBwYXRoKTtcbiAqIC8vIC4uLiBsb25nLXJ1bm5pbmcgd29yayAocHJvY2VzcywgcHJvY2Vzc0Zyb250TWF0dGVyLCBtZXJnZS9zcGxpdCkgLi4uXG4gKiAvLyBhdXRvLXVubG9ja2VkIGF0IHNjb3BlIGV4aXRcbiAqIGBgYFxuICpcbiAqIFRoZSBleHBsaWNpdCB7QGxpbmsgdW5sb2NrRWRpdG9yRm9yUGF0aH0gcGFpciByZW1haW5zIGF2YWlsYWJsZSBmb3Igbm9uLWB1c2luZ2AgY2FsbCBzaXRlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgVmlld1R5cGUgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQge1xuICBNYXJrZG93blZpZXcsXG4gIHNldEljb24sXG4gIHNldFRvb2x0aXBcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICcuLi9kaXNwb3NhYmxlLnRzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuLi9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7XG4gIGxvY2tFZGl0b3IsXG4gIHVubG9ja0VkaXRvclxufSBmcm9tICcuL2VkaXRvci50cyc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuXG5jb25zdCBFRElUT1JfTE9DS19TVEFURV9LRVkgPSAnZWRpdG9yTG9jayc7XG5jb25zdCBMT0NLX0lDT05fSUQgPSAnbG9jayc7XG5jb25zdCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yJztcbmNvbnN0IFNUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MgPSAnc3RhdHVzLWJhci1pdGVtJztcbmNvbnN0IFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SID0gJy5zdGF0dXMtYmFyJztcblxuaW50ZXJmYWNlIExvY2tJbmRpY2F0b3JzIHtcbiAgcmVhZG9ubHkgYWN0aW9uSWNvbkVsOiBIVE1MRWxlbWVudDtcbiAgcmVhZG9ubHkgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbi8qKlxuICogU3Vic2NyaWJlcyB0byB0aGUgd29ya3NwYWNlIGV2ZW50cyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgbG9jayByZWNvbmNpbGUuIEltcGxlbWVudGVkIGFzIGFcbiAqIHtAbGluayBDb21wb25lbnRFeH0gc28gdGhlIHN1YnNjcmlwdGlvbnMgYXJlIHJlZ2lzdGVyZWQgb24gYGxvYWQoKWAgYW5kIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBvblxuICogYHVubG9hZCgpYCwgaW5zdGVhZCBvZiBiZWluZyB0cmFja2VkIGFuZCB0b3JuIGRvd24gYnkgaGFuZC5cbiAqL1xuY2xhc3MgRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHAsIHByaXZhdGUgcmVhZG9ubHkgb25DaGFuZ2U6ICgpID0+IHZvaWQpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdhY3RpdmUtbGVhZi1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBTYW1lLWxlYWYgbmF2aWdhdGlvbiB0byBhbm90aGVyIG5vdGUgZmlyZXMgbm8gbGVhZi9sYXlvdXQgY2hhbmdlOyB3aXRob3V0IHRoaXMgaXQgc3RheXMgcmVhZC1vbmx5LlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtb3BlbicsIHRoaXMub25DaGFuZ2UpKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYWNrcyByZWZlcmVuY2UtY291bnRlZCwgcGF0aC1zY29wZWQgZWRpdG9yIGxvY2tzIGFuZCBrZWVwcyBldmVyeSBvcGVuIHtAbGluayBNYXJrZG93blZpZXd9IGluXG4gKiBzeW5jIHdpdGggdGhlIGxvY2tlZC1wYXRoIHNldC4gQSBzaW5nbGUgaW5zdGFuY2UgbGl2ZXMgb24gdGhlIHNoYXJlZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBzdGF0ZS5cbiAqL1xuY2xhc3MgRWRpdG9yUGF0aExvY2tNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBldmVudHNDb21wb25lbnQ6IEVkaXRvckxvY2tFdmVudHNDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yc0J5VmlldyA9IG5ldyBNYXA8TWFya2Rvd25WaWV3LCBMb2NrSW5kaWNhdG9ycz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NrQ291bnRCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIHN0YXR1c0Jhckl0ZW1FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgaXNMb2NrZWQoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMubG9ja0NvdW50QnlQYXRoLmdldChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpID8/IDApID4gMDtcbiAgfVxuXG4gIHB1YmxpYyBsb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICB0aGlzLmxvY2tDb3VudEJ5UGF0aC5zZXQocGF0aCwgKHRoaXMubG9ja0NvdW50QnlQYXRoLmdldChwYXRoKSA/PyAwKSArIDEpO1xuICAgIHRoaXMuZW5zdXJlU3Vic2NyaWJlZChhcHApO1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG5cbiAgICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnVubG9ja1BhdGgoYXBwLCBwYXRoKTtcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgdGhpcy51bmxvY2tQYXRoKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW5kaWNhdG9ycyh2aWV3OiBNYXJrZG93blZpZXcpOiBMb2NrSW5kaWNhdG9ycyB7XG4gICAgY29uc3QgdG9vbHRpcCA9IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5lZGl0b3JMb2NrLmxvY2tlZE5vdGVUb29sdGlwKTtcbiAgICBjb25zdCBhY3Rpb25JY29uRWwgPSB2aWV3LmFkZEFjdGlvbihMT0NLX0lDT05fSUQsIHRvb2x0aXAsIG5vb3ApO1xuXG4gICAgbGV0IHRhYkljb25FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCB0YWJTdGF0dXNDb250YWluZXJFbCA9IHZpZXcubGVhZi50YWJIZWFkZXJTdGF0dXNDb250YWluZXJFbDtcbiAgICBpZiAodGFiU3RhdHVzQ29udGFpbmVyRWwpIHtcbiAgICAgIHRhYkljb25FbCA9IHRhYlN0YXR1c0NvbnRhaW5lckVsLmNyZWF0ZVNwYW4oeyBjbHM6IExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTUyB9KTtcbiAgICAgIHNldEljb24odGFiSWNvbkVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgc2V0VG9vbHRpcCh0YWJJY29uRWwsIHRvb2x0aXApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25JY29uRWwsXG4gICAgICB0YWJJY29uRWxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTdWJzY3JpYmVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXZlbnRzQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gbmV3IEVkaXRvckxvY2tFdmVudHNDb21wb25lbnQoYXBwLCAoKSA9PiB7XG4gICAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgIH0pO1xuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50LmxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3NUb0xvY2sgPSBuZXcgU2V0PE1hcmtkb3duVmlldz4oKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHRoaXMubG9ja0NvdW50QnlQYXRoLmdldChwYXRoKSA/PyAwKSA+IDApIHtcbiAgICAgICAgdmlld3NUb0xvY2suYWRkKHZpZXcpO1xuICAgICAgICBpZiAoIXRoaXMuaW5kaWNhdG9yc0J5Vmlldy5oYXModmlldykpIHtcbiAgICAgICAgICBsb2NrRWRpdG9yKHZpZXcuZWRpdG9yKTtcbiAgICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuc2V0KHZpZXcsIHRoaXMuY3JlYXRlSW5kaWNhdG9ycyh2aWV3KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFt2aWV3LCBpbmRpY2F0b3JzXSBvZiB0aGlzLmluZGljYXRvcnNCeVZpZXcpIHtcbiAgICAgIGlmICghdmlld3NUb0xvY2suaGFzKHZpZXcpKSB7XG4gICAgICAgIHVubG9ja0VkaXRvcih2aWV3LmVkaXRvcik7XG4gICAgICAgIGluZGljYXRvcnMuYWN0aW9uSWNvbkVsLnJlbW92ZSgpO1xuICAgICAgICBpbmRpY2F0b3JzLnRhYkljb25FbD8ucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5kZWxldGUodmlldyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTdGF0dXNCYXIoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5sb2NrUGF0aChhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLmxvY2tDb3VudEJ5UGF0aC5nZXQocGF0aCkgPz8gMDtcbiAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgdGhpcy5sb2NrQ291bnRCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvY2tDb3VudEJ5UGF0aC5zZXQocGF0aCwgY291bnQgLSAxKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuXG4gICAgaWYgKHRoaXMubG9ja0NvdW50QnlQYXRoLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhdHVzQmFyKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlVmlldyA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICAgIGNvbnN0IGFjdGl2ZVBhdGggPSBhY3RpdmVWaWV3Py5maWxlPy5wYXRoO1xuICAgIGNvbnN0IGlzQWN0aXZlTG9ja2VkID0gYWN0aXZlUGF0aCAhPT0gdW5kZWZpbmVkICYmICh0aGlzLmxvY2tDb3VudEJ5UGF0aC5nZXQoYWN0aXZlUGF0aCkgPz8gMCkgPiAwO1xuXG4gICAgaWYgKCFpc0FjdGl2ZUxvY2tlZCB8fCAhYWN0aXZlVmlldykge1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWw/LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXR1c0Jhckl0ZW1FbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1c0JhckVsID0gYWN0aXZlVmlldy5jb250YWluZXJFbC5vd25lckRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oU1RBVFVTX0JBUl9DU1NfU0VMRUNUT1IpO1xuICAgIGlmICghc3RhdHVzQmFyRWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbCA9IHN0YXR1c0JhckVsLmNyZWF0ZURpdih7IGNsczogW1NUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MsIExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTU10gfSk7XG4gICAgc2V0SWNvbih0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgTE9DS19JQ09OX0lEKTtcbiAgICBzZXRUb29sdGlwKHRoaXMuc3RhdHVzQmFySXRlbUVsLCB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMuZWRpdG9yTG9jay5sb2NrZWROb3RlVG9vbHRpcCkpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWRpdG9yTG9ja2VkRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGgsIG1ha2luZyBpdCByZWFkLW9ubHkgaW4gZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlXG4gKiB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZCwgYW5kIHNob3dpbmcgYSBsb2NrIGluZGljYXRvciBpbiB0aGUgdGFiIGhlYWRlcixcbiAqIHZpZXcgYWN0aW9uIGJhciwgYW5kICh3aGlsZSBhY3RpdmUpIHRoZSBzdGF0dXMgYmFyLlxuICpcbiAqIFRoZSBsb2NrIGlzIHJlZmVyZW5jZS1jb3VudGVkOiBlYWNoIGNhbGwgbXVzdCBiZSBiYWxhbmNlZCBieSBleGFjdGx5IG9uZSByZWxlYXNlIChlaXRoZXIgZGlzcG9zaW5nXG4gKiB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IFx1MjAxNCBpZGVhbGx5IHZpYSBhIGB1c2luZ2AgZGVjbGFyYXRpb24gXHUyMDE0IG9yIGEgbWF0Y2hpbmdcbiAqIHtAbGluayB1bmxvY2tFZGl0b3JGb3JQYXRofSBjYWxsKS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCByZWxlYXNlcyB0aGlzIGxvY2sgd2hlbiBkaXNwb3NlZC4gRGlzcG9zaW5nIG1vcmUgdGhhbiBvbmNlIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NrRWRpdG9yRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IERpc3Bvc2FibGUge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmxvY2soYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tFZGl0b3JGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tFZGl0b3JGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS51bmxvY2soYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBFZGl0b3JQYXRoTG9ja01hbmFnZXIge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPEVkaXRvclBhdGhMb2NrTWFuYWdlcj4oRURJVE9SX0xPQ0tfU1RBVEVfS0VZLCBuZXcgRWRpdG9yUGF0aExvY2tNYW5hZ2VyKCkpLnZhbHVlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQkEsU0FBUyxnQkFBZ0I7QUFDekI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBSVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsU0FBUyxnQ0FBZ0M7QUFDekMsU0FBUyxtQkFBbUI7QUFDNUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGVBQWU7QUFDeEIsU0FBUyxTQUFTO0FBRWxCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sZUFBZTtBQUNyQixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLDBCQUEwQjtBQVloQyxNQUFNLGtDQUFrQyxZQUFZO0FBQUEsRUFDM0MsWUFBNkIsS0FBMkIsVUFBc0I7QUFD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
287
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2VkaXRvci1sb2NrLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTm90ZS1zY29wZWQsIHJlZmVyZW5jZS1jb3VudGVkIGVkaXRvciBsb2NraW5nLlxuICpcbiAqIFdoZXJlIHtAbGluayBsb2NrRWRpdG9yfSAvIHtAbGluayB1bmxvY2tFZGl0b3J9IGZyb20gYC4vZWRpdG9yLnRzYCB0b2dnbGUgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiBhXG4gKiBzaW5nbGUge0BsaW5rIEVkaXRvcn0gaW5zdGFuY2UsIHRoZSBoZWxwZXJzIGhlcmUgbG9jayBhIG5vdGUgYnkgaXRzICoqcGF0aCoqOiB3aGlsZSBhIHBhdGggaXNcbiAqIGxvY2tlZCwgZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlIHtAbGluayBNYXJrZG93blZpZXd9IG9mIHRoYXQgbm90ZSAoaW4gYW55IHdpbmRvdywgaW5jbHVkaW5nXG4gKiBwb3BvdXRzKSBpcyBtYWRlIHJlYWQtb25seSBhbmQgc2hvd3MgYSBsb2NrIGluZGljYXRvciBpbiBpdHMgdGFiIGhlYWRlciwgaXRzIHZpZXcgYWN0aW9uIGJhciwgYW5kXG4gKiB0aGUgc3RhdHVzIGJhciAod2hpbGUgdGhlIG5vdGUgaXMgYWN0aXZlKS4gTG9ja3MgYXJlIHJlZmVyZW5jZS1jb3VudGVkIHBlciBsb2NraW5nIHBsdWdpbiwgc29cbiAqIG5lc3RlZCBvciBjb25jdXJyZW50IG9wZXJhdGlvbnMgb24gdGhlIHNhbWUgbm90ZSBhcmUgc2FmZSBcdTIwMTQgdGhlIG5vdGUgaXMgdW5sb2NrZWQgb25seSB3aGVuIHRoZVxuICogbGFzdCBsb2NrIGlzIHJlbGVhc2VkIFx1MjAxNCBhbmQgdGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgd2hpY2ggcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb25cbiAqIHRoYXQgcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tFZGl0b3JGb3JQYXRoKGFwcCwgcGF0aCk7XG4gKiAvLyAuLi4gbG9uZy1ydW5uaW5nIHdvcmsgKHByb2Nlc3MsIHByb2Nlc3NGcm9udE1hdHRlciwgbWVyZ2Uvc3BsaXQpIC4uLlxuICogLy8gYXV0by11bmxvY2tlZCBhdCBzY29wZSBleGl0XG4gKiBgYGBcbiAqXG4gKiBUaGUgZXhwbGljaXQge0BsaW5rIHVubG9ja0VkaXRvckZvclBhdGh9IHBhaXIgcmVtYWlucyBhdmFpbGFibGUgZm9yIG5vbi1gdXNpbmdgIGNhbGwgc2l0ZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFZpZXdUeXBlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgTWFya2Rvd25WaWV3LFxuICBzZXRJY29uLFxuICBzZXRUb29sdGlwXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5cbmltcG9ydCB7XG4gIENhbGxiYWNrRGlzcG9zYWJsZSxcbiAgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3Jcbn0gZnJvbSAnLi4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7XG4gIGxvY2tFZGl0b3IsXG4gIHVubG9ja0VkaXRvclxufSBmcm9tICcuL2VkaXRvci50cyc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgZ2V0UGx1Z2luSWQgfSBmcm9tICcuL3BsdWdpbi9wbHVnaW4taWQudHMnO1xuXG5jb25zdCBFRElUT1JfTE9DS19TVEFURV9LRVkgPSAnZWRpdG9yTG9jayc7XG5jb25zdCBMT0NLX0lDT05fSUQgPSAnbG9jayc7XG5jb25zdCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yJztcbmNvbnN0IFNUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MgPSAnc3RhdHVzLWJhci1pdGVtJztcbmNvbnN0IFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SID0gJy5zdGF0dXMtYmFyJztcblxuaW50ZXJmYWNlIExvY2tJbmRpY2F0b3JzIHtcbiAgcmVhZG9ubHkgYWN0aW9uSWNvbkVsOiBIVE1MRWxlbWVudDtcbiAgcmVhZG9ubHkgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbi8qKlxuICogU3Vic2NyaWJlcyB0byB0aGUgd29ya3NwYWNlIGV2ZW50cyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgbG9jayByZWNvbmNpbGUuIEltcGxlbWVudGVkIGFzIGFcbiAqIHtAbGluayBDb21wb25lbnRFeH0gc28gdGhlIHN1YnNjcmlwdGlvbnMgYXJlIHJlZ2lzdGVyZWQgb24gYGxvYWQoKWAgYW5kIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBvblxuICogYHVubG9hZCgpYCwgaW5zdGVhZCBvZiBiZWluZyB0cmFja2VkIGFuZCB0b3JuIGRvd24gYnkgaGFuZC5cbiAqL1xuY2xhc3MgRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHAsIHByaXZhdGUgcmVhZG9ubHkgb25DaGFuZ2U6ICgpID0+IHZvaWQpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdhY3RpdmUtbGVhZi1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBTYW1lLWxlYWYgbmF2aWdhdGlvbiB0byBhbm90aGVyIG5vdGUgZmlyZXMgbm8gbGVhZi9sYXlvdXQgY2hhbmdlOyB3aXRob3V0IHRoaXMgaXQgc3RheXMgcmVhZC1vbmx5LlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtb3BlbicsIHRoaXMub25DaGFuZ2UpKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYWNrcyByZWZlcmVuY2UtY291bnRlZCwgcGF0aC1zY29wZWQgZWRpdG9yIGxvY2tzIGFuZCBrZWVwcyBldmVyeSBvcGVuIHtAbGluayBNYXJrZG93blZpZXd9IGluXG4gKiBzeW5jIHdpdGggdGhlIGxvY2tlZC1wYXRoIHNldC4gQSBzaW5nbGUgaW5zdGFuY2UgbGl2ZXMgb24gdGhlIHNoYXJlZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBzdGF0ZS5cbiAqIEZvciBlYWNoIGxvY2tlZCBwYXRoIHRoZSBsb2NrIGNvdW50IGlzIHRyYWNrZWQgcGVyIGxvY2tpbmcgcGx1Z2luLCBzbyB0aGUgaW5kaWNhdG9ycyBjYW4gcmVwb3J0XG4gKiB3aGljaCBwbHVnaW5zIGN1cnJlbnRseSBob2xkIGEgbG9jay5cbiAqL1xuY2xhc3MgRWRpdG9yUGF0aExvY2tNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBldmVudHNDb21wb25lbnQ6IEVkaXRvckxvY2tFdmVudHNDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yc0J5VmlldyA9IG5ldyBNYXA8TWFya2Rvd25WaWV3LCBMb2NrSW5kaWNhdG9ycz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlcj4+KCk7XG4gIHByaXZhdGUgc3RhdHVzQmFySXRlbUVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBpc0xvY2tlZChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUGF0aExvY2tlZChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICB9XG5cbiAgcHVibGljIGxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiBEaXNwb3NhYmxlIHtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGxldCBsb2NrQ291bnRCeVBsdWdpbklkID0gdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoIWxvY2tDb3VudEJ5UGx1Z2luSWQpIHtcbiAgICAgIGxvY2tDb3VudEJ5UGx1Z2luSWQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLnNldChwYXRoLCBsb2NrQ291bnRCeVBsdWdpbklkKTtcbiAgICB9XG4gICAgbG9ja0NvdW50QnlQbHVnaW5JZC5zZXQocGx1Z2luSWQsIChsb2NrQ291bnRCeVBsdWdpbklkLmdldChwbHVnaW5JZCkgPz8gMCkgKyAxKTtcbiAgICB0aGlzLmVuc3VyZVN1YnNjcmliZWQoYXBwKTtcbiAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuXG4gICAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy51bmxvY2tQYXRoKGFwcCwgcGF0aCwgcGx1Z2luSWQpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVubG9ja1BhdGgoYXBwLCBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSksIHBsdWdpbklkKTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2tBbGxGb3JQbHVnaW4oYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBsb2NrQ291bnRCeVBsdWdpbklkXSBvZiB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGgpIHtcbiAgICAgIGlmIChsb2NrQ291bnRCeVBsdWdpbklkLmRlbGV0ZShwbHVnaW5JZCkgJiYgbG9ja0NvdW50QnlQbHVnaW5JZC5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5kZWxldGUocGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbmRpY2F0b3JzKHZpZXc6IE1hcmtkb3duVmlldywgdG9vbHRpcDogc3RyaW5nKTogTG9ja0luZGljYXRvcnMge1xuICAgIGNvbnN0IGFjdGlvbkljb25FbCA9IHZpZXcuYWRkQWN0aW9uKExPQ0tfSUNPTl9JRCwgdG9vbHRpcCwgbm9vcCk7XG5cbiAgICBsZXQgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHRhYlN0YXR1c0NvbnRhaW5lckVsID0gdmlldy5sZWFmLnRhYkhlYWRlclN0YXR1c0NvbnRhaW5lckVsO1xuICAgIGlmICh0YWJTdGF0dXNDb250YWluZXJFbCkge1xuICAgICAgdGFiSWNvbkVsID0gdGFiU3RhdHVzQ29udGFpbmVyRWwuY3JlYXRlU3Bhbih7IGNsczogTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTIH0pO1xuICAgICAgc2V0SWNvbih0YWJJY29uRWwsIExPQ0tfSUNPTl9JRCk7XG4gICAgICBzZXRUb29sdGlwKHRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbkljb25FbCxcbiAgICAgIHRhYkljb25FbFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVN1YnNjcmliZWQoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudHNDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBuZXcgRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudChhcHAsICgpID0+IHtcbiAgICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgfSk7XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhdGhMb2NrZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZ2V0KHBhdGgpPy5zaXplID8/IDApID4gMDtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja1Rvb2x0aXAoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9ja0NvdW50QnlQbHVnaW5JZCA9IHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5nZXQocGF0aCk7XG4gICAgLy8gYGxvY2tUb29sdGlwYCBpcyBvbmx5IGV2ZXIgY2FsbGVkIGZvciBhIGxvY2tlZCBwYXRoLCBzbyB0aGUgcGVyLXBsdWdpbiBtYXAgaXMgYWx3YXlzIHByZXNlbnQuXG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUobG9ja0NvdW50QnlQbHVnaW5JZCk7XG4gICAgY29uc3QgaGVhZGVyID0gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLmVkaXRvckxvY2subG9ja2VkQnlUb29sdGlwKTtcbiAgICBjb25zdCBwbHVnaW5OYW1lcyA9IEFycmF5LmZyb20obG9ja0NvdW50QnlQbHVnaW5JZC5rZXlzKCkpLm1hcCgocGx1Z2luSWQpID0+IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF0/Lm5hbWUgPz8gcGx1Z2luSWQpO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiBwbHVnaW4gbmFtZXMsIG9uZSBwZXIgbGluZSB1bmRlciB0aGUgaGVhZGVyLlxuICAgIHJldHVybiBbaGVhZGVyLCAuLi5wbHVnaW5OYW1lc10uam9pbignXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZShhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXdzVG9Mb2NrID0gbmV3IFNldDxNYXJrZG93blZpZXc+KCk7XG4gICAgZm9yIChjb25zdCBsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZpZXdUeXBlLk1hcmtkb3duKSkge1xuICAgICAgY29uc3QgdmlldyA9IGxlYWYudmlldztcbiAgICAgIGlmICghKHZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRoID0gdmlldy5maWxlPy5wYXRoO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNQYXRoTG9ja2VkKHBhdGgpKSB7XG4gICAgICAgIHZpZXdzVG9Mb2NrLmFkZCh2aWV3KTtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBwYXRoKTtcbiAgICAgICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgICAgIGlmIChpbmRpY2F0b3JzKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzLCB0b29sdGlwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2NrRWRpdG9yKHZpZXcuZWRpdG9yKTtcbiAgICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuc2V0KHZpZXcsIHRoaXMuY3JlYXRlSW5kaWNhdG9ycyh2aWV3LCB0b29sdGlwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFt2aWV3LCBpbmRpY2F0b3JzXSBvZiB0aGlzLmluZGljYXRvcnNCeVZpZXcpIHtcbiAgICAgIGlmICghdmlld3NUb0xvY2suaGFzKHZpZXcpKSB7XG4gICAgICAgIHVubG9ja0VkaXRvcih2aWV3LmVkaXRvcik7XG4gICAgICAgIGluZGljYXRvcnMuYWN0aW9uSWNvbkVsLnJlbW92ZSgpO1xuICAgICAgICBpbmRpY2F0b3JzLnRhYkljb25FbD8ucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5kZWxldGUodmlldyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTdGF0dXNCYXIoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlQW5kQ2xlYW51cChhcHA6IEFwcCk6IHZvaWQge1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgaWYgKHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVubG9ja1BhdGgoYXBwOiBBcHAsIHBhdGg6IHN0cmluZywgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGxvY2tDb3VudEJ5UGx1Z2luSWQgPSB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghbG9ja0NvdW50QnlQbHVnaW5JZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gbG9ja0NvdW50QnlQbHVnaW5JZC5nZXQocGx1Z2luSWQpID8/IDA7XG4gICAgaWYgKGNvdW50IDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgIGxvY2tDb3VudEJ5UGx1Z2luSWQuZGVsZXRlKHBsdWdpbklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9ja0NvdW50QnlQbHVnaW5JZC5zZXQocGx1Z2luSWQsIGNvdW50IC0gMSk7XG4gICAgfVxuXG4gICAgaWYgKGxvY2tDb3VudEJ5UGx1Z2luSWQuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9yczogTG9ja0luZGljYXRvcnMsIHRvb2x0aXA6IHN0cmluZyk6IHZvaWQge1xuICAgIHNldFRvb2x0aXAoaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwsIHRvb2x0aXApO1xuICAgIGlmIChpbmRpY2F0b3JzLnRhYkljb25FbCkge1xuICAgICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLnRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNCYXIoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgY29uc3QgYWN0aXZlUGF0aCA9IGFjdGl2ZVZpZXc/LmZpbGU/LnBhdGg7XG4gICAgY29uc3QgaXNBY3RpdmVMb2NrZWQgPSBhY3RpdmVQYXRoICE9PSB1bmRlZmluZWQgJiYgdGhpcy5pc1BhdGhMb2NrZWQoYWN0aXZlUGF0aCk7XG5cbiAgICBpZiAoIWlzQWN0aXZlTG9ja2VkIHx8ICFhY3RpdmVWaWV3KSB7XG4gICAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbD8ucmVtb3ZlKCk7XG4gICAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0YXR1c0Jhckl0ZW1FbCkge1xuICAgICAgY29uc3Qgc3RhdHVzQmFyRWwgPSBhY3RpdmVWaWV3LmNvbnRhaW5lckVsLm93bmVyRG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihTVEFUVVNfQkFSX0NTU19TRUxFQ1RPUik7XG4gICAgICBpZiAoIXN0YXR1c0JhckVsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsID0gc3RhdHVzQmFyRWwuY3JlYXRlRGl2KHsgY2xzOiBbU1RBVFVTX0JBUl9JVEVNX0NTU19DTEFTUywgTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTXSB9KTtcbiAgICAgIHNldEljb24odGhpcy5zdGF0dXNCYXJJdGVtRWwsIExPQ0tfSUNPTl9JRCk7XG4gICAgfVxuXG4gICAgc2V0VG9vbHRpcCh0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgdGhpcy5sb2NrVG9vbHRpcChhcHAsIGFjdGl2ZVBhdGgpKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcGVyLXBsdWdpbiBoYW5kbGUgZm9yIG5vdGUtc2NvcGVkIGVkaXRvciBsb2NraW5nLiBBZGQgaXQgYXMgYSBjaGlsZCBvZiB5b3VyIHBsdWdpblxuICogKGB0aGlzLmFkZENoaWxkKG5ldyBFZGl0b3JMb2NrQ29tcG9uZW50KHRoaXMuYXBwKSlgKSBzbyB0aGF0IGFueSBsb2NrcyBpdCBzdGlsbCBob2xkcyBhcmUgcmVsZWFzZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMgXHUyMDE0IGEgbm90ZSBjYW4gbmV2ZXIgYmUgbGVmdCBzdHVjayByZWFkLW9ubHkgYmVjYXVzZSB0aGVcbiAqIHBsdWdpbiB0aGF0IGxvY2tlZCBpdCB3YXMgZGlzYWJsZWQgb3IgcmVsb2FkZWQgbWlkLW9wZXJhdGlvbi5cbiAqXG4gKiBMb2NrcyBhcmUgcmVmZXJlbmNlLWNvdW50ZWQgYW5kIGF0dHJpYnV0ZWQgdG8gdGhpcyBwbHVnaW4sIHNvIHRoZSBsb2NrIGluZGljYXRvcnMnIHRvb2x0aXAgbmFtZXNcbiAqIGl0IGFtb25nIHRoZSBwbHVnaW5zIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jay5cbiAqL1xuZXhwb3J0IGNsYXNzIEVkaXRvckxvY2tDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlZGl0b3ItbG9jayBoYW5kbGUgb3duZWQgYnkgdGhlIGN1cnJlbnQgcGx1Z2luIChpZGVudGlmaWVkIHZpYSBpdHMgcGx1Z2luIGNvbnRleHQpLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihhcHA6IEFwcCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgdGhpcy5wbHVnaW5JZCA9IGdldFBsdWdpbklkKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZCBieSBhbnkgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWQodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIG9uIGJlaGFsZiBvZiB0aGlzIHBsdWdpbiwgbWFraW5nIGl0IHJlYWQtb25seSBpbiBldmVyeSBjdXJyZW50XG4gICAqIGFuZCBmdXR1cmUge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQuIFJlZmVyZW5jZS1jb3VudGVkOiBiYWxhbmNlIGVhY2ggY2FsbFxuICAgKiB3aXRoIGEgZGlzcG9zZSBvZiB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IChpZGVhbGx5IHZpYSBgdXNpbmdgKSBvciB7QGxpbmsgdW5sb2NrRm9yUGF0aH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAgICovXG4gIHB1YmxpYyBsb2NrRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKHRoaXMuYXBwLCBwYXRoT3JGaWxlLCB0aGlzLnBsdWdpbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBldmVyeSBsb2NrIHN0aWxsIGhlbGQgYnkgdGhpcyBwbHVnaW4gd2hlbiB0aGUgY29tcG9uZW50IChhbmQgdGh1cyB0aGUgcGx1Z2luKSB1bmxvYWRzLFxuICAgKiBzbyBubyBub3RlIGlzIGxlZnQgc3R1Y2sgcmVhZC1vbmx5IGJ5IGFuIG9wZXJhdGlvbiB0aGF0IG5ldmVyIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkudW5sb2NrQWxsRm9yUGx1Z2luKHRoaXMuYXBwLCB0aGlzLnBsdWdpbklkKTtcbiAgICBzdXBlci5vbnVubG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIG9uZSBsb2NrIHByZXZpb3VzbHkgYWNxdWlyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIHZpYSB7QGxpbmsgbG9ja0ZvclBhdGh9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIHVubG9ja0ZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUsIHRoaXMucGx1Z2luSWQpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWRpdG9yTG9ja2VkRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGgsIG1ha2luZyBpdCByZWFkLW9ubHkgaW4gZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlXG4gKiB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZCwgYW5kIHNob3dpbmcgYSBsb2NrIGluZGljYXRvciBpbiB0aGUgdGFiIGhlYWRlcixcbiAqIHZpZXcgYWN0aW9uIGJhciwgYW5kICh3aGlsZSBhY3RpdmUpIHRoZSBzdGF0dXMgYmFyLiBUaGUgaW5kaWNhdG9ycycgdG9vbHRpcCBsaXN0cyB0aGUgcGx1Z2luc1xuICogdGhhdCBjdXJyZW50bHkgaG9sZCBhIGxvY2sgb24gdGhlIG5vdGUuXG4gKlxuICogVGhlIGxvY2sgaXMgcmVmZXJlbmNlLWNvdW50ZWQgcGVyIGNhbGxpbmcgcGx1Z2luOiBlYWNoIGNhbGwgbXVzdCBiZSBiYWxhbmNlZCBieSBleGFjdGx5IG9uZVxuICogcmVsZWFzZSAoZWl0aGVyIGRpc3Bvc2luZyB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IFx1MjAxNCBpZGVhbGx5IHZpYSBhIGB1c2luZ2AgZGVjbGFyYXRpb24gXHUyMDE0IG9yXG4gKiBhIG1hdGNoaW5nIHtAbGluayB1bmxvY2tFZGl0b3JGb3JQYXRofSBjYWxsKS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCByZWxlYXNlcyB0aGlzIGxvY2sgd2hlbiBkaXNwb3NlZC4gRGlzcG9zaW5nIG1vcmUgdGhhbiBvbmNlIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NrRWRpdG9yRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IERpc3Bvc2FibGUge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmxvY2soYXBwLCBwYXRoT3JGaWxlLCBnZXRQbHVnaW5JZCgpKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tFZGl0b3JGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tFZGl0b3JGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS51bmxvY2soYXBwLCBwYXRoT3JGaWxlLCBnZXRQbHVnaW5JZCgpKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBFZGl0b3JQYXRoTG9ja01hbmFnZXIge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPEVkaXRvclBhdGhMb2NrTWFuYWdlcj4oRURJVE9SX0xPQ0tfU1RBVEVfS0VZLCBuZXcgRWRpdG9yUGF0aExvY2tNYW5hZ2VyKCkpLnZhbHVlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQkEsU0FBUyxnQkFBZ0I7QUFDekI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBSVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsU0FBUyxnQ0FBZ0M7QUFDekMsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxtQkFBbUI7QUFDNUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGVBQWU7QUFDeEIsU0FBUyxTQUFTO0FBQ2xCLFNBQVMsbUJBQW1CO0FBRTVCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sZUFBZTtBQUNyQixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLDBCQUEwQjtBQVloQyxNQUFNLGtDQUFrQyxZQUFZO0FBQUEsRUFDM0MsWUFBNkIsS0FBMkIsVUFBc0I7QUFDbkYsVUFBTTtBQUQ0QjtBQUEyQjtBQUFBLEVBRS9EO0FBQUEsRUFGb0M7QUFBQSxFQUEyQjtBQUFBLEVBSS9DLFNBQWU7QUFDN0IsVUFBTSxPQUFPO0FBQ2IsU0FBSyxjQUFjLEtBQUssSUFBSSxVQUFVLEdBQUcsc0JBQXNCLEtBQUssUUFBUSxDQUFDO0FBQzdFLFNBQUssY0FBYyxLQUFLLElBQUksVUFBVSxHQUFHLGlCQUFpQixLQUFLLFFBQVEsQ0FBQztBQUV4RSxTQUFLLGNBQWMsS0FBSyxJQUFJLFVBQVUsR0FB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
@@ -29,6 +29,7 @@ export declare const en: {
29
29
  readonly pageHeader: "Page {{pageNumber, number}} of {{totalPages, number}}, Total items: {{totalItems, number}}";
30
30
  };
31
31
  readonly editorLock: {
32
+ readonly lockedByTooltip: "Locked by";
32
33
  readonly lockedNoteTooltip: "This note is locked while an operation is in progress.";
33
34
  };
34
35
  readonly metadataCache: {
@@ -43,6 +43,7 @@ const en = {
43
43
  pageHeader: "Page {{pageNumber, number}} of {{totalPages, number}}, Total items: {{totalItems, number}}"
44
44
  },
45
45
  editorLock: {
46
+ lockedByTooltip: "Locked by",
46
47
  lockedNoteTooltip: "This note is locked while an operation is in progress."
47
48
  },
48
49
  metadataCache: {
@@ -69,4 +70,4 @@ const en = {
69
70
  export {
70
71
  en
71
72
  };
72
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2kxOG4vbG9jYWxlcy9lbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFbmdsaXNoIHRyYW5zbGF0aW9ucyBmb3IgdGhlIGBpMThuYCBtb2R1bGUuXG4gKi9cblxuLyoqXG4gKiBUaGUgRW5nbGlzaCB0cmFuc2xhdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBlbiA9IHtcbiAgb2JzaWRpYW5EZXZVdGlsczoge1xuICAgIGFzeW5jV2l0aE5vdGljZToge1xuICAgICAgbWlsbGlzZWNvbmRzOiAnbWlsbGlzZWNvbmRzLi4uJyxcbiAgICAgIG9wZXJhdGlvbjogJ09wZXJhdGlvbicsXG4gICAgICBydW5uaW5nRm9yOiAnUnVubmluZyBmb3InLFxuICAgICAgdGVybWluYXRlT3BlcmF0aW9uOiAnWW91IGNhbiB0ZXJtaW5hdGUgdGhlIG9wZXJhdGlvbiBieSBjbGlja2luZyB0aGUgYnV0dG9uIGJlbG93LCBidXQgYmUgYXdhcmUgaXQgbWlnaHQgbGVhdmUgdGhlIHZhdWx0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4nLFxuICAgICAgdGltZWRPdXQ6ICdUaGUgb3BlcmF0aW9uIHRpbWVkIG91dCBhZnRlciB7e2R1cmF0aW9uLCBudW1iZXJ9fSBtaWxsaXNlY29uZHMuJ1xuICAgIH0sXG4gICAgYnV0dG9uczoge1xuICAgICAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgICAgIG9rOiAnT0snXG4gICAgfSxcbiAgICBjYWxsb3V0OiB7XG4gICAgICBsb2FkQ29udGVudDogJ0xvYWQgY29udGVudCBmb3IgY2FsbG91dCdcbiAgICB9LFxuICAgIGRhdGF2aWV3OiB7XG4gICAgICBpdGVtc1BlclBhZ2U6ICdJdGVtcyBwZXIgcGFnZTonLFxuICAgICAganVtcFRvUGFnZTogJ0p1bXAgdG8gcGFnZTonLFxuICAgICAgcGFnZUhlYWRlcjogJ1BhZ2Uge3twYWdlTnVtYmVyLCBudW1iZXJ9fSBvZiB7e3RvdGFsUGFnZXMsIG51bWJlcn19LCBUb3RhbCBpdGVtczoge3t0b3RhbEl0ZW1zLCBudW1iZXJ9fSdcbiAgICB9LFxuICAgIGVkaXRvckxvY2s6IHtcbiAgICAgIGxvY2tlZE5vdGVUb29sdGlwOiAnVGhpcyBub3RlIGlzIGxvY2tlZCB3aGlsZSBhbiBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuJ1xuICAgIH0sXG4gICAgbWV0YWRhdGFDYWNoZToge1xuICAgICAgZ2V0QmFja2xpbmtzRm9yRmlsZVBhdGg6ICdHZXQgYmFja2xpbmtzIGZvciB7e2ZpbGVQYXRofX0nXG4gICAgfSxcbiAgICBub3RpY2VzOiB7XG4gICAgICBhdHRhY2htZW50SXNTdGlsbFVzZWQ6ICdBdHRhY2htZW50IHt7YXR0YWNobWVudFBhdGh9fSBpcyBzdGlsbCB1c2VkIGJ5IG90aGVyIG5vdGVzLiBJdCB3aWxsIG5vdCBiZSBkZWxldGVkLicsXG4gICAgICB1bmhhbmRsZWRFcnJvcjogJ0FuIHVuaGFuZGxlZCBlcnJvciBvY2N1cnJlZC4gUGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9uLidcbiAgICB9LFxuICAgIHF1ZXVlOiB7XG4gICAgICBmbHVzaFF1ZXVlOiAnRmx1c2ggcXVldWUnXG4gICAgfSxcbiAgICByZW5hbWVEZWxldGVIYW5kbGVyOiB7XG4gICAgICBoYW5kbGVEZWxldGU6ICdIYW5kbGUgZGVsZXRlOiB7e2ZpbGVQYXRofX0nLFxuICAgICAgaGFuZGxlT3JwaGFuZWRSZW5hbWVzOiAnSGFuZGxlIG9ycGhhbmVkIHJlbmFtZXMnLFxuICAgICAgaGFuZGxlUmVuYW1lOiAnSGFuZGxlIHJlbmFtZToge3tvbGRQYXRofX0gLT4ge3tuZXdQYXRofX0nLFxuICAgICAgdXBkYXRlZExpbmtzOiAnVXBkYXRlZCB7e2xpbmtzQ291bnQsIG51bWJlcn19IGxpbmtzIGluIHt7ZmlsZXNDb3VudCwgbnVtYmVyfX0gZmlsZXMuJ1xuICAgIH0sXG4gICAgdmF1bHQ6IHtcbiAgICAgIHByb2Nlc3NGaWxlOiAnUHJvY2VzcyBmaWxlIHt7ZmlsZVBhdGh9fSdcbiAgICB9XG4gIH1cbn0gYXMgY29uc3Q7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNPLE1BQU0sS0FBSztBQUFBLEVBQ2hCLGtCQUFrQjtBQUFBLElBQ2hCLGlCQUFpQjtBQUFBLE1BQ2YsY0FBYztBQUFBLE1BQ2QsV0FBVztBQUFBLE1BQ1gsWUFBWTtBQUFBLE1BQ1osb0JBQW9CO0FBQUEsTUFDcEIsVUFBVTtBQUFBLElBQ1o7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSLElBQUk7QUFBQSxJQUNOO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsY0FBYztBQUFBLE1BQ2QsWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLElBQ2Q7QUFBQSxJQUNBLFlBQVk7QUFBQSxNQUNWLG1CQUFtQjtBQUFBLElBQ3JCO0FBQUEsSUFDQSxlQUFlO0FBQUEsTUFDYix5QkFBeUI7QUFBQSxJQUMzQjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsdUJBQXVCO0FBQUEsTUFDdkIsZ0JBQWdCO0FBQUEsSUFDbEI7QUFBQSxJQUNBLE9BQU87QUFBQSxNQUNMLFlBQVk7QUFBQSxJQUNkO0FBQUEsSUFDQSxxQkFBcUI7QUFBQSxNQUNuQixjQUFjO0FBQUEsTUFDZCx1QkFBdUI7QUFBQSxNQUN2QixjQUFjO0FBQUEsTUFDZCxjQUFjO0FBQUEsSUFDaEI7QUFBQSxJQUNBLE9BQU87QUFBQSxNQUNMLGFBQWE7QUFBQSxJQUNmO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
73
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2kxOG4vbG9jYWxlcy9lbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFbmdsaXNoIHRyYW5zbGF0aW9ucyBmb3IgdGhlIGBpMThuYCBtb2R1bGUuXG4gKi9cblxuLyoqXG4gKiBUaGUgRW5nbGlzaCB0cmFuc2xhdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBlbiA9IHtcbiAgb2JzaWRpYW5EZXZVdGlsczoge1xuICAgIGFzeW5jV2l0aE5vdGljZToge1xuICAgICAgbWlsbGlzZWNvbmRzOiAnbWlsbGlzZWNvbmRzLi4uJyxcbiAgICAgIG9wZXJhdGlvbjogJ09wZXJhdGlvbicsXG4gICAgICBydW5uaW5nRm9yOiAnUnVubmluZyBmb3InLFxuICAgICAgdGVybWluYXRlT3BlcmF0aW9uOiAnWW91IGNhbiB0ZXJtaW5hdGUgdGhlIG9wZXJhdGlvbiBieSBjbGlja2luZyB0aGUgYnV0dG9uIGJlbG93LCBidXQgYmUgYXdhcmUgaXQgbWlnaHQgbGVhdmUgdGhlIHZhdWx0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4nLFxuICAgICAgdGltZWRPdXQ6ICdUaGUgb3BlcmF0aW9uIHRpbWVkIG91dCBhZnRlciB7e2R1cmF0aW9uLCBudW1iZXJ9fSBtaWxsaXNlY29uZHMuJ1xuICAgIH0sXG4gICAgYnV0dG9uczoge1xuICAgICAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgICAgIG9rOiAnT0snXG4gICAgfSxcbiAgICBjYWxsb3V0OiB7XG4gICAgICBsb2FkQ29udGVudDogJ0xvYWQgY29udGVudCBmb3IgY2FsbG91dCdcbiAgICB9LFxuICAgIGRhdGF2aWV3OiB7XG4gICAgICBpdGVtc1BlclBhZ2U6ICdJdGVtcyBwZXIgcGFnZTonLFxuICAgICAganVtcFRvUGFnZTogJ0p1bXAgdG8gcGFnZTonLFxuICAgICAgcGFnZUhlYWRlcjogJ1BhZ2Uge3twYWdlTnVtYmVyLCBudW1iZXJ9fSBvZiB7e3RvdGFsUGFnZXMsIG51bWJlcn19LCBUb3RhbCBpdGVtczoge3t0b3RhbEl0ZW1zLCBudW1iZXJ9fSdcbiAgICB9LFxuICAgIGVkaXRvckxvY2s6IHtcbiAgICAgIGxvY2tlZEJ5VG9vbHRpcDogJ0xvY2tlZCBieScsXG4gICAgICBsb2NrZWROb3RlVG9vbHRpcDogJ1RoaXMgbm90ZSBpcyBsb2NrZWQgd2hpbGUgYW4gb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLidcbiAgICB9LFxuICAgIG1ldGFkYXRhQ2FjaGU6IHtcbiAgICAgIGdldEJhY2tsaW5rc0ZvckZpbGVQYXRoOiAnR2V0IGJhY2tsaW5rcyBmb3Ige3tmaWxlUGF0aH19J1xuICAgIH0sXG4gICAgbm90aWNlczoge1xuICAgICAgYXR0YWNobWVudElzU3RpbGxVc2VkOiAnQXR0YWNobWVudCB7e2F0dGFjaG1lbnRQYXRofX0gaXMgc3RpbGwgdXNlZCBieSBvdGhlciBub3Rlcy4gSXQgd2lsbCBub3QgYmUgZGVsZXRlZC4nLFxuICAgICAgdW5oYW5kbGVkRXJyb3I6ICdBbiB1bmhhbmRsZWQgZXJyb3Igb2NjdXJyZWQuIFBsZWFzZSBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nXG4gICAgfSxcbiAgICBxdWV1ZToge1xuICAgICAgZmx1c2hRdWV1ZTogJ0ZsdXNoIHF1ZXVlJ1xuICAgIH0sXG4gICAgcmVuYW1lRGVsZXRlSGFuZGxlcjoge1xuICAgICAgaGFuZGxlRGVsZXRlOiAnSGFuZGxlIGRlbGV0ZToge3tmaWxlUGF0aH19JyxcbiAgICAgIGhhbmRsZU9ycGhhbmVkUmVuYW1lczogJ0hhbmRsZSBvcnBoYW5lZCByZW5hbWVzJyxcbiAgICAgIGhhbmRsZVJlbmFtZTogJ0hhbmRsZSByZW5hbWU6IHt7b2xkUGF0aH19IC0+IHt7bmV3UGF0aH19JyxcbiAgICAgIHVwZGF0ZWRMaW5rczogJ1VwZGF0ZWQge3tsaW5rc0NvdW50LCBudW1iZXJ9fSBsaW5rcyBpbiB7e2ZpbGVzQ291bnQsIG51bWJlcn19IGZpbGVzLidcbiAgICB9LFxuICAgIHZhdWx0OiB7XG4gICAgICBwcm9jZXNzRmlsZTogJ1Byb2Nlc3MgZmlsZSB7e2ZpbGVQYXRofX0nXG4gICAgfVxuICB9XG59IGFzIGNvbnN0O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTTyxNQUFNLEtBQUs7QUFBQSxFQUNoQixrQkFBa0I7QUFBQSxJQUNoQixpQkFBaUI7QUFBQSxNQUNmLGNBQWM7QUFBQSxNQUNkLFdBQVc7QUFBQSxNQUNYLFlBQVk7QUFBQSxNQUNaLG9CQUFvQjtBQUFBLE1BQ3BCLFVBQVU7QUFBQSxJQUNaO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxRQUFRO0FBQUEsTUFDUixJQUFJO0FBQUEsSUFDTjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLGNBQWM7QUFBQSxNQUNkLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxJQUNkO0FBQUEsSUFDQSxZQUFZO0FBQUEsTUFDVixpQkFBaUI7QUFBQSxNQUNqQixtQkFBbUI7QUFBQSxJQUNyQjtBQUFBLElBQ0EsZUFBZTtBQUFBLE1BQ2IseUJBQXlCO0FBQUEsSUFDM0I7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLHVCQUF1QjtBQUFBLE1BQ3ZCLGdCQUFnQjtBQUFBLElBQ2xCO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTCxZQUFZO0FBQUEsSUFDZDtBQUFBLElBQ0EscUJBQXFCO0FBQUEsTUFDbkIsY0FBYztBQUFBLE1BQ2QsdUJBQXVCO0FBQUEsTUFDdkIsY0FBYztBQUFBLE1BQ2QsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTCxhQUFhO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -32,6 +32,7 @@ declare const translationsMapImpl: {
32
32
  readonly pageHeader: "Page {{pageNumber, number}} of {{totalPages, number}}, Total items: {{totalItems, number}}";
33
33
  };
34
34
  readonly editorLock: {
35
+ readonly lockedByTooltip: "Locked by";
35
36
  readonly lockedNoteTooltip: "This note is locked while an operation is in progress.";
36
37
  };
37
38
  readonly metadataCache: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "82.0.0-beta.3",
3
+ "version": "82.0.0-beta.5",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development.",
5
5
  "keywords": [
6
6
  "obsidian"