obsidian-dev-utils 87.1.2 → 87.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 87.3.0
4
+
5
+ - feat: change demo vault artifact name
6
+
7
+ ## 87.2.0
8
+
9
+ - feat(demo-vault): show progress immediately, cache archives only, extract fresh per open
10
+ - chore: update libs
11
+
3
12
  ## 87.1.2
4
13
 
5
14
  - feat(demo-vault-helper): create the invocable scripts folder on bootstrap
@@ -129,7 +129,7 @@ __export(generated_during_build_exports, {
129
129
  LIBRARY_VERSION: () => LIBRARY_VERSION
130
130
  });
131
131
  module.exports = __toCommonJS(generated_during_build_exports);
132
- const LIBRARY_VERSION = "87.1.2";
132
+ const LIBRARY_VERSION = "87.3.0";
133
133
  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@keyframes obsidian-dev-utils-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-dev-utils-lock-indicator-flash {\n animation: obsidian-dev-utils-lock-indicator-flash 0.35s ease-in-out;\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@keyframes obsidian-dev-utils-minimized-modal-bar-attention {\n 0% {\n box-shadow: 0 0 0 0 var(--interactive-accent);\n }\n 40% {\n box-shadow: 0 0 0 4px var(--interactive-accent);\n }\n 100% {\n box-shadow: var(--shadow-s);\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: calc(var(--size-4-4) + var(--size-4-8));\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 cursor: pointer;\n animation: obsidian-dev-utils-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-dev-utils.minimized-modal-bar:hover {\n background-image: linear-gradient(var(--background-modifier-hover), var(--background-modifier-hover));\n}\n.obsidian-dev-utils.minimized-modal-bar.minimized-modal-bar-attention {\n animation: obsidian-dev-utils-minimized-modal-bar-attention 0.35s ease-out;\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.obsidian-dev-utils.minimized-modal-bar .cancel-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.obsidian-dev-utils.minimized-modal-bar .cancel-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-notice-name {\n color: var(--text-accent);\n display: inline-block;\n font-weight: var(--font-bold);\n margin-bottom: var(--size-4-2);\n}\n.obsidian-dev-utils.plugin-notice-content {\n padding-right: var(--size-4-5);\n position: relative;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.cancel-button {\n display: block;\n margin-top: var(--size-4-2);\n width: fit-content;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.plugin-notice-close-button {\n position: absolute;\n right: var(--size-4-3);\n top: var(--size-4-3);\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice {\n padding: 0;\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice .obsidian-dev-utils.plugin-notice-content {\n padding: var(--size-4-3) var(--size-4-4);\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-notice.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;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;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;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOA;EACE;;AAOF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;;;ACxGJ;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACTN;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAOJ;EACE;;AAEA;EACE;;;AChCF;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%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-dev-utils-lock-indicator-flash%200.35s%20ease-in-out;%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@keyframes%20obsidian-dev-utils-minimized-modal-bar-attention%20%7B%5Cn%20%200%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%200%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%204px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%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//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%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:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%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%20cursor:%20pointer;%5Cn%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20//%20Layer%20the%20translucent%20hover%20tint%20over%20the%20opaque%20%60background%60%20(%60--background-secondary%60)%20via%5Cn%20%20%20%20//%20%60background-image%60%20instead%20of%20replacing%20the%20background-color.%20%60--background-modifier-hover%60%20is%5Cn%20%20%20%20//%20translucent,%20so%20setting%20it%20as%20%60background%60%20would%20let%20the%20editor%20content%20behind%20the%20floating%20bar%5Cn%20%20%20%20//%20bleed%20through%20and%20make%20the%20title%20unreadable.%20A%20gradient%20of%20the%20tint%20composited%20over%20the%20opaque%5Cn%20%20%20%20//%20base%20keeps%20the%20bar%20opaque%20while%20preserving%20the%20subtle%20hover%20highlight.%5Cn%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20background-image:%20linear-gradient(var(--background-modifier-hover),%20var(--background-modifier-hover));%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20one-shot,%20more%20pronounced%20flash%20played%20when%20the%20user%20attempts%20a%20blocked%20action%20(a%20keystroke,%5Cn%20%20%20%20//%20right-click,%20or%20opening%20another%20modal)%20while%20this%20modal%20is%20minimized,%20so%20the%20block%20is%20not%5Cn%20%20%20%20//%20silent.%20Its%20higher%20specificity%20overrides%20the%20gentle%20infinite%20idle%20pulse%20while%20it%20plays;%20the%5Cn%20%20%20%20//%20class%20is%20removed%20on%20%60animationend%60,%20restoring%20the%20idle%20pulse.%5Cn%20%20%20%20&.minimized-modal-bar-attention%20%7B%5Cn%20%20%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-attention%200.35s%20ease-out;%5Cn%20%20%20%20%7D%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,%5Cn%20%20%20%20.cancel-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-notice-name%20%7B%5Cn%20%20%20%20color:%20var(--text-accent);%5Cn%20%20%20%20display:%20inline-block;%5Cn%20%20%20%20font-weight:%20var(--font-bold);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-2);%5Cn%20%20%7D%5Cn%5Cn%20%20&.plugin-notice-content%20%7B%5Cn%20%20%20%20padding-right:%20var(--size-4-5);%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20The%20close%20button%20reuses%20Obsidian's%20%60modal-header-button%60%20+%20%60clickable-icon%60%20classes%20so%20it%20matches%5Cn%20%20%20%20//%20The%20native%20modal%20close%20button%20(box%20+%20hover);%20only%20its%20corner%20position%20is%20set%20here.%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-close-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20right:%20var(--size-4-3);%5Cn%20%20%20%20%20%20top:%20var(--size-4-3);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20Move%20the%20notice's%20own%20padding%20onto%20the%20content%20wrapper%20so%20the%20wrapper%20covers%20the%20whole%20clickable%5Cn%20%20//%20Area%20%E2%80%94%20otherwise%20a%20click%20landing%20on%20the%20notice's%20bare%20padding%20(outside%20the%20wrapper)%20would%20bypass%20the%5Cn%20%20//%20Stop-propagation%20guard%20and%20dismiss%20the%20hard-to-close%20notice.%5Cn%20%20&.plugin-notice-requires-explicit-close.notice%20%7B%5Cn%20%20%20%20padding:%200;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-content%20%7B%5Cn%20%20%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%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";
134
134
  // Annotate the CommonJS export names for ESM import in node:
135
135
  0 && (module.exports = {
@@ -112,6 +112,10 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
112
112
  var __getOwnPropNames = Object.getOwnPropertyNames;
113
113
  var __getProtoOf = Object.getPrototypeOf;
114
114
  var __hasOwnProp = Object.prototype.hasOwnProperty;
115
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
116
+ var __typeError = (msg) => {
117
+ throw TypeError(msg);
118
+ };
115
119
  var __export = (target, all) => {
116
120
  for (var name in all)
117
121
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -133,6 +137,47 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
133
137
  mod
134
138
  ));
135
139
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
140
+ var __using = (stack, value, async) => {
141
+ if (value != null) {
142
+ if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
143
+ var dispose, inner;
144
+ if (async) dispose = value[__knownSymbol("asyncDispose")];
145
+ if (dispose === void 0) {
146
+ dispose = value[__knownSymbol("dispose")];
147
+ if (async) inner = dispose;
148
+ }
149
+ if (typeof dispose !== "function") __typeError("Object not disposable");
150
+ if (inner) dispose = function() {
151
+ try {
152
+ inner.call(this);
153
+ } catch (e) {
154
+ return Promise.reject(e);
155
+ }
156
+ };
157
+ stack.push([async, dispose, value]);
158
+ } else if (async) {
159
+ stack.push([async]);
160
+ }
161
+ return value;
162
+ };
163
+ var __callDispose = (stack, error, hasError) => {
164
+ var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
165
+ return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
166
+ };
167
+ var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
168
+ var next = (it) => {
169
+ while (it = stack.pop()) {
170
+ try {
171
+ var result = it[1] && it[1].call(it[2]);
172
+ if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
173
+ } catch (e) {
174
+ fail(e);
175
+ }
176
+ }
177
+ if (hasError) throw error;
178
+ };
179
+ return next();
180
+ };
136
181
  var desktop_demo_vault_opener_exports = {};
137
182
  __export(desktop_demo_vault_opener_exports, {
138
183
  openDemoVault: () => openDemoVault
@@ -148,95 +193,148 @@ var import_path = require('../path.cjs');
148
193
  var import_community_plugins = require('./community-plugins.cjs');
149
194
  var import_select_option = require('./modals/select-option.cjs');
150
195
  const DEMO_VAULTS_CACHE_FOLDER = "obsidian-demo-vaults";
196
+ const ARCHIVES_SUBFOLDER = "archives";
197
+ const EXTRACTED_VAULTS_SUBFOLDER = "extracted";
151
198
  const HTTP_STATUS_OK = 200;
199
+ const ORPHANED_EXTRACTED_VAULT_MAX_AGE_IN_MILLISECONDS = 864e5;
152
200
  async function openDemoVault(params) {
153
- const {
154
- app,
155
- pluginId,
156
- pluginName,
157
- pluginNoticeComponent,
158
- pluginVersion
159
- } = params;
160
- const repo = await (0, import_community_plugins.getCommunityPluginRepo)(pluginId);
161
- if (!repo) {
162
- pluginNoticeComponent.showNotice(`Could not find plugin ${pluginName} in the community plugins registry.`);
163
- return;
164
- }
165
- const currentVersion = pluginVersion;
166
- const latestVersion = await (0, import_community_plugins.getLatestReleaseVersion)(repo);
167
- let versionToOpen;
168
- if ((0, import_compare_versions.compareVersions)(currentVersion, latestVersion) >= 0) {
169
- versionToOpen = currentVersion;
170
- } else {
171
- const chosenVersion = await (0, import_select_option.selectOption)({
201
+ var _stack = [];
202
+ try {
203
+ const {
172
204
  app,
173
- message: `Current version of plugin ${pluginName} v${currentVersion} is not the latest (v${latestVersion})`,
174
- options: [
175
- {
176
- isCta: true,
177
- text: `Open demo vault for latest version (v${latestVersion})`,
178
- value: latestVersion
179
- },
180
- {
181
- text: `Open demo vault for current version (v${currentVersion})`,
182
- value: currentVersion
183
- },
184
- {
185
- text: "Cancel",
186
- value: null
187
- }
188
- ],
189
- title: pluginName
190
- });
191
- if (chosenVersion === null) {
205
+ pluginId,
206
+ pluginName,
207
+ pluginNoticeComponent,
208
+ pluginVersion
209
+ } = params;
210
+ const progressNotice = __using(_stack, pluginNoticeComponent.showNoticeAfterDelay({
211
+ content: `Opening demo vault for ${pluginName}\u2026`,
212
+ delayInMilliseconds: 0
213
+ }));
214
+ const repo = await (0, import_community_plugins.getCommunityPluginRepo)(pluginId);
215
+ if (!repo) {
216
+ pluginNoticeComponent.showNotice(`Could not find plugin ${pluginName} in the community plugins registry.`);
192
217
  return;
193
218
  }
194
- versionToOpen = chosenVersion;
195
- }
196
- const cacheDir = (0, import_path.join)((0, import_node_os.tmpdir)(), DEMO_VAULTS_CACHE_FOLDER, pluginId, versionToOpen);
197
- if (!(0, import_node_fs.existsSync)(cacheDir)) {
198
- const isExtracted = await downloadAndExtractDemoVault({
199
- cacheDir,
219
+ const currentVersion = pluginVersion;
220
+ const latestVersion = await (0, import_community_plugins.getLatestReleaseVersion)(repo);
221
+ let versionToOpen;
222
+ if ((0, import_compare_versions.compareVersions)(currentVersion, latestVersion) >= 0) {
223
+ versionToOpen = currentVersion;
224
+ } else {
225
+ const chosenVersion = await (0, import_select_option.selectOption)({
226
+ app,
227
+ message: `Current version of plugin ${pluginName} v${currentVersion} is not the latest (v${latestVersion})`,
228
+ options: [
229
+ {
230
+ isCta: true,
231
+ text: `Open demo vault for latest version (v${latestVersion})`,
232
+ value: latestVersion
233
+ },
234
+ {
235
+ text: `Open demo vault for current version (v${currentVersion})`,
236
+ value: currentVersion
237
+ },
238
+ {
239
+ text: "Cancel",
240
+ value: null
241
+ }
242
+ ],
243
+ title: pluginName
244
+ });
245
+ if (chosenVersion === null) {
246
+ return;
247
+ }
248
+ versionToOpen = chosenVersion;
249
+ }
250
+ const archive = await resolveDemoVaultArchive({
200
251
  pluginId,
201
252
  pluginName,
202
253
  pluginNoticeComponent,
254
+ progressNotice,
203
255
  repo,
204
256
  version: versionToOpen
205
257
  });
206
- if (!isExtracted) {
258
+ if (!archive) {
207
259
  return;
208
260
  }
261
+ progressNotice.setContent(`Extracting demo vault for ${pluginName} v${versionToOpen}\u2026`);
262
+ cleanupOrphanedExtractedVaults();
263
+ const vaultDir = extractDemoVaultToFreshFolder({
264
+ archive,
265
+ pluginId,
266
+ version: versionToOpen
267
+ });
268
+ window.electron.ipcRenderer.sendSync("vault-open", vaultDir, false);
269
+ } catch (_) {
270
+ var _error = _, _hasError = true;
271
+ } finally {
272
+ __callDispose(_stack, _error, _hasError);
273
+ }
274
+ }
275
+ function cleanupOrphanedExtractedVaults() {
276
+ const extractedVaultsRoot = (0, import_path.join)((0, import_node_os.tmpdir)(), DEMO_VAULTS_CACHE_FOLDER, EXTRACTED_VAULTS_SUBFOLDER);
277
+ if (!(0, import_node_fs.existsSync)(extractedVaultsRoot)) {
278
+ return;
279
+ }
280
+ const now = Date.now();
281
+ for (const entryName of (0, import_node_fs.readdirSync)(extractedVaultsRoot)) {
282
+ const entryPath = (0, import_path.join)(extractedVaultsRoot, entryName);
283
+ try {
284
+ const stats = (0, import_node_fs.statSync)(entryPath);
285
+ if (now - stats.mtimeMs < ORPHANED_EXTRACTED_VAULT_MAX_AGE_IN_MILLISECONDS) {
286
+ continue;
287
+ }
288
+ (0, import_node_fs.rmSync)(entryPath, { force: true, recursive: true });
289
+ } catch {
290
+ }
209
291
  }
210
- window.electron.ipcRenderer.sendSync("vault-open", cacheDir, false);
211
292
  }
212
- async function downloadAndExtractDemoVault(params) {
293
+ function extractDemoVaultArchive(archive, targetDir) {
294
+ const originalFs = window.require('node:original-fs');
295
+ const zip = new import_adm_zip.default(archive, { fs: originalFs });
296
+ zip.extractAllTo(targetDir, true);
297
+ }
298
+ function extractDemoVaultToFreshFolder(params) {
299
+ const { archive, pluginId, version } = params;
300
+ const extractedVaultsRoot = (0, import_path.join)((0, import_node_os.tmpdir)(), DEMO_VAULTS_CACHE_FOLDER, EXTRACTED_VAULTS_SUBFOLDER);
301
+ (0, import_node_fs.mkdirSync)(extractedVaultsRoot, { recursive: true });
302
+ const uniqueParentDir = (0, import_node_fs.mkdtempSync)((0, import_path.join)(extractedVaultsRoot, `${pluginId}-${version}-`));
303
+ const vaultDir = (0, import_path.join)(uniqueParentDir, `${pluginId}-${version}.demo-vault`);
304
+ extractDemoVaultArchive(archive, vaultDir);
305
+ return vaultDir;
306
+ }
307
+ async function resolveDemoVaultArchive(params) {
213
308
  const {
214
- cacheDir,
215
309
  pluginId,
216
310
  pluginName,
217
311
  pluginNoticeComponent,
312
+ progressNotice,
218
313
  repo,
219
314
  version
220
315
  } = params;
221
- const assetUrl = `https://github.com/${repo}/releases/download/${version}/${pluginId}.demo-vault.zip`;
316
+ const archivesDir = (0, import_path.join)((0, import_node_os.tmpdir)(), DEMO_VAULTS_CACHE_FOLDER, ARCHIVES_SUBFOLDER);
317
+ const archivePath = (0, import_path.join)(archivesDir, `${pluginId}-${version}.zip`);
318
+ if ((0, import_node_fs.existsSync)(archivePath)) {
319
+ return (0, import_node_fs.readFileSync)(archivePath);
320
+ }
321
+ progressNotice.setContent(`Downloading demo vault for ${pluginName} v${version}\u2026`);
322
+ const assetUrl = `https://github.com/${repo}/releases/download/${version}/${pluginId}-demo-vault-${version}.zip`;
222
323
  const response = await (0, import_obsidian.requestUrl)({
223
324
  throw: false,
224
325
  url: assetUrl
225
326
  });
226
327
  if (response.status !== HTTP_STATUS_OK) {
227
328
  pluginNoticeComponent.showNotice(`No demo vault is available for plugin ${pluginName} v${version}.`);
228
- return false;
329
+ return null;
229
330
  }
230
- extractDemoVaultArchive(import_node_buffer.Buffer.from(response.arrayBuffer), cacheDir);
231
- return true;
232
- }
233
- function extractDemoVaultArchive(archive, targetDir) {
234
- const originalFs = window.require('node:original-fs');
235
- const zip = new import_adm_zip.default(archive, { fs: originalFs });
236
- zip.extractAllTo(targetDir, true);
331
+ const archive = import_node_buffer.Buffer.from(response.arrayBuffer);
332
+ (0, import_node_fs.mkdirSync)(archivesDir, { recursive: true });
333
+ (0, import_node_fs.writeFileSync)(archivePath, archive);
334
+ return archive;
237
335
  }
238
336
  // Annotate the CommonJS export names for ESM import in node:
239
337
  0 && (module.exports = {
240
338
  openDemoVault
241
339
  });
242
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2Rlc2t0b3AtZGVtby12YXVsdC1vcGVuZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEb3dubG9hZHMgYW5kIG9wZW5zIGEgcGx1Z2luJ3Mgc2hpcHBlZCBkZW1vIHZhdWx0IGluIGEgbmV3IE9ic2lkaWFuIHdpbmRvdyAoZGVza3RvcCBvbmx5KS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gYXR0YWNoIGEgYDxwbHVnaW4taWQ+LmRlbW8tdmF1bHQuemlwYCBhcmNoaXZlIHRvIGVhY2ggR2l0SHViIHJlbGVhc2UgKHNlZVxuICogYGFyY2hpdmVQbHVnaW5EZW1vVmF1bHRgIGluIGBzY3JpcHQtdXRpbHMvZGVtby12YXVsdC50c2ApLiBUaGlzIHJlc29sdmVzIHRoZSBwbHVnaW4ncyByZXBvc2l0b3J5XG4gKiBmcm9tIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHJlZ2lzdHJ5LCBkb3dubG9hZHMgdGhlIGFyY2hpdmUgZm9yIHRoZSBjaG9zZW4gdmVyc2lvbiwgZXh0cmFjdHMgaXQgdG8gYVxuICogcGVyLXZlcnNpb24gY2FjaGUgZm9sZGVyIHVuZGVyIHRoZSBPUyB0ZW1wIGRpcmVjdG9yeSwgYW5kIG9wZW5zIHRoYXQgZm9sZGVyIGFzIGEgdmF1bHQgaW4gYSBuZXdcbiAqIHdpbmRvdy4gV2hlbiB0aGUgaW5zdGFsbGVkIHBsdWdpbiB2ZXJzaW9uIGlzIGJlaGluZCB0aGUgbGF0ZXN0IHJlbGVhc2UsIHRoZSB1c2VyIGlzIG9mZmVyZWQgYSBjaG9pY2VcbiAqIGJldHdlZW4gdGhlIHR3byB2ZXJzaW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IEFkbVppcCBmcm9tICdhZG0temlwJztcbmltcG9ydCB7IGNvbXBhcmVWZXJzaW9ucyB9IGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLW5vZGVqcy1tb2R1bGVzIC0tIERlc2t0b3Atb25seSBmZWF0dXJlIGdhdGVkIGJ5IGBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHBgOyB0aGUgY29tbWFuZCBpcyBoaWRkZW4gb24gbW9iaWxlIHNvIHRoaXMgTm9kZSBBUEkgaXMgbmV2ZXIgcmVhY2hlZCB0aGVyZS5cbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQteC9uby1ub2RlanMtbW9kdWxlcyAtLSBEZXNrdG9wLW9ubHkgZmVhdHVyZSBnYXRlZCBieSBgUGxhdGZvcm0uaXNEZXNrdG9wQXBwYDsgdGhlIGNvbW1hbmQgaXMgaGlkZGVuIG9uIG1vYmlsZSBzbyB0aGlzIE5vZGUgQVBJIGlzIG5ldmVyIHJlYWNoZWQgdGhlcmUuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0LXgvbm8tbm9kZWpzLW1vZHVsZXMgLS0gRGVza3RvcC1vbmx5IGZlYXR1cmUgZ2F0ZWQgYnkgYFBsYXRmb3JtLmlzRGVza3RvcEFwcGA7IHRoZSBjb21tYW5kIGlzIGhpZGRlbiBvbiBtb2JpbGUgc28gdGhpcyBOb2RlIEFQSSBpcyBuZXZlciByZWFjaGVkIHRoZXJlLlxuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyByZXF1ZXN0VXJsIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk5vdGljZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGpvaW4gfSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIGdldENvbW11bml0eVBsdWdpblJlcG8sXG4gIGdldExhdGVzdFJlbGVhc2VWZXJzaW9uXG59IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbnMudHMnO1xuaW1wb3J0IHsgc2VsZWN0T3B0aW9uIH0gZnJvbSAnLi9tb2RhbHMvc2VsZWN0LW9wdGlvbi50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIG9wZW5EZW1vVmF1bHR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5EZW1vVmF1bHRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlkLCB1c2VkIHRvIGxvY2F0ZSB0aGUgR2l0SHViIHJlcG9zaXRvcnkgYW5kIHRoZSBwZXItdmVyc2lvbiBjYWNoZSBmb2xkZXIsIGFuZCB0byBuYW1lXG4gICAqIHRoZSBhcmNoaXZlIGFzc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBkaXNwbGF5IG5hbWUsIHVzZWQgdG8gbGFiZWwgdGhlIG5vdGljZXMgYW5kIHRoZSB2ZXJzaW9uLWNob2ljZSBkaWFsb2cuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29tcG9uZW50IHVzZWQgdG8gcmVwb3J0IHByb2JsZW1zIChwbHVnaW4gbm90IGluIHRoZSByZWdpc3RyeSwgbWlzc2luZyBhcmNoaXZlKS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGluc3RhbGxlZCBwbHVnaW4gdmVyc2lvbiwgb2ZmZXJlZCBhcyBvbmUgb2YgdGhlIHZlcnNpb24gY2hvaWNlcy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblZlcnNpb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIERvd25sb2FkQW5kRXh0cmFjdERlbW9WYXVsdFBhcmFtcyB7XG4gIHJlYWRvbmx5IGNhY2hlRGlyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5jb25zdCBERU1PX1ZBVUxUU19DQUNIRV9GT0xERVIgPSAnb2JzaWRpYW4tZGVtby12YXVsdHMnO1xuY29uc3QgSFRUUF9TVEFUVVNfT0sgPSAyMDA7XG5cbi8qKlxuICogRG93bmxvYWRzIGFuZCBvcGVucyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCBpbiBhIG5ldyBPYnNpZGlhbiB3aW5kb3cuIERlc2t0b3Agb25seS5cbiAqXG4gKiBJZiB0aGUgaW5zdGFsbGVkIHBsdWdpbiB2ZXJzaW9uIGlzIHRoZSBsYXRlc3QgKG9yIG5ld2VyKSwgaXRzIGRlbW8gdmF1bHQgb3BlbnMgZGlyZWN0bHk7IG90aGVyd2lzZVxuICogdGhlIHVzZXIgY2hvb3NlcyBiZXR3ZWVuIHRoZSBsYXRlc3QgYW5kIHRoZSBjdXJyZW50bHktaW5zdGFsbGVkIHZlcnNpb24uIFRoZSBjaG9zZW4gdmVyc2lvbidzXG4gKiBhcmNoaXZlIGlzIGRvd25sb2FkZWQgYW5kIGV4dHJhY3RlZCBvbmNlLCB0aGVuIHJldXNlZCBmcm9tIGEgcGVyLXZlcnNpb24gY2FjaGUgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIE9wZW5EZW1vVmF1bHRQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB2YXVsdCBoYXMgYmVlbiBvcGVuZWQsIG9yIG9uY2UgdGhlIG9wZXJhdGlvbiBoYXNcbiAqIGJlZW4gcmVwb3J0ZWQgYXMgbm90IHBvc3NpYmxlIChub3RpY2Ugc2hvd24pIG9yIGNhbmNlbGxlZCBieSB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5EZW1vVmF1bHQocGFyYW1zOiBPcGVuRGVtb1ZhdWx0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgcGx1Z2luSWQsXG4gICAgcGx1Z2luTmFtZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcGx1Z2luVmVyc2lvblxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHJlcG8gPSBhd2FpdCBnZXRDb21tdW5pdHlQbHVnaW5SZXBvKHBsdWdpbklkKTtcbiAgaWYgKCFyZXBvKSB7XG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UoYENvdWxkIG5vdCBmaW5kIHBsdWdpbiAke3BsdWdpbk5hbWV9IGluIHRoZSBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHBsdWdpblZlcnNpb247XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RSZWxlYXNlVmVyc2lvbihyZXBvKTtcblxuICBsZXQgdmVyc2lvblRvT3Blbjogc3RyaW5nO1xuICBpZiAoY29tcGFyZVZlcnNpb25zKGN1cnJlbnRWZXJzaW9uLCBsYXRlc3RWZXJzaW9uKSA+PSAwKSB7XG4gICAgdmVyc2lvblRvT3BlbiA9IGN1cnJlbnRWZXJzaW9uO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNob3NlblZlcnNpb24gPSBhd2FpdCBzZWxlY3RPcHRpb248bnVsbCB8IHN0cmluZz4oe1xuICAgICAgYXBwLFxuICAgICAgbWVzc2FnZTogYEN1cnJlbnQgdmVyc2lvbiBvZiBwbHVnaW4gJHtwbHVnaW5OYW1lfSB2JHtjdXJyZW50VmVyc2lvbn0gaXMgbm90IHRoZSBsYXRlc3QgKHYke2xhdGVzdFZlcnNpb259KWAsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpc0N0YTogdHJ1ZSxcbiAgICAgICAgICB0ZXh0OiBgT3BlbiBkZW1vIHZhdWx0IGZvciBsYXRlc3QgdmVyc2lvbiAodiR7bGF0ZXN0VmVyc2lvbn0pYCxcbiAgICAgICAgICB2YWx1ZTogbGF0ZXN0VmVyc2lvblxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogYE9wZW4gZGVtbyB2YXVsdCBmb3IgY3VycmVudCB2ZXJzaW9uICh2JHtjdXJyZW50VmVyc2lvbn0pYCxcbiAgICAgICAgICB2YWx1ZTogY3VycmVudFZlcnNpb25cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxuICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICB0aXRsZTogcGx1Z2luTmFtZVxuICAgIH0pO1xuICAgIGlmIChjaG9zZW5WZXJzaW9uID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZlcnNpb25Ub09wZW4gPSBjaG9zZW5WZXJzaW9uO1xuICB9XG5cbiAgY29uc3QgY2FjaGVEaXIgPSBqb2luKHRtcGRpcigpLCBERU1PX1ZBVUxUU19DQUNIRV9GT0xERVIsIHBsdWdpbklkLCB2ZXJzaW9uVG9PcGVuKTtcbiAgaWYgKCFleGlzdHNTeW5jKGNhY2hlRGlyKSkge1xuICAgIGNvbnN0IGlzRXh0cmFjdGVkID0gYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0RGVtb1ZhdWx0KHtcbiAgICAgIGNhY2hlRGlyLFxuICAgICAgcGx1Z2luSWQsXG4gICAgICBwbHVnaW5OYW1lLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVwbyxcbiAgICAgIHZlcnNpb246IHZlcnNpb25Ub09wZW5cbiAgICB9KTtcbiAgICBpZiAoIWlzRXh0cmFjdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2YXVsdC1vcGVuJywgY2FjaGVEaXIsIGZhbHNlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRBbmRFeHRyYWN0RGVtb1ZhdWx0KHBhcmFtczogRG93bmxvYWRBbmRFeHRyYWN0RGVtb1ZhdWx0UGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHtcbiAgICBjYWNoZURpcixcbiAgICBwbHVnaW5JZCxcbiAgICBwbHVnaW5OYW1lLFxuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICByZXBvLFxuICAgIHZlcnNpb25cbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBhc3NldFVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvfS9yZWxlYXNlcy9kb3dubG9hZC8ke3ZlcnNpb259LyR7cGx1Z2luSWR9LmRlbW8tdmF1bHQuemlwYDtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKHtcbiAgICB0aHJvdzogZmFsc2UsXG4gICAgdXJsOiBhc3NldFVybFxuICB9KTtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gSFRUUF9TVEFUVVNfT0spIHtcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShgTm8gZGVtbyB2YXVsdCBpcyBhdmFpbGFibGUgZm9yIHBsdWdpbiAke3BsdWdpbk5hbWV9IHYke3ZlcnNpb259LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGV4dHJhY3REZW1vVmF1bHRBcmNoaXZlKEJ1ZmZlci5mcm9tKHJlc3BvbnNlLmFycmF5QnVmZmVyKSwgY2FjaGVEaXIpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBhIGRvd25sb2FkZWQgZGVtby12YXVsdCBhcmNoaXZlIHRvIGRpc2suXG4gKlxuICogRWxlY3Ryb24ncyBhc2FyIGxheWVyIGludGVyY2VwdHMgYGZzYCBvcGVyYXRpb25zIG9uIGFueSBwYXRoIGNvbnRhaW5pbmcgYC5hc2FyYCBhbmQgdGhyb3dzIGBFTk9FTlRgXG4gKiB3aGVuIGBjaG1vZGAtaW5nIGFuIGAuYXNhcmAgZmlsZSAoaXQgdHJlYXRzIGl0IGFzIGFuIGFyY2hpdmUgcm9vdCByYXRoZXIgdGhhbiBhIHBsYWluIGZpbGUpLiBBIGRlbW9cbiAqIHZhdWx0IG1heSBzaGlwIHN1Y2ggYSBmaWxlIChlLmcuIGBfYXNzZXRzL0NvZGVTY3JpcHRUb29sa2l0L21vZHVsZS5hc2FyYCBkZW1vbnN0cmF0aW5nIHRoZSBBU0FSXG4gKiByZXF1aXJlIGZlYXR1cmUpLCBhbmQgYWRtLXppcCBgY2htb2RgcyBldmVyeSBleHRyYWN0ZWQgZmlsZSwgc28gZXh0cmFjdGlvbiB3b3VsZCBvdGhlcndpc2UgY3Jhc2guXG4gKiBIYW5kIGFkbS16aXAgRWxlY3Ryb24ncyBgb3JpZ2luYWwtZnNgIFx1MjAxNCB0aGUgcmVhbCBgZnNgIHdpdGggYXNhciBpbnRlcmNlcHRpb24gZGlzYWJsZWQgXHUyMDE0IHNvIHRoZVxuICogYC5hc2FyYCBmaWxlIGlzIHRyZWF0ZWQgYXMgYSBwbGFpbiBmaWxlIGFuZCBgY2htb2RgIHN1Y2NlZWRzLiBJdCBpcyBhIGRlc2t0b3Atb25seSBFbGVjdHJvbiBtb2R1bGVcbiAqIHdpdGggbm8gYnVuZGxlZCB0eXBlcywgc28gaXQgaXMgbG9hZGVkIHZpYSBgd2luZG93LnJlcXVpcmVgIGFuZCB0eXBlZCBhcyBgbm9kZTpmc2AncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gYXJjaGl2ZSAtIFRoZSByYXcgemlwIGFyY2hpdmUgYnl0ZXMuXG4gKiBAcGFyYW0gdGFyZ2V0RGlyIC0gVGhlIGRpcmVjdG9yeSB0byBleHRyYWN0IGludG8uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3REZW1vVmF1bHRBcmNoaXZlKGFyY2hpdmU6IEJ1ZmZlciwgdGFyZ2V0RGlyOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxGcyA9IHdpbmRvdy5yZXF1aXJlKCdub2RlOm9yaWdpbmFsLWZzJykgYXMgdHlwZW9mIGltcG9ydCgnbm9kZTpmcycpO1xuICBjb25zdCB6aXAgPSBuZXcgQWRtWmlwKGFyY2hpdmUsIHsgZnM6IG9yaWdpbmFsRnMgfSk7XG4gIHppcC5leHRyYWN0QWxsVG8odGFyZ2V0RGlyLCB0cnVlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFlQSxxQkFBbUI7QUFDbkIsOEJBQWdDO0FBRWhDLHlCQUF1QjtBQUV2QixxQkFBMkI7QUFFM0IscUJBQXVCO0FBQ3ZCLHNCQUEyQjtBQUkzQixrQkFBcUI7QUFDckIsK0JBR087QUFDUCwyQkFBNkI7QUEwQzdCLE1BQU0sMkJBQTJCO0FBQ2pDLE1BQU0saUJBQWlCO0FBYXZCLGVBQXNCLGNBQWMsUUFBNEM7QUFDOUUsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosUUFBTSxPQUFPLFVBQU0saURBQXVCLFFBQVE7QUFDbEQsTUFBSSxDQUFDLE1BQU07QUFDVCwwQkFBc0IsV0FBVyx5QkFBeUIsVUFBVSxxQ0FBcUM7QUFDekc7QUFBQSxFQUNGO0FBRUEsUUFBTSxpQkFBaUI7QUFDdkIsUUFBTSxnQkFBZ0IsVUFBTSxrREFBd0IsSUFBSTtBQUV4RCxNQUFJO0FBQ0osVUFBSSx5Q0FBZ0IsZ0JBQWdCLGFBQWEsS0FBSyxHQUFHO0FBQ3ZELG9CQUFnQjtBQUFBLEVBQ2xCLE9BQU87QUFDTCxVQUFNLGdCQUFnQixVQUFNLG1DQUE0QjtBQUFBLE1BQ3REO0FBQUEsTUFDQSxTQUFTLDZCQUE2QixVQUFVLEtBQUssY0FBYyx3QkFBd0IsYUFBYTtBQUFBLE1BQ3hHLFNBQVM7QUFBQSxRQUNQO0FBQUEsVUFDRSxPQUFPO0FBQUEsVUFDUCxNQUFNLHdDQUF3QyxhQUFhO0FBQUEsVUFDM0QsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNLHlDQUF5QyxjQUFjO0FBQUEsVUFDN0QsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixPQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE9BQU87QUFBQSxJQUNULENBQUM7QUFDRCxRQUFJLGtCQUFrQixNQUFNO0FBQzFCO0FBQUEsSUFDRjtBQUNBLG9CQUFnQjtBQUFBLEVBQ2xCO0FBRUEsUUFBTSxlQUFXLHNCQUFLLHVCQUFPLEdBQUcsMEJBQTBCLFVBQVUsYUFBYTtBQUNqRixNQUFJLEtBQUMsMkJBQVcsUUFBUSxHQUFHO0FBQ3pCLFVBQU0sY0FBYyxNQUFNLDRCQUE0QjtBQUFBLE1BQ3BEO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EsU0FBUztBQUFBLElBQ1gsQ0FBQztBQUNELFFBQUksQ0FBQyxhQUFhO0FBQ2hCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLFNBQVMsWUFBWSxTQUFTLGNBQWMsVUFBVSxLQUFLO0FBQ3BFO0FBRUEsZUFBZSw0QkFBNEIsUUFBNkQ7QUFDdEcsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLFFBQU0sV0FBVyxzQkFBc0IsSUFBSSxzQkFBc0IsT0FBTyxJQUFJLFFBQVE7QUFDcEYsUUFBTSxXQUFXLFVBQU0sNEJBQVc7QUFBQSxJQUNoQyxPQUFPO0FBQUEsSUFDUCxLQUFLO0FBQUEsRUFDUCxDQUFDO0FBQ0QsTUFBSSxTQUFTLFdBQVcsZ0JBQWdCO0FBQ3RDLDBCQUFzQixXQUFXLHlDQUF5QyxVQUFVLEtBQUssT0FBTyxHQUFHO0FBQ25HLFdBQU87QUFBQSxFQUNUO0FBRUEsMEJBQXdCLDBCQUFPLEtBQUssU0FBUyxXQUFXLEdBQUcsUUFBUTtBQUNuRSxTQUFPO0FBQ1Q7QUFnQkEsU0FBUyx3QkFBd0IsU0FBaUIsV0FBeUI7QUFDekUsUUFBTSxhQUFhLE9BQU8sUUFBUSxrQkFBa0I7QUFDcEQsUUFBTSxNQUFNLElBQUksZUFBQUEsUUFBTyxTQUFTLEVBQUUsSUFBSSxXQUFXLENBQUM7QUFDbEQsTUFBSSxhQUFhLFdBQVcsSUFBSTtBQUNsQzsiLAogICJuYW1lcyI6IFsiQWRtWmlwIl0KfQo=
340
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2Rlc2t0b3AtZGVtby12YXVsdC1vcGVuZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEb3dubG9hZHMgYW5kIG9wZW5zIGEgcGx1Z2luJ3Mgc2hpcHBlZCBkZW1vIHZhdWx0IGluIGEgbmV3IE9ic2lkaWFuIHdpbmRvdyAoZGVza3RvcCBvbmx5KS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gYXR0YWNoIGEgYDxwbHVnaW4taWQ+LWRlbW8tdmF1bHQtPHZlcnNpb24+LnppcGAgYXJjaGl2ZSB0byBlYWNoIEdpdEh1YiByZWxlYXNlIChzZWVcbiAqIGBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0YCBpbiBgc2NyaXB0LXV0aWxzL2RlbW8tdmF1bHQudHNgKS4gVGhpcyByZXNvbHZlcyB0aGUgcGx1Z2luJ3MgcmVwb3NpdG9yeVxuICogZnJvbSBPYnNpZGlhbidzIGNvbW11bml0eSByZWdpc3RyeSwgZG93bmxvYWRzIHRoZSBhcmNoaXZlIGZvciB0aGUgY2hvc2VuIHZlcnNpb24sIGFuZCBvcGVucyBpdCBhcyBhXG4gKiB2YXVsdCBpbiBhIG5ldyB3aW5kb3cuIFdoZW4gdGhlIGluc3RhbGxlZCBwbHVnaW4gdmVyc2lvbiBpcyBiZWhpbmQgdGhlIGxhdGVzdCByZWxlYXNlLCB0aGUgdXNlciBpc1xuICogb2ZmZXJlZCBhIGNob2ljZSBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMuXG4gKlxuICogQSBwcm9ncmVzcyBub3RpY2UgaXMgc2hvd24gaW1tZWRpYXRlbHkgKGRvd25sb2FkICsgZXh0cmFjdGlvbiBjYW4gdGFrZSBhIHdoaWxlLCBzbyB0aGUgdXNlciBtdXN0IHNlZVxuICogc29tZXRoaW5nIGlzIGhhcHBlbmluZyByaWdodCBhd2F5KS4gT25seSB0aGUgZG93bmxvYWRlZCBBUkNISVZFIGlzIGNhY2hlZCAodW5kZXIgdGhlIE9TIHRlbXBcbiAqIGRpcmVjdG9yeSk7IGV2ZXJ5IGludm9jYXRpb24gZXh0cmFjdHMgYSBGUkVTSCBjb3B5IGludG8gaXRzIG93biB0ZW1wb3JhcnkgZm9sZGVyIGFuZCBvcGVucyB0aGF0LCBzbyBhXG4gKiBwcmV2aW91cyBzZXNzaW9uJ3MgZWRpdHMgbmV2ZXIgbGVhayBpbnRvIGEgbmV3IG9uZS4gVGhlIGV4dHJhY3RlZCB2YXVsdCBmb2xkZXIgaXMgbmFtZWRcbiAqIGA8cGx1Z2luLWlkPi08dmVyc2lvbj4uZGVtby12YXVsdGAgc28gaXQgcmVhZHMgbmljZWx5IGluIE9ic2lkaWFuJ3MgdmF1bHQgc3dpdGNoZXIuIE9ycGhhbmVkXG4gKiBleHRyYWN0ZWQgZm9sZGVycyBsZWZ0IG92ZXIgZnJvbSBlYXJsaWVyIHNlc3Npb25zIGFyZSBjbGVhbmVkIHVwIChiZXN0LWVmZm9ydCkgb24gZWFjaCBvcGVuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgQWRtWmlwIGZyb20gJ2FkbS16aXAnO1xuaW1wb3J0IHsgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnY29tcGFyZS12ZXJzaW9ucyc7XG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQteC9uby1ub2RlanMtbW9kdWxlcyAtLSBEZXNrdG9wLW9ubHkgZmVhdHVyZSBnYXRlZCBieSBgUGxhdGZvcm0uaXNEZXNrdG9wQXBwYDsgdGhlIGNvbW1hbmQgaXMgaGlkZGVuIG9uIG1vYmlsZSBzbyB0aGVzZSBOb2RlIEFQSXMgYXJlIG5ldmVyIHJlYWNoZWQgdGhlcmUuICovXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcic7XG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICBybVN5bmMsXG4gIHN0YXRTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG4vKiBlc2xpbnQtZW5hYmxlIGltcG9ydC14L25vLW5vZGVqcy1tb2R1bGVzIC0tIERlc2t0b3Atb25seSBmZWF0dXJlIGdhdGVkIGJ5IGBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHBgOyB0aGUgY29tbWFuZCBpcyBoaWRkZW4gb24gbW9iaWxlIHNvIHRoZXNlIE5vZGUgQVBJcyBhcmUgbmV2ZXIgcmVhY2hlZCB0aGVyZS4gKi9cbmltcG9ydCB7IHJlcXVlc3RVcmwgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlXG59IGZyb20gJy4vY29tcG9uZW50cy9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGpvaW4gfSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIGdldENvbW11bml0eVBsdWdpblJlcG8sXG4gIGdldExhdGVzdFJlbGVhc2VWZXJzaW9uXG59IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbnMudHMnO1xuaW1wb3J0IHsgc2VsZWN0T3B0aW9uIH0gZnJvbSAnLi9tb2RhbHMvc2VsZWN0LW9wdGlvbi50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIG9wZW5EZW1vVmF1bHR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5EZW1vVmF1bHRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlkLCB1c2VkIHRvIGxvY2F0ZSB0aGUgR2l0SHViIHJlcG9zaXRvcnksIHRvIG5hbWUgdGhlIGFyY2hpdmUgYXNzZXQsIGFuZCB0byBuYW1lIHRoZVxuICAgKiBjYWNoZWQgYXJjaGl2ZSBhbmQgdGhlIGV4dHJhY3RlZCB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGRpc3BsYXkgbmFtZSwgdXNlZCB0byBsYWJlbCB0aGUgbm90aWNlcyBhbmQgdGhlIHZlcnNpb24tY2hvaWNlIGRpYWxvZy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MgYW5kIHByb2JsZW1zIChwbHVnaW4gbm90IGluIHRoZSByZWdpc3RyeSwgbWlzc2luZ1xuICAgKiBhcmNoaXZlKS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGluc3RhbGxlZCBwbHVnaW4gdmVyc2lvbiwgb2ZmZXJlZCBhcyBvbmUgb2YgdGhlIHZlcnNpb24gY2hvaWNlcy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblZlcnNpb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEV4dHJhY3REZW1vVmF1bHRUb0ZyZXNoRm9sZGVyUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXJjaGl2ZTogQnVmZmVyO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSZXNvbHZlRGVtb1ZhdWx0QXJjaGl2ZVBhcmFtcyB7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHByb2dyZXNzTm90aWNlOiBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlO1xuICByZWFkb25seSByZXBvOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuY29uc3QgREVNT19WQVVMVFNfQ0FDSEVfRk9MREVSID0gJ29ic2lkaWFuLWRlbW8tdmF1bHRzJztcbmNvbnN0IEFSQ0hJVkVTX1NVQkZPTERFUiA9ICdhcmNoaXZlcyc7XG5jb25zdCBFWFRSQUNURURfVkFVTFRTX1NVQkZPTERFUiA9ICdleHRyYWN0ZWQnO1xuY29uc3QgSFRUUF9TVEFUVVNfT0sgPSAyMDA7XG4vLyBPbmUgZGF5IGluIG1pbGxpc2Vjb25kcyAoMjQgKiA2MCAqIDYwICogMTAwMCkuXG5jb25zdCBPUlBIQU5FRF9FWFRSQUNURURfVkFVTFRfTUFYX0FHRV9JTl9NSUxMSVNFQ09ORFMgPSA4Nl80MDBfMDAwO1xuXG4vKipcbiAqIERvd25sb2FkcyBhbmQgb3BlbnMgdGhlIHBsdWdpbidzIGRlbW8gdmF1bHQgaW4gYSBuZXcgT2JzaWRpYW4gd2luZG93LiBEZXNrdG9wIG9ubHkuXG4gKlxuICogSWYgdGhlIGluc3RhbGxlZCBwbHVnaW4gdmVyc2lvbiBpcyB0aGUgbGF0ZXN0IChvciBuZXdlciksIGl0cyBkZW1vIHZhdWx0IG9wZW5zIGRpcmVjdGx5OyBvdGhlcndpc2VcbiAqIHRoZSB1c2VyIGNob29zZXMgYmV0d2VlbiB0aGUgbGF0ZXN0IGFuZCB0aGUgY3VycmVudGx5LWluc3RhbGxlZCB2ZXJzaW9uLiBBIHByb2dyZXNzIG5vdGljZSBpcyBzaG93blxuICogaW1tZWRpYXRlbHkuIFRoZSBjaG9zZW4gdmVyc2lvbidzIGFyY2hpdmUgaXMgZG93bmxvYWRlZCBvbmNlICh0aGVuIHJldXNlZCBmcm9tIHRoZSBhcmNoaXZlIGNhY2hlKSxcbiAqIGJ1dCBhIGZyZXNoIGNvcHkgaXMgZXh0cmFjdGVkIGludG8gaXRzIG93biB0ZW1wb3JhcnkgZm9sZGVyIG9uIGV2ZXJ5IG9wZW4gXHUyMDE0IHRoZSB2YXVsdCBpcyBuZXZlciByZXVzZWRcbiAqIGFjcm9zcyBzZXNzaW9ucy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBPcGVuRGVtb1ZhdWx0UGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgdmF1bHQgaGFzIGJlZW4gb3BlbmVkLCBvciBvbmNlIHRoZSBvcGVyYXRpb24gaGFzXG4gKiBiZWVuIHJlcG9ydGVkIGFzIG5vdCBwb3NzaWJsZSAobm90aWNlIHNob3duKSBvciBjYW5jZWxsZWQgYnkgdGhlIHVzZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuRGVtb1ZhdWx0KHBhcmFtczogT3BlbkRlbW9WYXVsdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHBsdWdpbklkLFxuICAgIHBsdWdpbk5hbWUsXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgIHBsdWdpblZlcnNpb25cbiAgfSA9IHBhcmFtcztcblxuICAvLyBTaG93biBpbW1lZGlhdGVseSAoYGRlbGF5SW5NaWxsaXNlY29uZHM6IDBgKTogcmVzb2x2aW5nIHRoZSByZWxlYXNlLCBkb3dubG9hZGluZyBhbmQgZXh0cmFjdGluZyBjYW5cbiAgLy8gRWFjaCB0YWtlIGEgd2hpbGUsIHNvIHRoZSB1c2VyIG11c3Qgc2VlIHByb2dyZXNzIHRoZSBtb21lbnQgdGhlIGNvbW1hbmQgaXMgaW52b2tlZC5cbiAgdXNpbmcgcHJvZ3Jlc3NOb3RpY2UgPSBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXkoe1xuICAgIGNvbnRlbnQ6IGBPcGVuaW5nIGRlbW8gdmF1bHQgZm9yICR7cGx1Z2luTmFtZX1cdTIwMjZgLFxuICAgIGRlbGF5SW5NaWxsaXNlY29uZHM6IDBcbiAgfSk7XG5cbiAgY29uc3QgcmVwbyA9IGF3YWl0IGdldENvbW11bml0eVBsdWdpblJlcG8ocGx1Z2luSWQpO1xuICBpZiAoIXJlcG8pIHtcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShgQ291bGQgbm90IGZpbmQgcGx1Z2luICR7cGx1Z2luTmFtZX0gaW4gdGhlIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gcGx1Z2luVmVyc2lvbjtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGF3YWl0IGdldExhdGVzdFJlbGVhc2VWZXJzaW9uKHJlcG8pO1xuXG4gIGxldCB2ZXJzaW9uVG9PcGVuOiBzdHJpbmc7XG4gIGlmIChjb21wYXJlVmVyc2lvbnMoY3VycmVudFZlcnNpb24sIGxhdGVzdFZlcnNpb24pID49IDApIHtcbiAgICB2ZXJzaW9uVG9PcGVuID0gY3VycmVudFZlcnNpb247XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgY2hvc2VuVmVyc2lvbiA9IGF3YWl0IHNlbGVjdE9wdGlvbjxudWxsIHwgc3RyaW5nPih7XG4gICAgICBhcHAsXG4gICAgICBtZXNzYWdlOiBgQ3VycmVudCB2ZXJzaW9uIG9mIHBsdWdpbiAke3BsdWdpbk5hbWV9IHYke2N1cnJlbnRWZXJzaW9ufSBpcyBub3QgdGhlIGxhdGVzdCAodiR7bGF0ZXN0VmVyc2lvbn0pYCxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlzQ3RhOiB0cnVlLFxuICAgICAgICAgIHRleHQ6IGBPcGVuIGRlbW8gdmF1bHQgZm9yIGxhdGVzdCB2ZXJzaW9uICh2JHtsYXRlc3RWZXJzaW9ufSlgLFxuICAgICAgICAgIHZhbHVlOiBsYXRlc3RWZXJzaW9uXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBgT3BlbiBkZW1vIHZhdWx0IGZvciBjdXJyZW50IHZlcnNpb24gKHYke2N1cnJlbnRWZXJzaW9ufSlgLFxuICAgICAgICAgIHZhbHVlOiBjdXJyZW50VmVyc2lvblxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogJ0NhbmNlbCcsXG4gICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHRpdGxlOiBwbHVnaW5OYW1lXG4gICAgfSk7XG4gICAgaWYgKGNob3NlblZlcnNpb24gPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmVyc2lvblRvT3BlbiA9IGNob3NlblZlcnNpb247XG4gIH1cblxuICBjb25zdCBhcmNoaXZlID0gYXdhaXQgcmVzb2x2ZURlbW9WYXVsdEFyY2hpdmUoe1xuICAgIHBsdWdpbklkLFxuICAgIHBsdWdpbk5hbWUsXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgIHByb2dyZXNzTm90aWNlLFxuICAgIHJlcG8sXG4gICAgdmVyc2lvbjogdmVyc2lvblRvT3BlblxuICB9KTtcbiAgaWYgKCFhcmNoaXZlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJvZ3Jlc3NOb3RpY2Uuc2V0Q29udGVudChgRXh0cmFjdGluZyBkZW1vIHZhdWx0IGZvciAke3BsdWdpbk5hbWV9IHYke3ZlcnNpb25Ub09wZW59XHUyMDI2YCk7XG4gIGNsZWFudXBPcnBoYW5lZEV4dHJhY3RlZFZhdWx0cygpO1xuICBjb25zdCB2YXVsdERpciA9IGV4dHJhY3REZW1vVmF1bHRUb0ZyZXNoRm9sZGVyKHtcbiAgICBhcmNoaXZlLFxuICAgIHBsdWdpbklkLFxuICAgIHZlcnNpb246IHZlcnNpb25Ub09wZW5cbiAgfSk7XG5cbiAgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2YXVsdC1vcGVuJywgdmF1bHREaXIsIGZhbHNlKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV4dHJhY3RlZCBkZW1vLXZhdWx0IGZvbGRlcnMgbGVmdCBvdmVyIGZyb20gZWFybGllciBzZXNzaW9ucyAoYmVzdC1lZmZvcnQpLlxuICpcbiAqIEV2ZXJ5IG9wZW4gZXh0cmFjdHMgYSBmcmVzaCBjb3B5IGludG8gaXRzIG93biBmb2xkZXIgYW5kIG5ldmVyIGRlbGV0ZXMgaXQgYWZ0ZXJ3YXJkcyAodGhlIHZhdWx0IHN0YXlzXG4gKiBvcGVuIGluIGl0cyB3aW5kb3cpLCBzbyB0aGVzZSBhY2N1bXVsYXRlLiBUaGlzIGRyb3BzIGZvbGRlcnMgb2xkZXIgdGhhblxuICoge0BsaW5rIE9SUEhBTkVEX0VYVFJBQ1RFRF9WQVVMVF9NQVhfQUdFX0lOX01JTExJU0VDT05EU30uIEEgZm9sZGVyIHdob3NlIHZhdWx0IGlzIHN0aWxsIG9wZW4gaW4gYW5vdGhlclxuICogd2luZG93IGlzIGxvY2tlZCBvbiBXaW5kb3dzIGFuZCBjYW5ub3QgYmUgcmVtb3ZlZCBcdTIwMTQgdGhlIHJlbW92YWwgaXMgd3JhcHBlZCBzbyBzdWNoIGEgZm9sZGVyIGlzIHNpbXBseVxuICogc2tpcHBlZCBhbmQgcmV0cmllZCBvbiBhIGxhdGVyIG9wZW4uXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBPcnBoYW5lZEV4dHJhY3RlZFZhdWx0cygpOiB2b2lkIHtcbiAgY29uc3QgZXh0cmFjdGVkVmF1bHRzUm9vdCA9IGpvaW4odG1wZGlyKCksIERFTU9fVkFVTFRTX0NBQ0hFX0ZPTERFUiwgRVhUUkFDVEVEX1ZBVUxUU19TVUJGT0xERVIpO1xuICBpZiAoIWV4aXN0c1N5bmMoZXh0cmFjdGVkVmF1bHRzUm9vdCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBmb3IgKGNvbnN0IGVudHJ5TmFtZSBvZiByZWFkZGlyU3luYyhleHRyYWN0ZWRWYXVsdHNSb290KSkge1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IGpvaW4oZXh0cmFjdGVkVmF1bHRzUm9vdCwgZW50cnlOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHMgPSBzdGF0U3luYyhlbnRyeVBhdGgpO1xuICAgICAgaWYgKG5vdyAtIHN0YXRzLm10aW1lTXMgPCBPUlBIQU5FRF9FWFRSQUNURURfVkFVTFRfTUFYX0FHRV9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBybVN5bmMoZW50cnlQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCZXN0LWVmZm9ydCBjbGVhbnVwOiBhbiBvcnBoYW4gd2hvc2UgdmF1bHQgaXMgc3RpbGwgb3BlbiAobG9ja2VkIG9uIFdpbmRvd3MpIGNhbm5vdCBiZSByZW1vdmVkOyBza2lwIGl0IGFuZCByZXRyeSBvbiBhIGxhdGVyIG9wZW4uXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBkb3dubG9hZGVkIGRlbW8tdmF1bHQgYXJjaGl2ZSB0byBkaXNrLlxuICpcbiAqIEVsZWN0cm9uJ3MgYXNhciBsYXllciBpbnRlcmNlcHRzIGBmc2Agb3BlcmF0aW9ucyBvbiBhbnkgcGF0aCBjb250YWluaW5nIGAuYXNhcmAgYW5kIHRocm93cyBgRU5PRU5UYFxuICogd2hlbiBgY2htb2RgLWluZyBhbiBgLmFzYXJgIGZpbGUgKGl0IHRyZWF0cyBpdCBhcyBhbiBhcmNoaXZlIHJvb3QgcmF0aGVyIHRoYW4gYSBwbGFpbiBmaWxlKS4gQSBkZW1vXG4gKiB2YXVsdCBtYXkgc2hpcCBzdWNoIGEgZmlsZSAoZS5nLiBgX2Fzc2V0cy9Db2RlU2NyaXB0VG9vbGtpdC9tb2R1bGUuYXNhcmAgZGVtb25zdHJhdGluZyB0aGUgQVNBUlxuICogcmVxdWlyZSBmZWF0dXJlKSwgYW5kIGFkbS16aXAgYGNobW9kYHMgZXZlcnkgZXh0cmFjdGVkIGZpbGUsIHNvIGV4dHJhY3Rpb24gd291bGQgb3RoZXJ3aXNlIGNyYXNoLlxuICogSGFuZCBhZG0temlwIEVsZWN0cm9uJ3MgYG9yaWdpbmFsLWZzYCBcdTIwMTQgdGhlIHJlYWwgYGZzYCB3aXRoIGFzYXIgaW50ZXJjZXB0aW9uIGRpc2FibGVkIFx1MjAxNCBzbyB0aGVcbiAqIGAuYXNhcmAgZmlsZSBpcyB0cmVhdGVkIGFzIGEgcGxhaW4gZmlsZSBhbmQgYGNobW9kYCBzdWNjZWVkcy4gSXQgaXMgYSBkZXNrdG9wLW9ubHkgRWxlY3Ryb24gbW9kdWxlXG4gKiB3aXRoIG5vIGJ1bmRsZWQgdHlwZXMsIHNvIGl0IGlzIGxvYWRlZCB2aWEgYHdpbmRvdy5yZXF1aXJlYCBhbmQgdHlwZWQgYXMgYG5vZGU6ZnNgJ3Mgc2hhcGUuXG4gKlxuICogQHBhcmFtIGFyY2hpdmUgLSBUaGUgcmF3IHppcCBhcmNoaXZlIGJ5dGVzLlxuICogQHBhcmFtIHRhcmdldERpciAtIFRoZSBkaXJlY3RvcnkgdG8gZXh0cmFjdCBpbnRvLlxuICovXG5mdW5jdGlvbiBleHRyYWN0RGVtb1ZhdWx0QXJjaGl2ZShhcmNoaXZlOiBCdWZmZXIsIHRhcmdldERpcjogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG9yaWdpbmFsRnMgPSB3aW5kb3cucmVxdWlyZSgnbm9kZTpvcmlnaW5hbC1mcycpIGFzIHR5cGVvZiBpbXBvcnQoJ25vZGU6ZnMnKTtcbiAgY29uc3QgemlwID0gbmV3IEFkbVppcChhcmNoaXZlLCB7IGZzOiBvcmlnaW5hbEZzIH0pO1xuICB6aXAuZXh0cmFjdEFsbFRvKHRhcmdldERpciwgdHJ1ZSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGFyY2hpdmUgaW50byBhIGZyZXNoLCB1bmlxdWVseS1uYW1lZCB0ZW1wb3JhcnkgZm9sZGVyIGFuZCByZXR1cm5zIHRoZSB2YXVsdCBwYXRoLlxuICpcbiAqIEEgdW5pcXVlIHBhcmVudCBmb2xkZXIgKGBta2R0ZW1wU3luY2ApIGd1YXJhbnRlZXMgYSBicmFuZC1uZXcgZXh0cmFjdGlvbiBldmVyeSB0aW1lIFx1MjAxNCB0aGUgZGVtbyB2YXVsdFxuICogaXMgbmV2ZXIgcmV1c2VkIGFjcm9zcyBvcGVucywgc28gYSBwcmV2aW91cyBzZXNzaW9uJ3MgZWRpdHMgbmV2ZXIgbGVhayBpbi4gSW5zaWRlIGl0LCB0aGUgdmF1bHQgZm9sZGVyXG4gKiBpcyBuYW1lZCBgPHBsdWdpbi1pZD4tPHZlcnNpb24+LmRlbW8tdmF1bHRgIHNvIE9ic2lkaWFuJ3MgdmF1bHQgc3dpdGNoZXIgc2hvd3MgYSBmcmllbmRseSBuYW1lIChpdHNcbiAqIGJhc2VuYW1lKSByYXRoZXIgdGhhbiB0aGUgcmFuZG9tIHRlbXAgaWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgRXh0cmFjdERlbW9WYXVsdFRvRnJlc2hGb2xkZXJQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZyZXNobHkgZXh0cmFjdGVkIHZhdWx0IGZvbGRlci5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdERlbW9WYXVsdFRvRnJlc2hGb2xkZXIocGFyYW1zOiBFeHRyYWN0RGVtb1ZhdWx0VG9GcmVzaEZvbGRlclBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXJjaGl2ZSwgcGx1Z2luSWQsIHZlcnNpb24gfSA9IHBhcmFtcztcbiAgY29uc3QgZXh0cmFjdGVkVmF1bHRzUm9vdCA9IGpvaW4odG1wZGlyKCksIERFTU9fVkFVTFRTX0NBQ0hFX0ZPTERFUiwgRVhUUkFDVEVEX1ZBVUxUU19TVUJGT0xERVIpO1xuICBta2RpclN5bmMoZXh0cmFjdGVkVmF1bHRzUm9vdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IHVuaXF1ZVBhcmVudERpciA9IG1rZHRlbXBTeW5jKGpvaW4oZXh0cmFjdGVkVmF1bHRzUm9vdCwgYCR7cGx1Z2luSWR9LSR7dmVyc2lvbn0tYCkpO1xuICBjb25zdCB2YXVsdERpciA9IGpvaW4odW5pcXVlUGFyZW50RGlyLCBgJHtwbHVnaW5JZH0tJHt2ZXJzaW9ufS5kZW1vLXZhdWx0YCk7XG4gIGV4dHJhY3REZW1vVmF1bHRBcmNoaXZlKGFyY2hpdmUsIHZhdWx0RGlyKTtcbiAgcmV0dXJuIHZhdWx0RGlyO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkZW1vLXZhdWx0IGFyY2hpdmUgYnl0ZXMgZm9yIGEgdmVyc2lvbiwgZG93bmxvYWRpbmcgYW5kIGNhY2hpbmcgdGhlbSBvbiBmaXJzdCB1c2UuXG4gKlxuICogT25seSB0aGUgYXJjaGl2ZSBpcyBjYWNoZWQgKGtleWVkIGJ5IHBsdWdpbiBpZCArIHZlcnNpb24pOyB0aGUgZXh0cmFjdGVkIHZhdWx0IGlzIG5vdC4gQSBjYWNoZSBoaXQgaXNcbiAqIHJldHVybmVkIHdpdGhvdXQgYW55IG5ldHdvcmsgcmVxdWVzdDsgYSBtaXNzIGRvd25sb2FkcyB0aGUgcmVsZWFzZSBhc3NldCwgd3JpdGVzIGl0IHRvIHRoZSBhcmNoaXZlXG4gKiBjYWNoZSwgYW5kIHJldHVybnMgdGhlIGZyZXNobHkgZG93bmxvYWRlZCBieXRlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBSZXNvbHZlRGVtb1ZhdWx0QXJjaGl2ZVBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIGFyY2hpdmUgYnl0ZXMsIG9yIGBudWxsYCB3aGVuIG5vIGFyY2hpdmUgaXMgYXZhaWxhYmxlIGZvclxuICogdGhlIHZlcnNpb24gKGEgbm90aWNlIGhhcyBiZWVuIHNob3duKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURlbW9WYXVsdEFyY2hpdmUocGFyYW1zOiBSZXNvbHZlRGVtb1ZhdWx0QXJjaGl2ZVBhcmFtcyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICBjb25zdCB7XG4gICAgcGx1Z2luSWQsXG4gICAgcGx1Z2luTmFtZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcHJvZ3Jlc3NOb3RpY2UsXG4gICAgcmVwbyxcbiAgICB2ZXJzaW9uXG4gIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgYXJjaGl2ZXNEaXIgPSBqb2luKHRtcGRpcigpLCBERU1PX1ZBVUxUU19DQUNIRV9GT0xERVIsIEFSQ0hJVkVTX1NVQkZPTERFUik7XG4gIGNvbnN0IGFyY2hpdmVQYXRoID0gam9pbihhcmNoaXZlc0RpciwgYCR7cGx1Z2luSWR9LSR7dmVyc2lvbn0uemlwYCk7XG4gIGlmIChleGlzdHNTeW5jKGFyY2hpdmVQYXRoKSkge1xuICAgIHJldHVybiByZWFkRmlsZVN5bmMoYXJjaGl2ZVBhdGgpO1xuICB9XG5cbiAgcHJvZ3Jlc3NOb3RpY2Uuc2V0Q29udGVudChgRG93bmxvYWRpbmcgZGVtbyB2YXVsdCBmb3IgJHtwbHVnaW5OYW1lfSB2JHt2ZXJzaW9ufVx1MjAyNmApO1xuICBjb25zdCBhc3NldFVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvfS9yZWxlYXNlcy9kb3dubG9hZC8ke3ZlcnNpb259LyR7cGx1Z2luSWR9LWRlbW8tdmF1bHQtJHt2ZXJzaW9ufS56aXBgO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoe1xuICAgIHRocm93OiBmYWxzZSxcbiAgICB1cmw6IGFzc2V0VXJsXG4gIH0pO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSBIVFRQX1NUQVRVU19PSykge1xuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKGBObyBkZW1vIHZhdWx0IGlzIGF2YWlsYWJsZSBmb3IgcGx1Z2luICR7cGx1Z2luTmFtZX0gdiR7dmVyc2lvbn0uYCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBhcmNoaXZlID0gQnVmZmVyLmZyb20ocmVzcG9uc2UuYXJyYXlCdWZmZXIpO1xuICBta2RpclN5bmMoYXJjaGl2ZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKGFyY2hpdmVQYXRoLCBhcmNoaXZlKTtcbiAgcmV0dXJuIGFyY2hpdmU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBcUJBLHFCQUFtQjtBQUNuQiw4QkFBZ0M7QUFFaEMseUJBQXVCO0FBQ3ZCLHFCQVNPO0FBQ1AscUJBQXVCO0FBRXZCLHNCQUEyQjtBQU8zQixrQkFBcUI7QUFDckIsK0JBR087QUFDUCwyQkFBNkI7QUFpRDdCLE1BQU0sMkJBQTJCO0FBQ2pDLE1BQU0scUJBQXFCO0FBQzNCLE1BQU0sNkJBQTZCO0FBQ25DLE1BQU0saUJBQWlCO0FBRXZCLE1BQU0sbURBQW1EO0FBZXpELGVBQXNCLGNBQWMsUUFBNEM7QUFXOUU7QUFBQTtBQVZBLFVBQU07QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsSUFBSTtBQUlKLFVBQU0saUJBQWlCLHNDQUFzQixxQkFBcUI7QUFBQSxNQUNoRSxTQUFTLDBCQUEwQixVQUFVO0FBQUEsTUFDN0MscUJBQXFCO0FBQUEsSUFDdkIsQ0FBQztBQUVELFVBQU0sT0FBTyxVQUFNLGlEQUF1QixRQUFRO0FBQ2xELFFBQUksQ0FBQyxNQUFNO0FBQ1QsNEJBQXNCLFdBQVcseUJBQXlCLFVBQVUscUNBQXFDO0FBQ3pHO0FBQUEsSUFDRjtBQUVBLFVBQU0saUJBQWlCO0FBQ3ZCLFVBQU0sZ0JBQWdCLFVBQU0sa0RBQXdCLElBQUk7QUFFeEQsUUFBSTtBQUNKLFlBQUkseUNBQWdCLGdCQUFnQixhQUFhLEtBQUssR0FBRztBQUN2RCxzQkFBZ0I7QUFBQSxJQUNsQixPQUFPO0FBQ0wsWUFBTSxnQkFBZ0IsVUFBTSxtQ0FBNEI7QUFBQSxRQUN0RDtBQUFBLFFBQ0EsU0FBUyw2QkFBNkIsVUFBVSxLQUFLLGNBQWMsd0JBQXdCLGFBQWE7QUFBQSxRQUN4RyxTQUFTO0FBQUEsVUFDUDtBQUFBLFlBQ0UsT0FBTztBQUFBLFlBQ1AsTUFBTSx3Q0FBd0MsYUFBYTtBQUFBLFlBQzNELE9BQU87QUFBQSxVQUNUO0FBQUEsVUFDQTtBQUFBLFlBQ0UsTUFBTSx5Q0FBeUMsY0FBYztBQUFBLFlBQzdELE9BQU87QUFBQSxVQUNUO0FBQUEsVUFDQTtBQUFBLFlBQ0UsTUFBTTtBQUFBLFlBQ04sT0FBTztBQUFBLFVBQ1Q7QUFBQSxRQUNGO0FBQUEsUUFDQSxPQUFPO0FBQUEsTUFDVCxDQUFDO0FBQ0QsVUFBSSxrQkFBa0IsTUFBTTtBQUMxQjtBQUFBLE1BQ0Y7QUFDQSxzQkFBZ0I7QUFBQSxJQUNsQjtBQUVBLFVBQU0sVUFBVSxNQUFNLHdCQUF3QjtBQUFBLE1BQzVDO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EsU0FBUztBQUFBLElBQ1gsQ0FBQztBQUNELFFBQUksQ0FBQyxTQUFTO0FBQ1o7QUFBQSxJQUNGO0FBRUEsbUJBQWUsV0FBVyw2QkFBNkIsVUFBVSxLQUFLLGFBQWEsUUFBRztBQUN0RixtQ0FBK0I7QUFDL0IsVUFBTSxXQUFXLDhCQUE4QjtBQUFBLE1BQzdDO0FBQUEsTUFDQTtBQUFBLE1BQ0EsU0FBUztBQUFBLElBQ1gsQ0FBQztBQUVELFdBQU8sU0FBUyxZQUFZLFNBQVMsY0FBYyxVQUFVLEtBQUs7QUFBQSxXQWhFbEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlFRjtBQVdBLFNBQVMsaUNBQXVDO0FBQzlDLFFBQU0sMEJBQXNCLHNCQUFLLHVCQUFPLEdBQUcsMEJBQTBCLDBCQUEwQjtBQUMvRixNQUFJLEtBQUMsMkJBQVcsbUJBQW1CLEdBQUc7QUFDcEM7QUFBQSxFQUNGO0FBRUEsUUFBTSxNQUFNLEtBQUssSUFBSTtBQUNyQixhQUFXLGlCQUFhLDRCQUFZLG1CQUFtQixHQUFHO0FBQ3hELFVBQU0sZ0JBQVksa0JBQUsscUJBQXFCLFNBQVM7QUFDckQsUUFBSTtBQUNGLFlBQU0sWUFBUSx5QkFBUyxTQUFTO0FBQ2hDLFVBQUksTUFBTSxNQUFNLFVBQVUsa0RBQWtEO0FBQzFFO0FBQUEsTUFDRjtBQUNBLGlDQUFPLFdBQVcsRUFBRSxPQUFPLE1BQU0sV0FBVyxLQUFLLENBQUM7QUFBQSxJQUNwRCxRQUFRO0FBQUEsSUFFUjtBQUFBLEVBQ0Y7QUFDRjtBQWdCQSxTQUFTLHdCQUF3QixTQUFpQixXQUF5QjtBQUN6RSxRQUFNLGFBQWEsT0FBTyxRQUFRLGtCQUFrQjtBQUNwRCxRQUFNLE1BQU0sSUFBSSxlQUFBQSxRQUFPLFNBQVMsRUFBRSxJQUFJLFdBQVcsQ0FBQztBQUNsRCxNQUFJLGFBQWEsV0FBVyxJQUFJO0FBQ2xDO0FBYUEsU0FBUyw4QkFBOEIsUUFBcUQ7QUFDMUYsUUFBTSxFQUFFLFNBQVMsVUFBVSxRQUFRLElBQUk7QUFDdkMsUUFBTSwwQkFBc0Isc0JBQUssdUJBQU8sR0FBRywwQkFBMEIsMEJBQTBCO0FBQy9GLGdDQUFVLHFCQUFxQixFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ2xELFFBQU0sc0JBQWtCLGdDQUFZLGtCQUFLLHFCQUFxQixHQUFHLFFBQVEsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUN4RixRQUFNLGVBQVcsa0JBQUssaUJBQWlCLEdBQUcsUUFBUSxJQUFJLE9BQU8sYUFBYTtBQUMxRSwwQkFBd0IsU0FBUyxRQUFRO0FBQ3pDLFNBQU87QUFDVDtBQWFBLGVBQWUsd0JBQXdCLFFBQStEO0FBQ3BHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixRQUFNLGtCQUFjLHNCQUFLLHVCQUFPLEdBQUcsMEJBQTBCLGtCQUFrQjtBQUMvRSxRQUFNLGtCQUFjLGtCQUFLLGFBQWEsR0FBRyxRQUFRLElBQUksT0FBTyxNQUFNO0FBQ2xFLFVBQUksMkJBQVcsV0FBVyxHQUFHO0FBQzNCLGVBQU8sNkJBQWEsV0FBVztBQUFBLEVBQ2pDO0FBRUEsaUJBQWUsV0FBVyw4QkFBOEIsVUFBVSxLQUFLLE9BQU8sUUFBRztBQUNqRixRQUFNLFdBQVcsc0JBQXNCLElBQUksc0JBQXNCLE9BQU8sSUFBSSxRQUFRLGVBQWUsT0FBTztBQUMxRyxRQUFNLFdBQVcsVUFBTSw0QkFBVztBQUFBLElBQ2hDLE9BQU87QUFBQSxJQUNQLEtBQUs7QUFBQSxFQUNQLENBQUM7QUFDRCxNQUFJLFNBQVMsV0FBVyxnQkFBZ0I7QUFDdEMsMEJBQXNCLFdBQVcseUNBQXlDLFVBQVUsS0FBSyxPQUFPLEdBQUc7QUFDbkcsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFVBQVUsMEJBQU8sS0FBSyxTQUFTLFdBQVc7QUFDaEQsZ0NBQVUsYUFBYSxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQzFDLG9DQUFjLGFBQWEsT0FBTztBQUNsQyxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbIkFkbVppcCJdCn0K
@@ -4,12 +4,18 @@
4
4
  *
5
5
  * Downloads and opens a plugin's shipped demo vault in a new Obsidian window (desktop only).
6
6
  *
7
- * A plugin can attach a `<plugin-id>.demo-vault.zip` archive to each GitHub release (see
7
+ * A plugin can attach a `<plugin-id>-demo-vault-<version>.zip` archive to each GitHub release (see
8
8
  * `archivePluginDemoVault` in `script-utils/demo-vault.ts`). This resolves the plugin's repository
9
- * from Obsidian's community registry, downloads the archive for the chosen version, extracts it to a
10
- * per-version cache folder under the OS temp directory, and opens that folder as a vault in a new
11
- * window. When the installed plugin version is behind the latest release, the user is offered a choice
12
- * between the two versions.
9
+ * from Obsidian's community registry, downloads the archive for the chosen version, and opens it as a
10
+ * vault in a new window. When the installed plugin version is behind the latest release, the user is
11
+ * offered a choice between the two versions.
12
+ *
13
+ * A progress notice is shown immediately (download + extraction can take a while, so the user must see
14
+ * something is happening right away). Only the downloaded ARCHIVE is cached (under the OS temp
15
+ * directory); every invocation extracts a FRESH copy into its own temporary folder and opens that, so a
16
+ * previous session's edits never leak into a new one. The extracted vault folder is named
17
+ * `<plugin-id>-<version>.demo-vault` so it reads nicely in Obsidian's vault switcher. Orphaned
18
+ * extracted folders left over from earlier sessions are cleaned up (best-effort) on each open.
13
19
  */
14
20
  import type { App } from 'obsidian' with { 'resolution-mode': 'import' };
15
21
  import type { PluginNoticeComponent } from './components/plugin-notice-component.cjs';
@@ -22,8 +28,8 @@ export interface OpenDemoVaultParams {
22
28
  */
23
29
  readonly app: App;
24
30
  /**
25
- * The plugin id, used to locate the GitHub repository and the per-version cache folder, and to name
26
- * the archive asset.
31
+ * The plugin id, used to locate the GitHub repository, to name the archive asset, and to name the
32
+ * cached archive and the extracted vault folder.
27
33
  */
28
34
  readonly pluginId: string;
29
35
  /**
@@ -31,7 +37,8 @@ export interface OpenDemoVaultParams {
31
37
  */
32
38
  readonly pluginName: string;
33
39
  /**
34
- * The notice component used to report problems (plugin not in the registry, missing archive).
40
+ * The notice component used to report progress and problems (plugin not in the registry, missing
41
+ * archive).
35
42
  */
36
43
  readonly pluginNoticeComponent: PluginNoticeComponent;
37
44
  /**
@@ -43,8 +50,10 @@ export interface OpenDemoVaultParams {
43
50
  * Downloads and opens the plugin's demo vault in a new Obsidian window. Desktop only.
44
51
  *
45
52
  * If the installed plugin version is the latest (or newer), its demo vault opens directly; otherwise
46
- * the user chooses between the latest and the currently-installed version. The chosen version's
47
- * archive is downloaded and extracted once, then reused from a per-version cache folder.
53
+ * the user chooses between the latest and the currently-installed version. A progress notice is shown
54
+ * immediately. The chosen version's archive is downloaded once (then reused from the archive cache),
55
+ * but a fresh copy is extracted into its own temporary folder on every open — the vault is never reused
56
+ * across sessions.
48
57
  *
49
58
  * @param params - The {@link OpenDemoVaultParams}.
50
59
  * @returns A {@link Promise} that resolves once the vault has been opened, or once the operation has
@@ -179,7 +179,7 @@ async function archivePluginDemoVault() {
179
179
  await (0, import_promises.cp)(distBuildPath, pluginFolder, { recursive: true });
180
180
  await injectDemoVaultHelper();
181
181
  const zipPath = (0, import_root.resolvePathFromRootSafe)({
182
- path: (0, import_path.join)(import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.DistBuild, `${manifest.id}.demo-vault.zip`)
182
+ path: (0, import_path.join)(import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.DistBuild, `${manifest.id}-demo-vault-${manifest.version}.zip`)
183
183
  });
184
184
  const zip = new import_adm_zip.default();
185
185
  zip.addLocalFolder(demoVaultPath);
@@ -207,4 +207,4 @@ async function injectDemoVaultHelper() {
207
207
  0 && (module.exports = {
208
208
  archivePluginDemoVault
209
209
  });
210
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ2YXIgX19pbXBvcnRfbWV0YV91cmwgPSBnbG9iYWxUaGlzWydpbXBvcnQubWV0YS51cmwnXSA/PyAoKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBsb2NhbFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICBjb25zdCB1cmwgPSBsb2NhbFJlcXVpcmUoJ25vZGU6dXJsJyk7XG4gICAgICAgIGlmICh0eXBlb2YgdXJsLnBhdGhUb0ZpbGVVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gdXJsLnBhdGhUb0ZpbGVVUkwoX19maWxlbmFtZSkuaHJlZjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGFjdGl2ZVdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjayB0byBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGVudmlyb25tZW50IGlzIHVua25vd25cbiAgICAgIHJldHVybiAnJztcbiAgICB9KSgpO1xuLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFyY2hpdmVzIGEgcGx1Z2luJ3MgZGVtbyB2YXVsdCBhcyBhIHJlbGVhc2UgYXJ0aWZhY3QuXG4gKlxuICogQSBwbHVnaW4gY2FuIHNoaXAgYSBjdXJhdGVkIGRlbW8gdmF1bHQgYXQgYGRlbW8tdmF1bHQvYCBpbiBpdHMgcmVwbyByb290LiBBdCByZWxlYXNlIHRpbWUgdGhpc1xuICogbW9kdWxlIGluc3RhbGxzIHRoZSBmcmVzaGx5IGJ1aWx0IHBsdWdpbiBpbnRvIHRoYXQgdmF1bHQncyBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPi9gIGZvbGRlciBhbmRcbiAqIHppcHMgdGhlIHdob2xlIHZhdWx0IGludG8gYGRpc3QvYnVpbGQvPHBsdWdpbi1pZD4uZGVtby12YXVsdC56aXBgLCBzbyB0aGUgZXhpc3RpbmcgR2l0SHViLXJlbGVhc2VcbiAqIHN0ZXAgKHdoaWNoIHVwbG9hZHMgZXZlcnkgZmlsZSBpbiBgZGlzdC9idWlsZC9gKSBhdHRhY2hlcyBpdCBhdXRvbWF0aWNhbGx5LiBUaGUgYXJjaGl2ZSBpcyBuYW1lZCBieVxuICogcGx1Z2luIGlkIChub3QganVzdCBgZGVtby12YXVsdGApIHNvIHNldmVyYWwgcGx1Z2lucycgZGVtbyB2YXVsdHMgbmV2ZXIgY29sbGlkZS5cbiAqL1xuXG5pbXBvcnQgQWRtWmlwIGZyb20gJ2FkbS16aXAnO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgY3AsXG4gIG1rZGlyLFxuICByZWFkRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi9wbHVnaW4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0Rm9sZGVyTmFtZSxcbiAgam9pblxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIGdldFJvb3RGb2xkZXIsXG4gIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlXG59IGZyb20gJy4vcm9vdC50cyc7XG5cbmNvbnN0IERFTU9fVkFVTFRfSEVMUEVSX1BMVUdJTl9JRCA9ICdkZW1vLXZhdWx0LWhlbHBlcic7XG5cbi8qKlxuICogVGhlIG1pbmltYWwgc2hhcGUgb2YgYSBwbHVnaW4gYG1hbmlmZXN0Lmpzb25gIHJlYWQgYnkge0BsaW5rIGFyY2hpdmVQbHVnaW5EZW1vVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTWFuaWZlc3Qge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBpZCwgdXNlZCBhcyB0aGUgZm9sZGVyIG5hbWUgdW5kZXIgYGRlbW8tdmF1bHQvLm9ic2lkaWFuL3BsdWdpbnMvYC5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXJjaGl2ZXMgdGhlIHBsdWdpbidzIGRlbW8gdmF1bHQgKGBkZW1vLXZhdWx0L2AgaW4gdGhlIHJlcG8gcm9vdCkgYXMgYSByZWxlYXNlIGFydGlmYWN0LlxuICpcbiAqIEluc3RhbGxzIHRoZSBmcmVzaGx5IGJ1aWx0IHBsdWdpbiBmcm9tIGBkaXN0L2J1aWxkL2AgaW50byB0aGUgdmF1bHQnc1xuICogYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYCBmb2xkZXIsIHRoZW4gemlwcyB0aGUgd2hvbGUgdmF1bHQgdG9cbiAqIGBkaXN0L2J1aWxkLzxwbHVnaW4taWQ+LmRlbW8tdmF1bHQuemlwYC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBjcmVhdGVkIHppcCBhcmNoaXZlLCBvclxuICogYG51bGxgIGlmIHRoZSByZXBvIGhhcyBubyBgZGVtby12YXVsdC9gIGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFyY2hpdmVQbHVnaW5EZW1vVmF1bHQoKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIGNvbnN0IGRlbW9WYXVsdFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCB9KTtcbiAgaWYgKCFleGlzdHNTeW5jKGRlbW9WYXVsdFBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtYW5pZmVzdFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbiB9KTtcbiAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuXG4gIGNvbnN0IHBsdWdpbkZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5QbHVnaW5zLFxuICAgICAgbWFuaWZlc3QuaWRcbiAgICApXG4gIH0pO1xuICBhd2FpdCBta2RpcihwbHVnaW5Gb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGRpc3RCdWlsZFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCB9KTtcbiAgYXdhaXQgY3AoZGlzdEJ1aWxkUGF0aCwgcGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBhd2FpdCBpbmplY3REZW1vVmF1bHRIZWxwZXIoKTtcblxuICAvLyBBcmNoaXZlIG5hbWUgaXMgaGFuZC1zeW5jZWQgd2l0aCB0aGUgcnVudGltZSBgb3BlbkRlbW9WYXVsdGAgb3BlbmVyLCB3aGljaCBkb3dubG9hZHMgdGhpcyBleGFjdCBhc3NldCBuYW1lLlxuICBjb25zdCB6aXBQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkLCBgJHttYW5pZmVzdC5pZH0uZGVtby12YXVsdC56aXBgKVxuICB9KTtcbiAgY29uc3QgemlwID0gbmV3IEFkbVppcCgpO1xuICB6aXAuYWRkTG9jYWxGb2xkZXIoZGVtb1ZhdWx0UGF0aCk7XG4gIGF3YWl0IHppcC53cml0ZVppcFByb21pc2UoemlwUGF0aCk7XG4gIHJldHVybiB6aXBQYXRoO1xufVxuXG4vLyBJbmplY3RzIHRoZSBidWlsdCwgYG9ic2lkaWFuLWRldi11dGlsc2Atb3duZWQgYGRlbW8tdmF1bHQtaGVscGVyYCBib290c3RyYXAgcGx1Z2luIChzaGlwcGVkIGluIHRoaXMgcGFja2FnZSkgaW50byB0aGUgZGVtbyB2YXVsdCwgc28gbm8gcGVyLXZhdWx0IGNvcHkgaXMgY29tbWl0dGVkIGFuZCBhbiBgb2JzaWRpYW4tZGV2LXV0aWxzYCBidW1wIHByb3BhZ2F0ZXMgZml4ZXMuXG5hc3luYyBmdW5jdGlvbiBpbmplY3REZW1vVmF1bHRIZWxwZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VGb2xkZXIgPSBnZXRSb290Rm9sZGVyKGdldEZvbGRlck5hbWUoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIGlmICghcGFja2FnZUZvbGRlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHJlc29sdmUgdGhlIG9ic2lkaWFuLWRldi11dGlscyBwYWNrYWdlIGZvbGRlciB0byBpbmplY3QgdGhlIGRlbW8tdmF1bHQtaGVscGVyIHBsdWdpbi4nKTtcbiAgfVxuXG4gIGNvbnN0IGhlbHBlclNvdXJjZVBhdGggPSBqb2luKHBhY2thZ2VGb2xkZXIsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdERlbW9WYXVsdEhlbHBlcik7XG4gIGNvbnN0IGhlbHBlckZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5QbHVnaW5zLFxuICAgICAgREVNT19WQVVMVF9IRUxQRVJfUExVR0lOX0lEXG4gICAgKVxuICB9KTtcbiAgYXdhaXQgbWtkaXIoaGVscGVyRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY3AoaGVscGVyU291cmNlUGF0aCwgaGVscGVyRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE0QkEscUJBQW1CO0FBQ25CLHFCQUEyQjtBQUMzQixzQkFJTztBQUVQLHdDQUF3QztBQUN4QyxrQkFHTztBQUNQLDJDQUEwQztBQUMxQyxrQkFHTztBQTdDUCxJQUFJLG9CQUFvQixXQUFXLGlCQUFpQixNQUFNLE1BQU07QUFDMUQsTUFBSSxPQUFPLGVBQWUsVUFBVTtBQUNsQyxVQUFNLGVBQWU7QUFDckIsVUFBTSxNQUFNLGFBQWEsVUFBVTtBQUNuQyxRQUFJLE9BQU8sSUFBSSxrQkFBa0IsWUFBWTtBQUMzQyxhQUFPLElBQUksY0FBYyxVQUFVLEVBQUU7QUFBQSxJQUN2QztBQUFBLEVBQ0Y7QUFFQSxNQUFJLE9BQU8sV0FBVyxhQUFhO0FBQ2pDLFdBQU8sYUFBYSxTQUFTO0FBQUEsRUFDL0I7QUFHQSxTQUFPO0FBQ1QsR0FBRztBQWdDUCxNQUFNLDhCQUE4QjtBQXNCcEMsZUFBc0IseUJBQWlEO0FBQ3JFLFFBQU0sb0JBQWdCLHFDQUF3QixFQUFFLE1BQU0sMERBQXdCLFVBQVUsQ0FBQztBQUN6RixNQUFJLEtBQUMsMkJBQVcsYUFBYSxHQUFHO0FBQzlCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxtQkFBZSxxQ0FBd0IsRUFBRSxNQUFNLDBEQUF3QixhQUFhLENBQUM7QUFDM0YsUUFBTSxXQUFXLEtBQUssTUFBTSxVQUFNLDBCQUFTLGNBQWMsT0FBTyxDQUFDO0FBRWpFLFFBQU0sbUJBQWUscUNBQXdCO0FBQUEsSUFDM0MsVUFBTTtBQUFBLE1BQ0osMERBQXdCO0FBQUEsTUFDeEIsMERBQXdCO0FBQUEsTUFDeEIsMERBQXdCO0FBQUEsTUFDeEIsU0FBUztBQUFBLElBQ1g7QUFBQSxFQUNGLENBQUM7QUFDRCxZQUFNLHVCQUFNLGNBQWMsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUU3QyxRQUFNLG9CQUFnQixxQ0FBd0IsRUFBRSxNQUFNLDBEQUF3QixVQUFVLENBQUM7QUFDekYsWUFBTSxvQkFBRyxlQUFlLGNBQWMsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUV6RCxRQUFNLHNCQUFzQjtBQUc1QixRQUFNLGNBQVUscUNBQXdCO0FBQUEsSUFDdEMsVUFBTSxrQkFBSywwREFBd0IsV0FBVyxHQUFHLFNBQVMsRUFBRSxpQkFBaUI7QUFBQSxFQUMvRSxDQUFDO0FBQ0QsUUFBTSxNQUFNLElBQUksZUFBQUEsUUFBTztBQUN2QixNQUFJLGVBQWUsYUFBYTtBQUNoQyxRQUFNLElBQUksZ0JBQWdCLE9BQU87QUFDakMsU0FBTztBQUNUO0FBR0EsZUFBZSx3QkFBdUM7QUFDcEQsUUFBTSxvQkFBZ0IsK0JBQWMsMkJBQWMsaUJBQWUsQ0FBQztBQUNsRSxNQUFJLENBQUMsZUFBZTtBQUNsQixVQUFNLElBQUksTUFBTSxpR0FBaUc7QUFBQSxFQUNuSDtBQUVBLFFBQU0sdUJBQW1CLGtCQUFLLGVBQWUsK0RBQTBCLG1CQUFtQjtBQUMxRixRQUFNLG1CQUFlLHFDQUF3QjtBQUFBLElBQzNDLFVBQU07QUFBQSxNQUNKLDBEQUF3QjtBQUFBLE1BQ3hCLDBEQUF3QjtBQUFBLE1BQ3hCLDBEQUF3QjtBQUFBLE1BQ3hCO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUNELFlBQU0sdUJBQU0sY0FBYyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQzdDLFlBQU0sb0JBQUcsa0JBQWtCLGNBQWMsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUM5RDsiLAogICJuYW1lcyI6IFsiQWRtWmlwIl0KfQo=
210
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ2YXIgX19pbXBvcnRfbWV0YV91cmwgPSBnbG9iYWxUaGlzWydpbXBvcnQubWV0YS51cmwnXSA/PyAoKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBsb2NhbFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICBjb25zdCB1cmwgPSBsb2NhbFJlcXVpcmUoJ25vZGU6dXJsJyk7XG4gICAgICAgIGlmICh0eXBlb2YgdXJsLnBhdGhUb0ZpbGVVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gdXJsLnBhdGhUb0ZpbGVVUkwoX19maWxlbmFtZSkuaHJlZjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGFjdGl2ZVdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjayB0byBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGVudmlyb25tZW50IGlzIHVua25vd25cbiAgICAgIHJldHVybiAnJztcbiAgICB9KSgpO1xuLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFyY2hpdmVzIGEgcGx1Z2luJ3MgZGVtbyB2YXVsdCBhcyBhIHJlbGVhc2UgYXJ0aWZhY3QuXG4gKlxuICogQSBwbHVnaW4gY2FuIHNoaXAgYSBjdXJhdGVkIGRlbW8gdmF1bHQgYXQgYGRlbW8tdmF1bHQvYCBpbiBpdHMgcmVwbyByb290LiBBdCByZWxlYXNlIHRpbWUgdGhpc1xuICogbW9kdWxlIGluc3RhbGxzIHRoZSBmcmVzaGx5IGJ1aWx0IHBsdWdpbiBpbnRvIHRoYXQgdmF1bHQncyBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPi9gIGZvbGRlciBhbmRcbiAqIHppcHMgdGhlIHdob2xlIHZhdWx0IGludG8gYGRpc3QvYnVpbGQvPHBsdWdpbi1pZD4tZGVtby12YXVsdC08dmVyc2lvbj4uemlwYCwgc28gdGhlIGV4aXN0aW5nXG4gKiBHaXRIdWItcmVsZWFzZSBzdGVwICh3aGljaCB1cGxvYWRzIGV2ZXJ5IGZpbGUgaW4gYGRpc3QvYnVpbGQvYCkgYXR0YWNoZXMgaXQgYXV0b21hdGljYWxseS4gVGhlXG4gKiBhcmNoaXZlIG5hbWUgY2FycmllcyB0aGUgcGx1Z2luIGlkIChzbyBzZXZlcmFsIHBsdWdpbnMnIGRlbW8gdmF1bHRzIG5ldmVyIGNvbGxpZGUpIGFuZCB0aGUgdmVyc2lvblxuICogKHNvIGVhY2ggcmVsZWFzZSBzaGlwcyBpdHMgb3duIGRpc3RpbmN0bHkgbmFtZWQgYXJ0aWZhY3QpLlxuICovXG5cbmltcG9ydCBBZG1aaXAgZnJvbSAnYWRtLXppcCc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gJy4uL29ic2lkaWFuL3BsdWdpbi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBnZXRGb2xkZXJOYW1lLFxuICBqb2luXG59IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocyB9IGZyb20gJy4vb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0Um9vdEZvbGRlcixcbiAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmVcbn0gZnJvbSAnLi9yb290LnRzJztcblxuY29uc3QgREVNT19WQVVMVF9IRUxQRVJfUExVR0lOX0lEID0gJ2RlbW8tdmF1bHQtaGVscGVyJztcblxuLyoqXG4gKiBUaGUgbWluaW1hbCBzaGFwZSBvZiBhIHBsdWdpbiBgbWFuaWZlc3QuanNvbmAgcmVhZCBieSB7QGxpbmsgYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdH0uXG4gKi9cbmludGVyZmFjZSBQbHVnaW5NYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlkLCB1c2VkIGFzIHRoZSBmb2xkZXIgbmFtZSB1bmRlciBgZGVtby12YXVsdC8ub2JzaWRpYW4vcGx1Z2lucy9gLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiB2ZXJzaW9uLCBlbWJlZGRlZCBpbiB0aGUgYXJjaGl2ZSBmaWxlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXJjaGl2ZXMgdGhlIHBsdWdpbidzIGRlbW8gdmF1bHQgKGBkZW1vLXZhdWx0L2AgaW4gdGhlIHJlcG8gcm9vdCkgYXMgYSByZWxlYXNlIGFydGlmYWN0LlxuICpcbiAqIEluc3RhbGxzIHRoZSBmcmVzaGx5IGJ1aWx0IHBsdWdpbiBmcm9tIGBkaXN0L2J1aWxkL2AgaW50byB0aGUgdmF1bHQnc1xuICogYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYCBmb2xkZXIsIHRoZW4gemlwcyB0aGUgd2hvbGUgdmF1bHQgdG9cbiAqIGBkaXN0L2J1aWxkLzxwbHVnaW4taWQ+LWRlbW8tdmF1bHQtPHZlcnNpb24+LnppcGAuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgY3JlYXRlZCB6aXAgYXJjaGl2ZSwgb3JcbiAqIGBudWxsYCBpZiB0aGUgcmVwbyBoYXMgbm8gYGRlbW8tdmF1bHQvYCBmb2xkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0KCk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBjb25zdCBkZW1vVmF1bHRQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQgfSk7XG4gIGlmICghZXhpc3RzU3luYyhkZW1vVmF1bHRQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSk7XG4gIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShtYW5pZmVzdFBhdGgsICd1dGYtOCcpKSBhcyBQbHVnaW5NYW5pZmVzdDtcblxuICBjb25zdCBwbHVnaW5Gb2xkZXIgPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7XG4gICAgcGF0aDogam9pbihcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCxcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRvdE9ic2lkaWFuLFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuUGx1Z2lucyxcbiAgICAgIG1hbmlmZXN0LmlkXG4gICAgKVxuICB9KTtcbiAgYXdhaXQgbWtkaXIocGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBkaXN0QnVpbGRQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQgfSk7XG4gIGF3YWl0IGNwKGRpc3RCdWlsZFBhdGgsIHBsdWdpbkZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgYXdhaXQgaW5qZWN0RGVtb1ZhdWx0SGVscGVyKCk7XG5cbiAgLy8gQXJjaGl2ZSBuYW1lIGlzIGhhbmQtc3luY2VkIHdpdGggdGhlIHJ1bnRpbWUgYG9wZW5EZW1vVmF1bHRgIG9wZW5lciwgd2hpY2ggZG93bmxvYWRzIHRoaXMgZXhhY3QgYXNzZXQgbmFtZS5cbiAgY29uc3QgemlwUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCwgYCR7bWFuaWZlc3QuaWR9LWRlbW8tdmF1bHQtJHttYW5pZmVzdC52ZXJzaW9ufS56aXBgKVxuICB9KTtcbiAgY29uc3QgemlwID0gbmV3IEFkbVppcCgpO1xuICB6aXAuYWRkTG9jYWxGb2xkZXIoZGVtb1ZhdWx0UGF0aCk7XG4gIGF3YWl0IHppcC53cml0ZVppcFByb21pc2UoemlwUGF0aCk7XG4gIHJldHVybiB6aXBQYXRoO1xufVxuXG4vLyBJbmplY3RzIHRoZSBidWlsdCwgYG9ic2lkaWFuLWRldi11dGlsc2Atb3duZWQgYGRlbW8tdmF1bHQtaGVscGVyYCBib290c3RyYXAgcGx1Z2luIChzaGlwcGVkIGluIHRoaXMgcGFja2FnZSkgaW50byB0aGUgZGVtbyB2YXVsdCwgc28gbm8gcGVyLXZhdWx0IGNvcHkgaXMgY29tbWl0dGVkIGFuZCBhbiBgb2JzaWRpYW4tZGV2LXV0aWxzYCBidW1wIHByb3BhZ2F0ZXMgZml4ZXMuXG5hc3luYyBmdW5jdGlvbiBpbmplY3REZW1vVmF1bHRIZWxwZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VGb2xkZXIgPSBnZXRSb290Rm9sZGVyKGdldEZvbGRlck5hbWUoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIGlmICghcGFja2FnZUZvbGRlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHJlc29sdmUgdGhlIG9ic2lkaWFuLWRldi11dGlscyBwYWNrYWdlIGZvbGRlciB0byBpbmplY3QgdGhlIGRlbW8tdmF1bHQtaGVscGVyIHBsdWdpbi4nKTtcbiAgfVxuXG4gIGNvbnN0IGhlbHBlclNvdXJjZVBhdGggPSBqb2luKHBhY2thZ2VGb2xkZXIsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdERlbW9WYXVsdEhlbHBlcik7XG4gIGNvbnN0IGhlbHBlckZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5QbHVnaW5zLFxuICAgICAgREVNT19WQVVMVF9IRUxQRVJfUExVR0lOX0lEXG4gICAgKVxuICB9KTtcbiAgYXdhaXQgbWtkaXIoaGVscGVyRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY3AoaGVscGVyU291cmNlUGF0aCwgaGVscGVyRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE2QkEscUJBQW1CO0FBQ25CLHFCQUEyQjtBQUMzQixzQkFJTztBQUVQLHdDQUF3QztBQUN4QyxrQkFHTztBQUNQLDJDQUEwQztBQUMxQyxrQkFHTztBQTlDUCxJQUFJLG9CQUFvQixXQUFXLGlCQUFpQixNQUFNLE1BQU07QUFDMUQsTUFBSSxPQUFPLGVBQWUsVUFBVTtBQUNsQyxVQUFNLGVBQWU7QUFDckIsVUFBTSxNQUFNLGFBQWEsVUFBVTtBQUNuQyxRQUFJLE9BQU8sSUFBSSxrQkFBa0IsWUFBWTtBQUMzQyxhQUFPLElBQUksY0FBYyxVQUFVLEVBQUU7QUFBQSxJQUN2QztBQUFBLEVBQ0Y7QUFFQSxNQUFJLE9BQU8sV0FBVyxhQUFhO0FBQ2pDLFdBQU8sYUFBYSxTQUFTO0FBQUEsRUFDL0I7QUFHQSxTQUFPO0FBQ1QsR0FBRztBQWlDUCxNQUFNLDhCQUE4QjtBQTJCcEMsZUFBc0IseUJBQWlEO0FBQ3JFLFFBQU0sb0JBQWdCLHFDQUF3QixFQUFFLE1BQU0sMERBQXdCLFVBQVUsQ0FBQztBQUN6RixNQUFJLEtBQUMsMkJBQVcsYUFBYSxHQUFHO0FBQzlCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxtQkFBZSxxQ0FBd0IsRUFBRSxNQUFNLDBEQUF3QixhQUFhLENBQUM7QUFDM0YsUUFBTSxXQUFXLEtBQUssTUFBTSxVQUFNLDBCQUFTLGNBQWMsT0FBTyxDQUFDO0FBRWpFLFFBQU0sbUJBQWUscUNBQXdCO0FBQUEsSUFDM0MsVUFBTTtBQUFBLE1BQ0osMERBQXdCO0FBQUEsTUFDeEIsMERBQXdCO0FBQUEsTUFDeEIsMERBQXdCO0FBQUEsTUFDeEIsU0FBUztBQUFBLElBQ1g7QUFBQSxFQUNGLENBQUM7QUFDRCxZQUFNLHVCQUFNLGNBQWMsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUU3QyxRQUFNLG9CQUFnQixxQ0FBd0IsRUFBRSxNQUFNLDBEQUF3QixVQUFVLENBQUM7QUFDekYsWUFBTSxvQkFBRyxlQUFlLGNBQWMsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUV6RCxRQUFNLHNCQUFzQjtBQUc1QixRQUFNLGNBQVUscUNBQXdCO0FBQUEsSUFDdEMsVUFBTSxrQkFBSywwREFBd0IsV0FBVyxHQUFHLFNBQVMsRUFBRSxlQUFlLFNBQVMsT0FBTyxNQUFNO0FBQUEsRUFDbkcsQ0FBQztBQUNELFFBQU0sTUFBTSxJQUFJLGVBQUFBLFFBQU87QUFDdkIsTUFBSSxlQUFlLGFBQWE7QUFDaEMsUUFBTSxJQUFJLGdCQUFnQixPQUFPO0FBQ2pDLFNBQU87QUFDVDtBQUdBLGVBQWUsd0JBQXVDO0FBQ3BELFFBQU0sb0JBQWdCLCtCQUFjLDJCQUFjLGlCQUFlLENBQUM7QUFDbEUsTUFBSSxDQUFDLGVBQWU7QUFDbEIsVUFBTSxJQUFJLE1BQU0saUdBQWlHO0FBQUEsRUFDbkg7QUFFQSxRQUFNLHVCQUFtQixrQkFBSyxlQUFlLCtEQUEwQixtQkFBbUI7QUFDMUYsUUFBTSxtQkFBZSxxQ0FBd0I7QUFBQSxJQUMzQyxVQUFNO0FBQUEsTUFDSiwwREFBd0I7QUFBQSxNQUN4QiwwREFBd0I7QUFBQSxNQUN4QiwwREFBd0I7QUFBQSxNQUN4QjtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFDRCxZQUFNLHVCQUFNLGNBQWMsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUM3QyxZQUFNLG9CQUFHLGtCQUFrQixjQUFjLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDOUQ7IiwKICAibmFtZXMiOiBbIkFkbVppcCJdCn0K
@@ -6,16 +6,17 @@
6
6
  *
7
7
  * A plugin can ship a curated demo vault at `demo-vault/` in its repo root. At release time this
8
8
  * module installs the freshly built plugin into that vault's `.obsidian/plugins/<id>/` folder and
9
- * zips the whole vault into `dist/build/<plugin-id>.demo-vault.zip`, so the existing GitHub-release
10
- * step (which uploads every file in `dist/build/`) attaches it automatically. The archive is named by
11
- * plugin id (not just `demo-vault`) so several plugins' demo vaults never collide.
9
+ * zips the whole vault into `dist/build/<plugin-id>-demo-vault-<version>.zip`, so the existing
10
+ * GitHub-release step (which uploads every file in `dist/build/`) attaches it automatically. The
11
+ * archive name carries the plugin id (so several plugins' demo vaults never collide) and the version
12
+ * (so each release ships its own distinctly named artifact).
12
13
  */
13
14
  /**
14
15
  * Archives the plugin's demo vault (`demo-vault/` in the repo root) as a release artifact.
15
16
  *
16
17
  * Installs the freshly built plugin from `dist/build/` into the vault's
17
18
  * `.obsidian/plugins/<id>/` folder, then zips the whole vault to
18
- * `dist/build/<plugin-id>.demo-vault.zip`.
19
+ * `dist/build/<plugin-id>-demo-vault-<version>.zip`.
19
20
  *
20
21
  * @returns A {@link Promise} that resolves to the absolute path of the created zip archive, or
21
22
  * `null` if the repo has no `demo-vault/` folder.
@@ -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 = "87.1.2";
24
+ const LIBRARY_VERSION = "87.3.0";
25
25
  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@keyframes obsidian-dev-utils-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-dev-utils-lock-indicator-flash {\n animation: obsidian-dev-utils-lock-indicator-flash 0.35s ease-in-out;\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@keyframes obsidian-dev-utils-minimized-modal-bar-attention {\n 0% {\n box-shadow: 0 0 0 0 var(--interactive-accent);\n }\n 40% {\n box-shadow: 0 0 0 4px var(--interactive-accent);\n }\n 100% {\n box-shadow: var(--shadow-s);\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: calc(var(--size-4-4) + var(--size-4-8));\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 cursor: pointer;\n animation: obsidian-dev-utils-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-dev-utils.minimized-modal-bar:hover {\n background-image: linear-gradient(var(--background-modifier-hover), var(--background-modifier-hover));\n}\n.obsidian-dev-utils.minimized-modal-bar.minimized-modal-bar-attention {\n animation: obsidian-dev-utils-minimized-modal-bar-attention 0.35s ease-out;\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.obsidian-dev-utils.minimized-modal-bar .cancel-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.obsidian-dev-utils.minimized-modal-bar .cancel-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-notice-name {\n color: var(--text-accent);\n display: inline-block;\n font-weight: var(--font-bold);\n margin-bottom: var(--size-4-2);\n}\n.obsidian-dev-utils.plugin-notice-content {\n padding-right: var(--size-4-5);\n position: relative;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.cancel-button {\n display: block;\n margin-top: var(--size-4-2);\n width: fit-content;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.plugin-notice-close-button {\n position: absolute;\n right: var(--size-4-3);\n top: var(--size-4-3);\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice {\n padding: 0;\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice .obsidian-dev-utils.plugin-notice-content {\n padding: var(--size-4-3) var(--size-4-4);\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-notice.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;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;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;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOA;EACE;;AAOF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;;;ACxGJ;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACTN;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAOJ;EACE;;AAEA;EACE;;;AChCF;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%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-dev-utils-lock-indicator-flash%200.35s%20ease-in-out;%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@keyframes%20obsidian-dev-utils-minimized-modal-bar-attention%20%7B%5Cn%20%200%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%200%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%204px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%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//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%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:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%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%20cursor:%20pointer;%5Cn%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20//%20Layer%20the%20translucent%20hover%20tint%20over%20the%20opaque%20%60background%60%20(%60--background-secondary%60)%20via%5Cn%20%20%20%20//%20%60background-image%60%20instead%20of%20replacing%20the%20background-color.%20%60--background-modifier-hover%60%20is%5Cn%20%20%20%20//%20translucent,%20so%20setting%20it%20as%20%60background%60%20would%20let%20the%20editor%20content%20behind%20the%20floating%20bar%5Cn%20%20%20%20//%20bleed%20through%20and%20make%20the%20title%20unreadable.%20A%20gradient%20of%20the%20tint%20composited%20over%20the%20opaque%5Cn%20%20%20%20//%20base%20keeps%20the%20bar%20opaque%20while%20preserving%20the%20subtle%20hover%20highlight.%5Cn%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20background-image:%20linear-gradient(var(--background-modifier-hover),%20var(--background-modifier-hover));%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20one-shot,%20more%20pronounced%20flash%20played%20when%20the%20user%20attempts%20a%20blocked%20action%20(a%20keystroke,%5Cn%20%20%20%20//%20right-click,%20or%20opening%20another%20modal)%20while%20this%20modal%20is%20minimized,%20so%20the%20block%20is%20not%5Cn%20%20%20%20//%20silent.%20Its%20higher%20specificity%20overrides%20the%20gentle%20infinite%20idle%20pulse%20while%20it%20plays;%20the%5Cn%20%20%20%20//%20class%20is%20removed%20on%20%60animationend%60,%20restoring%20the%20idle%20pulse.%5Cn%20%20%20%20&.minimized-modal-bar-attention%20%7B%5Cn%20%20%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-attention%200.35s%20ease-out;%5Cn%20%20%20%20%7D%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,%5Cn%20%20%20%20.cancel-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-notice-name%20%7B%5Cn%20%20%20%20color:%20var(--text-accent);%5Cn%20%20%20%20display:%20inline-block;%5Cn%20%20%20%20font-weight:%20var(--font-bold);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-2);%5Cn%20%20%7D%5Cn%5Cn%20%20&.plugin-notice-content%20%7B%5Cn%20%20%20%20padding-right:%20var(--size-4-5);%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20The%20close%20button%20reuses%20Obsidian's%20%60modal-header-button%60%20+%20%60clickable-icon%60%20classes%20so%20it%20matches%5Cn%20%20%20%20//%20The%20native%20modal%20close%20button%20(box%20+%20hover);%20only%20its%20corner%20position%20is%20set%20here.%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-close-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20right:%20var(--size-4-3);%5Cn%20%20%20%20%20%20top:%20var(--size-4-3);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20Move%20the%20notice's%20own%20padding%20onto%20the%20content%20wrapper%20so%20the%20wrapper%20covers%20the%20whole%20clickable%5Cn%20%20//%20Area%20%E2%80%94%20otherwise%20a%20click%20landing%20on%20the%20notice's%20bare%20padding%20(outside%20the%20wrapper)%20would%20bypass%20the%5Cn%20%20//%20Stop-propagation%20guard%20and%20dismiss%20the%20hard-to-close%20notice.%5Cn%20%20&.plugin-notice-requires-explicit-close.notice%20%7B%5Cn%20%20%20%20padding:%200;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-content%20%7B%5Cn%20%20%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%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";
26
26
  export {
27
27
  LIBRARY_STYLES,
@@ -4,12 +4,18 @@
4
4
  *
5
5
  * Downloads and opens a plugin's shipped demo vault in a new Obsidian window (desktop only).
6
6
  *
7
- * A plugin can attach a `<plugin-id>.demo-vault.zip` archive to each GitHub release (see
7
+ * A plugin can attach a `<plugin-id>-demo-vault-<version>.zip` archive to each GitHub release (see
8
8
  * `archivePluginDemoVault` in `script-utils/demo-vault.ts`). This resolves the plugin's repository
9
- * from Obsidian's community registry, downloads the archive for the chosen version, extracts it to a
10
- * per-version cache folder under the OS temp directory, and opens that folder as a vault in a new
11
- * window. When the installed plugin version is behind the latest release, the user is offered a choice
12
- * between the two versions.
9
+ * from Obsidian's community registry, downloads the archive for the chosen version, and opens it as a
10
+ * vault in a new window. When the installed plugin version is behind the latest release, the user is
11
+ * offered a choice between the two versions.
12
+ *
13
+ * A progress notice is shown immediately (download + extraction can take a while, so the user must see
14
+ * something is happening right away). Only the downloaded ARCHIVE is cached (under the OS temp
15
+ * directory); every invocation extracts a FRESH copy into its own temporary folder and opens that, so a
16
+ * previous session's edits never leak into a new one. The extracted vault folder is named
17
+ * `<plugin-id>-<version>.demo-vault` so it reads nicely in Obsidian's vault switcher. Orphaned
18
+ * extracted folders left over from earlier sessions are cleaned up (best-effort) on each open.
13
19
  */
14
20
  import type { App } from 'obsidian';
15
21
  import type { PluginNoticeComponent } from './components/plugin-notice-component.mjs';
@@ -22,8 +28,8 @@ export interface OpenDemoVaultParams {
22
28
  */
23
29
  readonly app: App;
24
30
  /**
25
- * The plugin id, used to locate the GitHub repository and the per-version cache folder, and to name
26
- * the archive asset.
31
+ * The plugin id, used to locate the GitHub repository, to name the archive asset, and to name the
32
+ * cached archive and the extracted vault folder.
27
33
  */
28
34
  readonly pluginId: string;
29
35
  /**
@@ -31,7 +37,8 @@ export interface OpenDemoVaultParams {
31
37
  */
32
38
  readonly pluginName: string;
33
39
  /**
34
- * The notice component used to report problems (plugin not in the registry, missing archive).
40
+ * The notice component used to report progress and problems (plugin not in the registry, missing
41
+ * archive).
35
42
  */
36
43
  readonly pluginNoticeComponent: PluginNoticeComponent;
37
44
  /**
@@ -43,8 +50,10 @@ export interface OpenDemoVaultParams {
43
50
  * Downloads and opens the plugin's demo vault in a new Obsidian window. Desktop only.
44
51
  *
45
52
  * If the installed plugin version is the latest (or newer), its demo vault opens directly; otherwise
46
- * the user chooses between the latest and the currently-installed version. The chosen version's
47
- * archive is downloaded and extracted once, then reused from a per-version cache folder.
53
+ * the user chooses between the latest and the currently-installed version. A progress notice is shown
54
+ * immediately. The chosen version's archive is downloaded once (then reused from the archive cache),
55
+ * but a fresh copy is extracted into its own temporary folder on every open — the vault is never reused
56
+ * across sessions.
48
57
  *
49
58
  * @param params - The {@link OpenDemoVaultParams}.
50
59
  * @returns A {@link Promise} that resolves once the vault has been opened, or once the operation has
@@ -21,10 +21,64 @@ 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
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
25
+ var __typeError = (msg) => {
26
+ throw TypeError(msg);
27
+ };
28
+ var __using = (stack, value, async) => {
29
+ if (value != null) {
30
+ if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
31
+ var dispose, inner;
32
+ if (async) dispose = value[__knownSymbol("asyncDispose")];
33
+ if (dispose === void 0) {
34
+ dispose = value[__knownSymbol("dispose")];
35
+ if (async) inner = dispose;
36
+ }
37
+ if (typeof dispose !== "function") __typeError("Object not disposable");
38
+ if (inner) dispose = function() {
39
+ try {
40
+ inner.call(this);
41
+ } catch (e) {
42
+ return Promise.reject(e);
43
+ }
44
+ };
45
+ stack.push([async, dispose, value]);
46
+ } else if (async) {
47
+ stack.push([async]);
48
+ }
49
+ return value;
50
+ };
51
+ var __callDispose = (stack, error, hasError) => {
52
+ var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
53
+ return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
54
+ };
55
+ var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
56
+ var next = (it) => {
57
+ while (it = stack.pop()) {
58
+ try {
59
+ var result = it[1] && it[1].call(it[2]);
60
+ if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
61
+ } catch (e) {
62
+ fail(e);
63
+ }
64
+ }
65
+ if (hasError) throw error;
66
+ };
67
+ return next();
68
+ };
24
69
  import AdmZip from "adm-zip";
25
70
  import { compareVersions } from "compare-versions";
26
- import { Buffer } from "node:buffer";
27
- import { existsSync } from "node:fs";
71
+ import { Buffer as Buffer2 } from "node:buffer";
72
+ import {
73
+ existsSync,
74
+ mkdirSync,
75
+ mkdtempSync,
76
+ readdirSync,
77
+ readFileSync,
78
+ rmSync,
79
+ statSync,
80
+ writeFileSync
81
+ } from "node:fs";
28
82
  import { tmpdir } from "node:os";
29
83
  import { requestUrl } from "obsidian";
30
84
  import { join } from "../path.mjs";
@@ -34,94 +88,147 @@ import {
34
88
  } from "./community-plugins.mjs";
35
89
  import { selectOption } from "./modals/select-option.mjs";
36
90
  const DEMO_VAULTS_CACHE_FOLDER = "obsidian-demo-vaults";
91
+ const ARCHIVES_SUBFOLDER = "archives";
92
+ const EXTRACTED_VAULTS_SUBFOLDER = "extracted";
37
93
  const HTTP_STATUS_OK = 200;
94
+ const ORPHANED_EXTRACTED_VAULT_MAX_AGE_IN_MILLISECONDS = 864e5;
38
95
  async function openDemoVault(params) {
39
- const {
40
- app,
41
- pluginId,
42
- pluginName,
43
- pluginNoticeComponent,
44
- pluginVersion
45
- } = params;
46
- const repo = await getCommunityPluginRepo(pluginId);
47
- if (!repo) {
48
- pluginNoticeComponent.showNotice(`Could not find plugin ${pluginName} in the community plugins registry.`);
49
- return;
50
- }
51
- const currentVersion = pluginVersion;
52
- const latestVersion = await getLatestReleaseVersion(repo);
53
- let versionToOpen;
54
- if (compareVersions(currentVersion, latestVersion) >= 0) {
55
- versionToOpen = currentVersion;
56
- } else {
57
- const chosenVersion = await selectOption({
96
+ var _stack = [];
97
+ try {
98
+ const {
58
99
  app,
59
- message: `Current version of plugin ${pluginName} v${currentVersion} is not the latest (v${latestVersion})`,
60
- options: [
61
- {
62
- isCta: true,
63
- text: `Open demo vault for latest version (v${latestVersion})`,
64
- value: latestVersion
65
- },
66
- {
67
- text: `Open demo vault for current version (v${currentVersion})`,
68
- value: currentVersion
69
- },
70
- {
71
- text: "Cancel",
72
- value: null
73
- }
74
- ],
75
- title: pluginName
76
- });
77
- if (chosenVersion === null) {
100
+ pluginId,
101
+ pluginName,
102
+ pluginNoticeComponent,
103
+ pluginVersion
104
+ } = params;
105
+ const progressNotice = __using(_stack, pluginNoticeComponent.showNoticeAfterDelay({
106
+ content: `Opening demo vault for ${pluginName}\u2026`,
107
+ delayInMilliseconds: 0
108
+ }));
109
+ const repo = await getCommunityPluginRepo(pluginId);
110
+ if (!repo) {
111
+ pluginNoticeComponent.showNotice(`Could not find plugin ${pluginName} in the community plugins registry.`);
78
112
  return;
79
113
  }
80
- versionToOpen = chosenVersion;
81
- }
82
- const cacheDir = join(tmpdir(), DEMO_VAULTS_CACHE_FOLDER, pluginId, versionToOpen);
83
- if (!existsSync(cacheDir)) {
84
- const isExtracted = await downloadAndExtractDemoVault({
85
- cacheDir,
114
+ const currentVersion = pluginVersion;
115
+ const latestVersion = await getLatestReleaseVersion(repo);
116
+ let versionToOpen;
117
+ if (compareVersions(currentVersion, latestVersion) >= 0) {
118
+ versionToOpen = currentVersion;
119
+ } else {
120
+ const chosenVersion = await selectOption({
121
+ app,
122
+ message: `Current version of plugin ${pluginName} v${currentVersion} is not the latest (v${latestVersion})`,
123
+ options: [
124
+ {
125
+ isCta: true,
126
+ text: `Open demo vault for latest version (v${latestVersion})`,
127
+ value: latestVersion
128
+ },
129
+ {
130
+ text: `Open demo vault for current version (v${currentVersion})`,
131
+ value: currentVersion
132
+ },
133
+ {
134
+ text: "Cancel",
135
+ value: null
136
+ }
137
+ ],
138
+ title: pluginName
139
+ });
140
+ if (chosenVersion === null) {
141
+ return;
142
+ }
143
+ versionToOpen = chosenVersion;
144
+ }
145
+ const archive = await resolveDemoVaultArchive({
86
146
  pluginId,
87
147
  pluginName,
88
148
  pluginNoticeComponent,
149
+ progressNotice,
89
150
  repo,
90
151
  version: versionToOpen
91
152
  });
92
- if (!isExtracted) {
153
+ if (!archive) {
93
154
  return;
94
155
  }
156
+ progressNotice.setContent(`Extracting demo vault for ${pluginName} v${versionToOpen}\u2026`);
157
+ cleanupOrphanedExtractedVaults();
158
+ const vaultDir = extractDemoVaultToFreshFolder({
159
+ archive,
160
+ pluginId,
161
+ version: versionToOpen
162
+ });
163
+ window.electron.ipcRenderer.sendSync("vault-open", vaultDir, false);
164
+ } catch (_) {
165
+ var _error = _, _hasError = true;
166
+ } finally {
167
+ __callDispose(_stack, _error, _hasError);
95
168
  }
96
- window.electron.ipcRenderer.sendSync("vault-open", cacheDir, false);
97
169
  }
98
- async function downloadAndExtractDemoVault(params) {
170
+ function cleanupOrphanedExtractedVaults() {
171
+ const extractedVaultsRoot = join(tmpdir(), DEMO_VAULTS_CACHE_FOLDER, EXTRACTED_VAULTS_SUBFOLDER);
172
+ if (!existsSync(extractedVaultsRoot)) {
173
+ return;
174
+ }
175
+ const now = Date.now();
176
+ for (const entryName of readdirSync(extractedVaultsRoot)) {
177
+ const entryPath = join(extractedVaultsRoot, entryName);
178
+ try {
179
+ const stats = statSync(entryPath);
180
+ if (now - stats.mtimeMs < ORPHANED_EXTRACTED_VAULT_MAX_AGE_IN_MILLISECONDS) {
181
+ continue;
182
+ }
183
+ rmSync(entryPath, { force: true, recursive: true });
184
+ } catch {
185
+ }
186
+ }
187
+ }
188
+ function extractDemoVaultArchive(archive, targetDir) {
189
+ const originalFs = window.require('node:original-fs');
190
+ const zip = new AdmZip(archive, { fs: originalFs });
191
+ zip.extractAllTo(targetDir, true);
192
+ }
193
+ function extractDemoVaultToFreshFolder(params) {
194
+ const { archive, pluginId, version } = params;
195
+ const extractedVaultsRoot = join(tmpdir(), DEMO_VAULTS_CACHE_FOLDER, EXTRACTED_VAULTS_SUBFOLDER);
196
+ mkdirSync(extractedVaultsRoot, { recursive: true });
197
+ const uniqueParentDir = mkdtempSync(join(extractedVaultsRoot, `${pluginId}-${version}-`));
198
+ const vaultDir = join(uniqueParentDir, `${pluginId}-${version}.demo-vault`);
199
+ extractDemoVaultArchive(archive, vaultDir);
200
+ return vaultDir;
201
+ }
202
+ async function resolveDemoVaultArchive(params) {
99
203
  const {
100
- cacheDir,
101
204
  pluginId,
102
205
  pluginName,
103
206
  pluginNoticeComponent,
207
+ progressNotice,
104
208
  repo,
105
209
  version
106
210
  } = params;
107
- const assetUrl = `https://github.com/${repo}/releases/download/${version}/${pluginId}.demo-vault.zip`;
211
+ const archivesDir = join(tmpdir(), DEMO_VAULTS_CACHE_FOLDER, ARCHIVES_SUBFOLDER);
212
+ const archivePath = join(archivesDir, `${pluginId}-${version}.zip`);
213
+ if (existsSync(archivePath)) {
214
+ return readFileSync(archivePath);
215
+ }
216
+ progressNotice.setContent(`Downloading demo vault for ${pluginName} v${version}\u2026`);
217
+ const assetUrl = `https://github.com/${repo}/releases/download/${version}/${pluginId}-demo-vault-${version}.zip`;
108
218
  const response = await requestUrl({
109
219
  throw: false,
110
220
  url: assetUrl
111
221
  });
112
222
  if (response.status !== HTTP_STATUS_OK) {
113
223
  pluginNoticeComponent.showNotice(`No demo vault is available for plugin ${pluginName} v${version}.`);
114
- return false;
224
+ return null;
115
225
  }
116
- extractDemoVaultArchive(Buffer.from(response.arrayBuffer), cacheDir);
117
- return true;
118
- }
119
- function extractDemoVaultArchive(archive, targetDir) {
120
- const originalFs = window.require('node:original-fs');
121
- const zip = new AdmZip(archive, { fs: originalFs });
122
- zip.extractAllTo(targetDir, true);
226
+ const archive = Buffer2.from(response.arrayBuffer);
227
+ mkdirSync(archivesDir, { recursive: true });
228
+ writeFileSync(archivePath, archive);
229
+ return archive;
123
230
  }
124
231
  export {
125
232
  openDemoVault
126
233
  };
127
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2Rlc2t0b3AtZGVtby12YXVsdC1vcGVuZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEb3dubG9hZHMgYW5kIG9wZW5zIGEgcGx1Z2luJ3Mgc2hpcHBlZCBkZW1vIHZhdWx0IGluIGEgbmV3IE9ic2lkaWFuIHdpbmRvdyAoZGVza3RvcCBvbmx5KS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gYXR0YWNoIGEgYDxwbHVnaW4taWQ+LmRlbW8tdmF1bHQuemlwYCBhcmNoaXZlIHRvIGVhY2ggR2l0SHViIHJlbGVhc2UgKHNlZVxuICogYGFyY2hpdmVQbHVnaW5EZW1vVmF1bHRgIGluIGBzY3JpcHQtdXRpbHMvZGVtby12YXVsdC50c2ApLiBUaGlzIHJlc29sdmVzIHRoZSBwbHVnaW4ncyByZXBvc2l0b3J5XG4gKiBmcm9tIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHJlZ2lzdHJ5LCBkb3dubG9hZHMgdGhlIGFyY2hpdmUgZm9yIHRoZSBjaG9zZW4gdmVyc2lvbiwgZXh0cmFjdHMgaXQgdG8gYVxuICogcGVyLXZlcnNpb24gY2FjaGUgZm9sZGVyIHVuZGVyIHRoZSBPUyB0ZW1wIGRpcmVjdG9yeSwgYW5kIG9wZW5zIHRoYXQgZm9sZGVyIGFzIGEgdmF1bHQgaW4gYSBuZXdcbiAqIHdpbmRvdy4gV2hlbiB0aGUgaW5zdGFsbGVkIHBsdWdpbiB2ZXJzaW9uIGlzIGJlaGluZCB0aGUgbGF0ZXN0IHJlbGVhc2UsIHRoZSB1c2VyIGlzIG9mZmVyZWQgYSBjaG9pY2VcbiAqIGJldHdlZW4gdGhlIHR3byB2ZXJzaW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IEFkbVppcCBmcm9tICdhZG0temlwJztcbmltcG9ydCB7IGNvbXBhcmVWZXJzaW9ucyB9IGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLW5vZGVqcy1tb2R1bGVzIC0tIERlc2t0b3Atb25seSBmZWF0dXJlIGdhdGVkIGJ5IGBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHBgOyB0aGUgY29tbWFuZCBpcyBoaWRkZW4gb24gbW9iaWxlIHNvIHRoaXMgTm9kZSBBUEkgaXMgbmV2ZXIgcmVhY2hlZCB0aGVyZS5cbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQteC9uby1ub2RlanMtbW9kdWxlcyAtLSBEZXNrdG9wLW9ubHkgZmVhdHVyZSBnYXRlZCBieSBgUGxhdGZvcm0uaXNEZXNrdG9wQXBwYDsgdGhlIGNvbW1hbmQgaXMgaGlkZGVuIG9uIG1vYmlsZSBzbyB0aGlzIE5vZGUgQVBJIGlzIG5ldmVyIHJlYWNoZWQgdGhlcmUuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0LXgvbm8tbm9kZWpzLW1vZHVsZXMgLS0gRGVza3RvcC1vbmx5IGZlYXR1cmUgZ2F0ZWQgYnkgYFBsYXRmb3JtLmlzRGVza3RvcEFwcGA7IHRoZSBjb21tYW5kIGlzIGhpZGRlbiBvbiBtb2JpbGUgc28gdGhpcyBOb2RlIEFQSSBpcyBuZXZlciByZWFjaGVkIHRoZXJlLlxuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyByZXF1ZXN0VXJsIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk5vdGljZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGpvaW4gfSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIGdldENvbW11bml0eVBsdWdpblJlcG8sXG4gIGdldExhdGVzdFJlbGVhc2VWZXJzaW9uXG59IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbnMudHMnO1xuaW1wb3J0IHsgc2VsZWN0T3B0aW9uIH0gZnJvbSAnLi9tb2RhbHMvc2VsZWN0LW9wdGlvbi50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIG9wZW5EZW1vVmF1bHR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5EZW1vVmF1bHRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlkLCB1c2VkIHRvIGxvY2F0ZSB0aGUgR2l0SHViIHJlcG9zaXRvcnkgYW5kIHRoZSBwZXItdmVyc2lvbiBjYWNoZSBmb2xkZXIsIGFuZCB0byBuYW1lXG4gICAqIHRoZSBhcmNoaXZlIGFzc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBkaXNwbGF5IG5hbWUsIHVzZWQgdG8gbGFiZWwgdGhlIG5vdGljZXMgYW5kIHRoZSB2ZXJzaW9uLWNob2ljZSBkaWFsb2cuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29tcG9uZW50IHVzZWQgdG8gcmVwb3J0IHByb2JsZW1zIChwbHVnaW4gbm90IGluIHRoZSByZWdpc3RyeSwgbWlzc2luZyBhcmNoaXZlKS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGluc3RhbGxlZCBwbHVnaW4gdmVyc2lvbiwgb2ZmZXJlZCBhcyBvbmUgb2YgdGhlIHZlcnNpb24gY2hvaWNlcy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblZlcnNpb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIERvd25sb2FkQW5kRXh0cmFjdERlbW9WYXVsdFBhcmFtcyB7XG4gIHJlYWRvbmx5IGNhY2hlRGlyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5jb25zdCBERU1PX1ZBVUxUU19DQUNIRV9GT0xERVIgPSAnb2JzaWRpYW4tZGVtby12YXVsdHMnO1xuY29uc3QgSFRUUF9TVEFUVVNfT0sgPSAyMDA7XG5cbi8qKlxuICogRG93bmxvYWRzIGFuZCBvcGVucyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCBpbiBhIG5ldyBPYnNpZGlhbiB3aW5kb3cuIERlc2t0b3Agb25seS5cbiAqXG4gKiBJZiB0aGUgaW5zdGFsbGVkIHBsdWdpbiB2ZXJzaW9uIGlzIHRoZSBsYXRlc3QgKG9yIG5ld2VyKSwgaXRzIGRlbW8gdmF1bHQgb3BlbnMgZGlyZWN0bHk7IG90aGVyd2lzZVxuICogdGhlIHVzZXIgY2hvb3NlcyBiZXR3ZWVuIHRoZSBsYXRlc3QgYW5kIHRoZSBjdXJyZW50bHktaW5zdGFsbGVkIHZlcnNpb24uIFRoZSBjaG9zZW4gdmVyc2lvbidzXG4gKiBhcmNoaXZlIGlzIGRvd25sb2FkZWQgYW5kIGV4dHJhY3RlZCBvbmNlLCB0aGVuIHJldXNlZCBmcm9tIGEgcGVyLXZlcnNpb24gY2FjaGUgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIE9wZW5EZW1vVmF1bHRQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB2YXVsdCBoYXMgYmVlbiBvcGVuZWQsIG9yIG9uY2UgdGhlIG9wZXJhdGlvbiBoYXNcbiAqIGJlZW4gcmVwb3J0ZWQgYXMgbm90IHBvc3NpYmxlIChub3RpY2Ugc2hvd24pIG9yIGNhbmNlbGxlZCBieSB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5EZW1vVmF1bHQocGFyYW1zOiBPcGVuRGVtb1ZhdWx0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgcGx1Z2luSWQsXG4gICAgcGx1Z2luTmFtZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcGx1Z2luVmVyc2lvblxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHJlcG8gPSBhd2FpdCBnZXRDb21tdW5pdHlQbHVnaW5SZXBvKHBsdWdpbklkKTtcbiAgaWYgKCFyZXBvKSB7XG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UoYENvdWxkIG5vdCBmaW5kIHBsdWdpbiAke3BsdWdpbk5hbWV9IGluIHRoZSBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHBsdWdpblZlcnNpb247XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RSZWxlYXNlVmVyc2lvbihyZXBvKTtcblxuICBsZXQgdmVyc2lvblRvT3Blbjogc3RyaW5nO1xuICBpZiAoY29tcGFyZVZlcnNpb25zKGN1cnJlbnRWZXJzaW9uLCBsYXRlc3RWZXJzaW9uKSA+PSAwKSB7XG4gICAgdmVyc2lvblRvT3BlbiA9IGN1cnJlbnRWZXJzaW9uO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNob3NlblZlcnNpb24gPSBhd2FpdCBzZWxlY3RPcHRpb248bnVsbCB8IHN0cmluZz4oe1xuICAgICAgYXBwLFxuICAgICAgbWVzc2FnZTogYEN1cnJlbnQgdmVyc2lvbiBvZiBwbHVnaW4gJHtwbHVnaW5OYW1lfSB2JHtjdXJyZW50VmVyc2lvbn0gaXMgbm90IHRoZSBsYXRlc3QgKHYke2xhdGVzdFZlcnNpb259KWAsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpc0N0YTogdHJ1ZSxcbiAgICAgICAgICB0ZXh0OiBgT3BlbiBkZW1vIHZhdWx0IGZvciBsYXRlc3QgdmVyc2lvbiAodiR7bGF0ZXN0VmVyc2lvbn0pYCxcbiAgICAgICAgICB2YWx1ZTogbGF0ZXN0VmVyc2lvblxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogYE9wZW4gZGVtbyB2YXVsdCBmb3IgY3VycmVudCB2ZXJzaW9uICh2JHtjdXJyZW50VmVyc2lvbn0pYCxcbiAgICAgICAgICB2YWx1ZTogY3VycmVudFZlcnNpb25cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxuICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICB0aXRsZTogcGx1Z2luTmFtZVxuICAgIH0pO1xuICAgIGlmIChjaG9zZW5WZXJzaW9uID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZlcnNpb25Ub09wZW4gPSBjaG9zZW5WZXJzaW9uO1xuICB9XG5cbiAgY29uc3QgY2FjaGVEaXIgPSBqb2luKHRtcGRpcigpLCBERU1PX1ZBVUxUU19DQUNIRV9GT0xERVIsIHBsdWdpbklkLCB2ZXJzaW9uVG9PcGVuKTtcbiAgaWYgKCFleGlzdHNTeW5jKGNhY2hlRGlyKSkge1xuICAgIGNvbnN0IGlzRXh0cmFjdGVkID0gYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0RGVtb1ZhdWx0KHtcbiAgICAgIGNhY2hlRGlyLFxuICAgICAgcGx1Z2luSWQsXG4gICAgICBwbHVnaW5OYW1lLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVwbyxcbiAgICAgIHZlcnNpb246IHZlcnNpb25Ub09wZW5cbiAgICB9KTtcbiAgICBpZiAoIWlzRXh0cmFjdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2YXVsdC1vcGVuJywgY2FjaGVEaXIsIGZhbHNlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRBbmRFeHRyYWN0RGVtb1ZhdWx0KHBhcmFtczogRG93bmxvYWRBbmRFeHRyYWN0RGVtb1ZhdWx0UGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHtcbiAgICBjYWNoZURpcixcbiAgICBwbHVnaW5JZCxcbiAgICBwbHVnaW5OYW1lLFxuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICByZXBvLFxuICAgIHZlcnNpb25cbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBhc3NldFVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvfS9yZWxlYXNlcy9kb3dubG9hZC8ke3ZlcnNpb259LyR7cGx1Z2luSWR9LmRlbW8tdmF1bHQuemlwYDtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKHtcbiAgICB0aHJvdzogZmFsc2UsXG4gICAgdXJsOiBhc3NldFVybFxuICB9KTtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gSFRUUF9TVEFUVVNfT0spIHtcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShgTm8gZGVtbyB2YXVsdCBpcyBhdmFpbGFibGUgZm9yIHBsdWdpbiAke3BsdWdpbk5hbWV9IHYke3ZlcnNpb259LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGV4dHJhY3REZW1vVmF1bHRBcmNoaXZlKEJ1ZmZlci5mcm9tKHJlc3BvbnNlLmFycmF5QnVmZmVyKSwgY2FjaGVEaXIpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBhIGRvd25sb2FkZWQgZGVtby12YXVsdCBhcmNoaXZlIHRvIGRpc2suXG4gKlxuICogRWxlY3Ryb24ncyBhc2FyIGxheWVyIGludGVyY2VwdHMgYGZzYCBvcGVyYXRpb25zIG9uIGFueSBwYXRoIGNvbnRhaW5pbmcgYC5hc2FyYCBhbmQgdGhyb3dzIGBFTk9FTlRgXG4gKiB3aGVuIGBjaG1vZGAtaW5nIGFuIGAuYXNhcmAgZmlsZSAoaXQgdHJlYXRzIGl0IGFzIGFuIGFyY2hpdmUgcm9vdCByYXRoZXIgdGhhbiBhIHBsYWluIGZpbGUpLiBBIGRlbW9cbiAqIHZhdWx0IG1heSBzaGlwIHN1Y2ggYSBmaWxlIChlLmcuIGBfYXNzZXRzL0NvZGVTY3JpcHRUb29sa2l0L21vZHVsZS5hc2FyYCBkZW1vbnN0cmF0aW5nIHRoZSBBU0FSXG4gKiByZXF1aXJlIGZlYXR1cmUpLCBhbmQgYWRtLXppcCBgY2htb2RgcyBldmVyeSBleHRyYWN0ZWQgZmlsZSwgc28gZXh0cmFjdGlvbiB3b3VsZCBvdGhlcndpc2UgY3Jhc2guXG4gKiBIYW5kIGFkbS16aXAgRWxlY3Ryb24ncyBgb3JpZ2luYWwtZnNgIFx1MjAxNCB0aGUgcmVhbCBgZnNgIHdpdGggYXNhciBpbnRlcmNlcHRpb24gZGlzYWJsZWQgXHUyMDE0IHNvIHRoZVxuICogYC5hc2FyYCBmaWxlIGlzIHRyZWF0ZWQgYXMgYSBwbGFpbiBmaWxlIGFuZCBgY2htb2RgIHN1Y2NlZWRzLiBJdCBpcyBhIGRlc2t0b3Atb25seSBFbGVjdHJvbiBtb2R1bGVcbiAqIHdpdGggbm8gYnVuZGxlZCB0eXBlcywgc28gaXQgaXMgbG9hZGVkIHZpYSBgd2luZG93LnJlcXVpcmVgIGFuZCB0eXBlZCBhcyBgbm9kZTpmc2AncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gYXJjaGl2ZSAtIFRoZSByYXcgemlwIGFyY2hpdmUgYnl0ZXMuXG4gKiBAcGFyYW0gdGFyZ2V0RGlyIC0gVGhlIGRpcmVjdG9yeSB0byBleHRyYWN0IGludG8uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3REZW1vVmF1bHRBcmNoaXZlKGFyY2hpdmU6IEJ1ZmZlciwgdGFyZ2V0RGlyOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxGcyA9IHdpbmRvdy5yZXF1aXJlKCdub2RlOm9yaWdpbmFsLWZzJykgYXMgdHlwZW9mIGltcG9ydCgnbm9kZTpmcycpO1xuICBjb25zdCB6aXAgPSBuZXcgQWRtWmlwKGFyY2hpdmUsIHsgZnM6IG9yaWdpbmFsRnMgfSk7XG4gIHppcC5leHRyYWN0QWxsVG8odGFyZ2V0RGlyLCB0cnVlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUEsT0FBTyxZQUFZO0FBQ25CLFNBQVMsdUJBQXVCO0FBRWhDLFNBQVMsY0FBYztBQUV2QixTQUFTLGtCQUFrQjtBQUUzQixTQUFTLGNBQWM7QUFDdkIsU0FBUyxrQkFBa0I7QUFJM0IsU0FBUyxZQUFZO0FBQ3JCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxvQkFBb0I7QUEwQzdCLE1BQU0sMkJBQTJCO0FBQ2pDLE1BQU0saUJBQWlCO0FBYXZCLGVBQXNCLGNBQWMsUUFBNEM7QUFDOUUsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosUUFBTSxPQUFPLE1BQU0sdUJBQXVCLFFBQVE7QUFDbEQsTUFBSSxDQUFDLE1BQU07QUFDVCwwQkFBc0IsV0FBVyx5QkFBeUIsVUFBVSxxQ0FBcUM7QUFDekc7QUFBQSxFQUNGO0FBRUEsUUFBTSxpQkFBaUI7QUFDdkIsUUFBTSxnQkFBZ0IsTUFBTSx3QkFBd0IsSUFBSTtBQUV4RCxNQUFJO0FBQ0osTUFBSSxnQkFBZ0IsZ0JBQWdCLGFBQWEsS0FBSyxHQUFHO0FBQ3ZELG9CQUFnQjtBQUFBLEVBQ2xCLE9BQU87QUFDTCxVQUFNLGdCQUFnQixNQUFNLGFBQTRCO0FBQUEsTUFDdEQ7QUFBQSxNQUNBLFNBQVMsNkJBQTZCLFVBQVUsS0FBSyxjQUFjLHdCQUF3QixhQUFhO0FBQUEsTUFDeEcsU0FBUztBQUFBLFFBQ1A7QUFBQSxVQUNFLE9BQU87QUFBQSxVQUNQLE1BQU0sd0NBQXdDLGFBQWE7QUFBQSxVQUMzRCxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU0seUNBQXlDLGNBQWM7QUFBQSxVQUM3RCxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUFBLE1BQ0EsT0FBTztBQUFBLElBQ1QsQ0FBQztBQUNELFFBQUksa0JBQWtCLE1BQU07QUFDMUI7QUFBQSxJQUNGO0FBQ0Esb0JBQWdCO0FBQUEsRUFDbEI7QUFFQSxRQUFNLFdBQVcsS0FBSyxPQUFPLEdBQUcsMEJBQTBCLFVBQVUsYUFBYTtBQUNqRixNQUFJLENBQUMsV0FBVyxRQUFRLEdBQUc7QUFDekIsVUFBTSxjQUFjLE1BQU0sNEJBQTRCO0FBQUEsTUFDcEQ7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxTQUFTO0FBQUEsSUFDWCxDQUFDO0FBQ0QsUUFBSSxDQUFDLGFBQWE7QUFDaEI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU8sU0FBUyxZQUFZLFNBQVMsY0FBYyxVQUFVLEtBQUs7QUFDcEU7QUFFQSxlQUFlLDRCQUE0QixRQUE2RDtBQUN0RyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosUUFBTSxXQUFXLHNCQUFzQixJQUFJLHNCQUFzQixPQUFPLElBQUksUUFBUTtBQUNwRixRQUFNLFdBQVcsTUFBTSxXQUFXO0FBQUEsSUFDaEMsT0FBTztBQUFBLElBQ1AsS0FBSztBQUFBLEVBQ1AsQ0FBQztBQUNELE1BQUksU0FBUyxXQUFXLGdCQUFnQjtBQUN0QywwQkFBc0IsV0FBVyx5Q0FBeUMsVUFBVSxLQUFLLE9BQU8sR0FBRztBQUNuRyxXQUFPO0FBQUEsRUFDVDtBQUVBLDBCQUF3QixPQUFPLEtBQUssU0FBUyxXQUFXLEdBQUcsUUFBUTtBQUNuRSxTQUFPO0FBQ1Q7QUFnQkEsU0FBUyx3QkFBd0IsU0FBaUIsV0FBeUI7QUFDekUsUUFBTSxhQUFhLE9BQU8sUUFBUSxrQkFBa0I7QUFDcEQsUUFBTSxNQUFNLElBQUksT0FBTyxTQUFTLEVBQUUsSUFBSSxXQUFXLENBQUM7QUFDbEQsTUFBSSxhQUFhLFdBQVcsSUFBSTtBQUNsQzsiLAogICJuYW1lcyI6IFtdCn0K
234
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2Rlc2t0b3AtZGVtby12YXVsdC1vcGVuZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEb3dubG9hZHMgYW5kIG9wZW5zIGEgcGx1Z2luJ3Mgc2hpcHBlZCBkZW1vIHZhdWx0IGluIGEgbmV3IE9ic2lkaWFuIHdpbmRvdyAoZGVza3RvcCBvbmx5KS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gYXR0YWNoIGEgYDxwbHVnaW4taWQ+LWRlbW8tdmF1bHQtPHZlcnNpb24+LnppcGAgYXJjaGl2ZSB0byBlYWNoIEdpdEh1YiByZWxlYXNlIChzZWVcbiAqIGBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0YCBpbiBgc2NyaXB0LXV0aWxzL2RlbW8tdmF1bHQudHNgKS4gVGhpcyByZXNvbHZlcyB0aGUgcGx1Z2luJ3MgcmVwb3NpdG9yeVxuICogZnJvbSBPYnNpZGlhbidzIGNvbW11bml0eSByZWdpc3RyeSwgZG93bmxvYWRzIHRoZSBhcmNoaXZlIGZvciB0aGUgY2hvc2VuIHZlcnNpb24sIGFuZCBvcGVucyBpdCBhcyBhXG4gKiB2YXVsdCBpbiBhIG5ldyB3aW5kb3cuIFdoZW4gdGhlIGluc3RhbGxlZCBwbHVnaW4gdmVyc2lvbiBpcyBiZWhpbmQgdGhlIGxhdGVzdCByZWxlYXNlLCB0aGUgdXNlciBpc1xuICogb2ZmZXJlZCBhIGNob2ljZSBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMuXG4gKlxuICogQSBwcm9ncmVzcyBub3RpY2UgaXMgc2hvd24gaW1tZWRpYXRlbHkgKGRvd25sb2FkICsgZXh0cmFjdGlvbiBjYW4gdGFrZSBhIHdoaWxlLCBzbyB0aGUgdXNlciBtdXN0IHNlZVxuICogc29tZXRoaW5nIGlzIGhhcHBlbmluZyByaWdodCBhd2F5KS4gT25seSB0aGUgZG93bmxvYWRlZCBBUkNISVZFIGlzIGNhY2hlZCAodW5kZXIgdGhlIE9TIHRlbXBcbiAqIGRpcmVjdG9yeSk7IGV2ZXJ5IGludm9jYXRpb24gZXh0cmFjdHMgYSBGUkVTSCBjb3B5IGludG8gaXRzIG93biB0ZW1wb3JhcnkgZm9sZGVyIGFuZCBvcGVucyB0aGF0LCBzbyBhXG4gKiBwcmV2aW91cyBzZXNzaW9uJ3MgZWRpdHMgbmV2ZXIgbGVhayBpbnRvIGEgbmV3IG9uZS4gVGhlIGV4dHJhY3RlZCB2YXVsdCBmb2xkZXIgaXMgbmFtZWRcbiAqIGA8cGx1Z2luLWlkPi08dmVyc2lvbj4uZGVtby12YXVsdGAgc28gaXQgcmVhZHMgbmljZWx5IGluIE9ic2lkaWFuJ3MgdmF1bHQgc3dpdGNoZXIuIE9ycGhhbmVkXG4gKiBleHRyYWN0ZWQgZm9sZGVycyBsZWZ0IG92ZXIgZnJvbSBlYXJsaWVyIHNlc3Npb25zIGFyZSBjbGVhbmVkIHVwIChiZXN0LWVmZm9ydCkgb24gZWFjaCBvcGVuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgQWRtWmlwIGZyb20gJ2FkbS16aXAnO1xuaW1wb3J0IHsgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnY29tcGFyZS12ZXJzaW9ucyc7XG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQteC9uby1ub2RlanMtbW9kdWxlcyAtLSBEZXNrdG9wLW9ubHkgZmVhdHVyZSBnYXRlZCBieSBgUGxhdGZvcm0uaXNEZXNrdG9wQXBwYDsgdGhlIGNvbW1hbmQgaXMgaGlkZGVuIG9uIG1vYmlsZSBzbyB0aGVzZSBOb2RlIEFQSXMgYXJlIG5ldmVyIHJlYWNoZWQgdGhlcmUuICovXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcic7XG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICBybVN5bmMsXG4gIHN0YXRTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG4vKiBlc2xpbnQtZW5hYmxlIGltcG9ydC14L25vLW5vZGVqcy1tb2R1bGVzIC0tIERlc2t0b3Atb25seSBmZWF0dXJlIGdhdGVkIGJ5IGBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHBgOyB0aGUgY29tbWFuZCBpcyBoaWRkZW4gb24gbW9iaWxlIHNvIHRoZXNlIE5vZGUgQVBJcyBhcmUgbmV2ZXIgcmVhY2hlZCB0aGVyZS4gKi9cbmltcG9ydCB7IHJlcXVlc3RVcmwgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlXG59IGZyb20gJy4vY29tcG9uZW50cy9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGpvaW4gfSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIGdldENvbW11bml0eVBsdWdpblJlcG8sXG4gIGdldExhdGVzdFJlbGVhc2VWZXJzaW9uXG59IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbnMudHMnO1xuaW1wb3J0IHsgc2VsZWN0T3B0aW9uIH0gZnJvbSAnLi9tb2RhbHMvc2VsZWN0LW9wdGlvbi50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIG9wZW5EZW1vVmF1bHR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5EZW1vVmF1bHRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlkLCB1c2VkIHRvIGxvY2F0ZSB0aGUgR2l0SHViIHJlcG9zaXRvcnksIHRvIG5hbWUgdGhlIGFyY2hpdmUgYXNzZXQsIGFuZCB0byBuYW1lIHRoZVxuICAgKiBjYWNoZWQgYXJjaGl2ZSBhbmQgdGhlIGV4dHJhY3RlZCB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGRpc3BsYXkgbmFtZSwgdXNlZCB0byBsYWJlbCB0aGUgbm90aWNlcyBhbmQgdGhlIHZlcnNpb24tY2hvaWNlIGRpYWxvZy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MgYW5kIHByb2JsZW1zIChwbHVnaW4gbm90IGluIHRoZSByZWdpc3RyeSwgbWlzc2luZ1xuICAgKiBhcmNoaXZlKS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGluc3RhbGxlZCBwbHVnaW4gdmVyc2lvbiwgb2ZmZXJlZCBhcyBvbmUgb2YgdGhlIHZlcnNpb24gY2hvaWNlcy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblZlcnNpb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEV4dHJhY3REZW1vVmF1bHRUb0ZyZXNoRm9sZGVyUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXJjaGl2ZTogQnVmZmVyO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSZXNvbHZlRGVtb1ZhdWx0QXJjaGl2ZVBhcmFtcyB7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHByb2dyZXNzTm90aWNlOiBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlO1xuICByZWFkb25seSByZXBvOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuY29uc3QgREVNT19WQVVMVFNfQ0FDSEVfRk9MREVSID0gJ29ic2lkaWFuLWRlbW8tdmF1bHRzJztcbmNvbnN0IEFSQ0hJVkVTX1NVQkZPTERFUiA9ICdhcmNoaXZlcyc7XG5jb25zdCBFWFRSQUNURURfVkFVTFRTX1NVQkZPTERFUiA9ICdleHRyYWN0ZWQnO1xuY29uc3QgSFRUUF9TVEFUVVNfT0sgPSAyMDA7XG4vLyBPbmUgZGF5IGluIG1pbGxpc2Vjb25kcyAoMjQgKiA2MCAqIDYwICogMTAwMCkuXG5jb25zdCBPUlBIQU5FRF9FWFRSQUNURURfVkFVTFRfTUFYX0FHRV9JTl9NSUxMSVNFQ09ORFMgPSA4Nl80MDBfMDAwO1xuXG4vKipcbiAqIERvd25sb2FkcyBhbmQgb3BlbnMgdGhlIHBsdWdpbidzIGRlbW8gdmF1bHQgaW4gYSBuZXcgT2JzaWRpYW4gd2luZG93LiBEZXNrdG9wIG9ubHkuXG4gKlxuICogSWYgdGhlIGluc3RhbGxlZCBwbHVnaW4gdmVyc2lvbiBpcyB0aGUgbGF0ZXN0IChvciBuZXdlciksIGl0cyBkZW1vIHZhdWx0IG9wZW5zIGRpcmVjdGx5OyBvdGhlcndpc2VcbiAqIHRoZSB1c2VyIGNob29zZXMgYmV0d2VlbiB0aGUgbGF0ZXN0IGFuZCB0aGUgY3VycmVudGx5LWluc3RhbGxlZCB2ZXJzaW9uLiBBIHByb2dyZXNzIG5vdGljZSBpcyBzaG93blxuICogaW1tZWRpYXRlbHkuIFRoZSBjaG9zZW4gdmVyc2lvbidzIGFyY2hpdmUgaXMgZG93bmxvYWRlZCBvbmNlICh0aGVuIHJldXNlZCBmcm9tIHRoZSBhcmNoaXZlIGNhY2hlKSxcbiAqIGJ1dCBhIGZyZXNoIGNvcHkgaXMgZXh0cmFjdGVkIGludG8gaXRzIG93biB0ZW1wb3JhcnkgZm9sZGVyIG9uIGV2ZXJ5IG9wZW4gXHUyMDE0IHRoZSB2YXVsdCBpcyBuZXZlciByZXVzZWRcbiAqIGFjcm9zcyBzZXNzaW9ucy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBPcGVuRGVtb1ZhdWx0UGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgdmF1bHQgaGFzIGJlZW4gb3BlbmVkLCBvciBvbmNlIHRoZSBvcGVyYXRpb24gaGFzXG4gKiBiZWVuIHJlcG9ydGVkIGFzIG5vdCBwb3NzaWJsZSAobm90aWNlIHNob3duKSBvciBjYW5jZWxsZWQgYnkgdGhlIHVzZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuRGVtb1ZhdWx0KHBhcmFtczogT3BlbkRlbW9WYXVsdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHBsdWdpbklkLFxuICAgIHBsdWdpbk5hbWUsXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgIHBsdWdpblZlcnNpb25cbiAgfSA9IHBhcmFtcztcblxuICAvLyBTaG93biBpbW1lZGlhdGVseSAoYGRlbGF5SW5NaWxsaXNlY29uZHM6IDBgKTogcmVzb2x2aW5nIHRoZSByZWxlYXNlLCBkb3dubG9hZGluZyBhbmQgZXh0cmFjdGluZyBjYW5cbiAgLy8gRWFjaCB0YWtlIGEgd2hpbGUsIHNvIHRoZSB1c2VyIG11c3Qgc2VlIHByb2dyZXNzIHRoZSBtb21lbnQgdGhlIGNvbW1hbmQgaXMgaW52b2tlZC5cbiAgdXNpbmcgcHJvZ3Jlc3NOb3RpY2UgPSBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXkoe1xuICAgIGNvbnRlbnQ6IGBPcGVuaW5nIGRlbW8gdmF1bHQgZm9yICR7cGx1Z2luTmFtZX1cdTIwMjZgLFxuICAgIGRlbGF5SW5NaWxsaXNlY29uZHM6IDBcbiAgfSk7XG5cbiAgY29uc3QgcmVwbyA9IGF3YWl0IGdldENvbW11bml0eVBsdWdpblJlcG8ocGx1Z2luSWQpO1xuICBpZiAoIXJlcG8pIHtcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShgQ291bGQgbm90IGZpbmQgcGx1Z2luICR7cGx1Z2luTmFtZX0gaW4gdGhlIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gcGx1Z2luVmVyc2lvbjtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGF3YWl0IGdldExhdGVzdFJlbGVhc2VWZXJzaW9uKHJlcG8pO1xuXG4gIGxldCB2ZXJzaW9uVG9PcGVuOiBzdHJpbmc7XG4gIGlmIChjb21wYXJlVmVyc2lvbnMoY3VycmVudFZlcnNpb24sIGxhdGVzdFZlcnNpb24pID49IDApIHtcbiAgICB2ZXJzaW9uVG9PcGVuID0gY3VycmVudFZlcnNpb247XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgY2hvc2VuVmVyc2lvbiA9IGF3YWl0IHNlbGVjdE9wdGlvbjxudWxsIHwgc3RyaW5nPih7XG4gICAgICBhcHAsXG4gICAgICBtZXNzYWdlOiBgQ3VycmVudCB2ZXJzaW9uIG9mIHBsdWdpbiAke3BsdWdpbk5hbWV9IHYke2N1cnJlbnRWZXJzaW9ufSBpcyBub3QgdGhlIGxhdGVzdCAodiR7bGF0ZXN0VmVyc2lvbn0pYCxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlzQ3RhOiB0cnVlLFxuICAgICAgICAgIHRleHQ6IGBPcGVuIGRlbW8gdmF1bHQgZm9yIGxhdGVzdCB2ZXJzaW9uICh2JHtsYXRlc3RWZXJzaW9ufSlgLFxuICAgICAgICAgIHZhbHVlOiBsYXRlc3RWZXJzaW9uXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBgT3BlbiBkZW1vIHZhdWx0IGZvciBjdXJyZW50IHZlcnNpb24gKHYke2N1cnJlbnRWZXJzaW9ufSlgLFxuICAgICAgICAgIHZhbHVlOiBjdXJyZW50VmVyc2lvblxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogJ0NhbmNlbCcsXG4gICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHRpdGxlOiBwbHVnaW5OYW1lXG4gICAgfSk7XG4gICAgaWYgKGNob3NlblZlcnNpb24gPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmVyc2lvblRvT3BlbiA9IGNob3NlblZlcnNpb247XG4gIH1cblxuICBjb25zdCBhcmNoaXZlID0gYXdhaXQgcmVzb2x2ZURlbW9WYXVsdEFyY2hpdmUoe1xuICAgIHBsdWdpbklkLFxuICAgIHBsdWdpbk5hbWUsXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgIHByb2dyZXNzTm90aWNlLFxuICAgIHJlcG8sXG4gICAgdmVyc2lvbjogdmVyc2lvblRvT3BlblxuICB9KTtcbiAgaWYgKCFhcmNoaXZlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJvZ3Jlc3NOb3RpY2Uuc2V0Q29udGVudChgRXh0cmFjdGluZyBkZW1vIHZhdWx0IGZvciAke3BsdWdpbk5hbWV9IHYke3ZlcnNpb25Ub09wZW59XHUyMDI2YCk7XG4gIGNsZWFudXBPcnBoYW5lZEV4dHJhY3RlZFZhdWx0cygpO1xuICBjb25zdCB2YXVsdERpciA9IGV4dHJhY3REZW1vVmF1bHRUb0ZyZXNoRm9sZGVyKHtcbiAgICBhcmNoaXZlLFxuICAgIHBsdWdpbklkLFxuICAgIHZlcnNpb246IHZlcnNpb25Ub09wZW5cbiAgfSk7XG5cbiAgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2YXVsdC1vcGVuJywgdmF1bHREaXIsIGZhbHNlKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV4dHJhY3RlZCBkZW1vLXZhdWx0IGZvbGRlcnMgbGVmdCBvdmVyIGZyb20gZWFybGllciBzZXNzaW9ucyAoYmVzdC1lZmZvcnQpLlxuICpcbiAqIEV2ZXJ5IG9wZW4gZXh0cmFjdHMgYSBmcmVzaCBjb3B5IGludG8gaXRzIG93biBmb2xkZXIgYW5kIG5ldmVyIGRlbGV0ZXMgaXQgYWZ0ZXJ3YXJkcyAodGhlIHZhdWx0IHN0YXlzXG4gKiBvcGVuIGluIGl0cyB3aW5kb3cpLCBzbyB0aGVzZSBhY2N1bXVsYXRlLiBUaGlzIGRyb3BzIGZvbGRlcnMgb2xkZXIgdGhhblxuICoge0BsaW5rIE9SUEhBTkVEX0VYVFJBQ1RFRF9WQVVMVF9NQVhfQUdFX0lOX01JTExJU0VDT05EU30uIEEgZm9sZGVyIHdob3NlIHZhdWx0IGlzIHN0aWxsIG9wZW4gaW4gYW5vdGhlclxuICogd2luZG93IGlzIGxvY2tlZCBvbiBXaW5kb3dzIGFuZCBjYW5ub3QgYmUgcmVtb3ZlZCBcdTIwMTQgdGhlIHJlbW92YWwgaXMgd3JhcHBlZCBzbyBzdWNoIGEgZm9sZGVyIGlzIHNpbXBseVxuICogc2tpcHBlZCBhbmQgcmV0cmllZCBvbiBhIGxhdGVyIG9wZW4uXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBPcnBoYW5lZEV4dHJhY3RlZFZhdWx0cygpOiB2b2lkIHtcbiAgY29uc3QgZXh0cmFjdGVkVmF1bHRzUm9vdCA9IGpvaW4odG1wZGlyKCksIERFTU9fVkFVTFRTX0NBQ0hFX0ZPTERFUiwgRVhUUkFDVEVEX1ZBVUxUU19TVUJGT0xERVIpO1xuICBpZiAoIWV4aXN0c1N5bmMoZXh0cmFjdGVkVmF1bHRzUm9vdCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBmb3IgKGNvbnN0IGVudHJ5TmFtZSBvZiByZWFkZGlyU3luYyhleHRyYWN0ZWRWYXVsdHNSb290KSkge1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IGpvaW4oZXh0cmFjdGVkVmF1bHRzUm9vdCwgZW50cnlOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHMgPSBzdGF0U3luYyhlbnRyeVBhdGgpO1xuICAgICAgaWYgKG5vdyAtIHN0YXRzLm10aW1lTXMgPCBPUlBIQU5FRF9FWFRSQUNURURfVkFVTFRfTUFYX0FHRV9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBybVN5bmMoZW50cnlQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCZXN0LWVmZm9ydCBjbGVhbnVwOiBhbiBvcnBoYW4gd2hvc2UgdmF1bHQgaXMgc3RpbGwgb3BlbiAobG9ja2VkIG9uIFdpbmRvd3MpIGNhbm5vdCBiZSByZW1vdmVkOyBza2lwIGl0IGFuZCByZXRyeSBvbiBhIGxhdGVyIG9wZW4uXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBkb3dubG9hZGVkIGRlbW8tdmF1bHQgYXJjaGl2ZSB0byBkaXNrLlxuICpcbiAqIEVsZWN0cm9uJ3MgYXNhciBsYXllciBpbnRlcmNlcHRzIGBmc2Agb3BlcmF0aW9ucyBvbiBhbnkgcGF0aCBjb250YWluaW5nIGAuYXNhcmAgYW5kIHRocm93cyBgRU5PRU5UYFxuICogd2hlbiBgY2htb2RgLWluZyBhbiBgLmFzYXJgIGZpbGUgKGl0IHRyZWF0cyBpdCBhcyBhbiBhcmNoaXZlIHJvb3QgcmF0aGVyIHRoYW4gYSBwbGFpbiBmaWxlKS4gQSBkZW1vXG4gKiB2YXVsdCBtYXkgc2hpcCBzdWNoIGEgZmlsZSAoZS5nLiBgX2Fzc2V0cy9Db2RlU2NyaXB0VG9vbGtpdC9tb2R1bGUuYXNhcmAgZGVtb25zdHJhdGluZyB0aGUgQVNBUlxuICogcmVxdWlyZSBmZWF0dXJlKSwgYW5kIGFkbS16aXAgYGNobW9kYHMgZXZlcnkgZXh0cmFjdGVkIGZpbGUsIHNvIGV4dHJhY3Rpb24gd291bGQgb3RoZXJ3aXNlIGNyYXNoLlxuICogSGFuZCBhZG0temlwIEVsZWN0cm9uJ3MgYG9yaWdpbmFsLWZzYCBcdTIwMTQgdGhlIHJlYWwgYGZzYCB3aXRoIGFzYXIgaW50ZXJjZXB0aW9uIGRpc2FibGVkIFx1MjAxNCBzbyB0aGVcbiAqIGAuYXNhcmAgZmlsZSBpcyB0cmVhdGVkIGFzIGEgcGxhaW4gZmlsZSBhbmQgYGNobW9kYCBzdWNjZWVkcy4gSXQgaXMgYSBkZXNrdG9wLW9ubHkgRWxlY3Ryb24gbW9kdWxlXG4gKiB3aXRoIG5vIGJ1bmRsZWQgdHlwZXMsIHNvIGl0IGlzIGxvYWRlZCB2aWEgYHdpbmRvdy5yZXF1aXJlYCBhbmQgdHlwZWQgYXMgYG5vZGU6ZnNgJ3Mgc2hhcGUuXG4gKlxuICogQHBhcmFtIGFyY2hpdmUgLSBUaGUgcmF3IHppcCBhcmNoaXZlIGJ5dGVzLlxuICogQHBhcmFtIHRhcmdldERpciAtIFRoZSBkaXJlY3RvcnkgdG8gZXh0cmFjdCBpbnRvLlxuICovXG5mdW5jdGlvbiBleHRyYWN0RGVtb1ZhdWx0QXJjaGl2ZShhcmNoaXZlOiBCdWZmZXIsIHRhcmdldERpcjogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG9yaWdpbmFsRnMgPSB3aW5kb3cucmVxdWlyZSgnbm9kZTpvcmlnaW5hbC1mcycpIGFzIHR5cGVvZiBpbXBvcnQoJ25vZGU6ZnMnKTtcbiAgY29uc3QgemlwID0gbmV3IEFkbVppcChhcmNoaXZlLCB7IGZzOiBvcmlnaW5hbEZzIH0pO1xuICB6aXAuZXh0cmFjdEFsbFRvKHRhcmdldERpciwgdHJ1ZSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGFyY2hpdmUgaW50byBhIGZyZXNoLCB1bmlxdWVseS1uYW1lZCB0ZW1wb3JhcnkgZm9sZGVyIGFuZCByZXR1cm5zIHRoZSB2YXVsdCBwYXRoLlxuICpcbiAqIEEgdW5pcXVlIHBhcmVudCBmb2xkZXIgKGBta2R0ZW1wU3luY2ApIGd1YXJhbnRlZXMgYSBicmFuZC1uZXcgZXh0cmFjdGlvbiBldmVyeSB0aW1lIFx1MjAxNCB0aGUgZGVtbyB2YXVsdFxuICogaXMgbmV2ZXIgcmV1c2VkIGFjcm9zcyBvcGVucywgc28gYSBwcmV2aW91cyBzZXNzaW9uJ3MgZWRpdHMgbmV2ZXIgbGVhayBpbi4gSW5zaWRlIGl0LCB0aGUgdmF1bHQgZm9sZGVyXG4gKiBpcyBuYW1lZCBgPHBsdWdpbi1pZD4tPHZlcnNpb24+LmRlbW8tdmF1bHRgIHNvIE9ic2lkaWFuJ3MgdmF1bHQgc3dpdGNoZXIgc2hvd3MgYSBmcmllbmRseSBuYW1lIChpdHNcbiAqIGJhc2VuYW1lKSByYXRoZXIgdGhhbiB0aGUgcmFuZG9tIHRlbXAgaWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgRXh0cmFjdERlbW9WYXVsdFRvRnJlc2hGb2xkZXJQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZyZXNobHkgZXh0cmFjdGVkIHZhdWx0IGZvbGRlci5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdERlbW9WYXVsdFRvRnJlc2hGb2xkZXIocGFyYW1zOiBFeHRyYWN0RGVtb1ZhdWx0VG9GcmVzaEZvbGRlclBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXJjaGl2ZSwgcGx1Z2luSWQsIHZlcnNpb24gfSA9IHBhcmFtcztcbiAgY29uc3QgZXh0cmFjdGVkVmF1bHRzUm9vdCA9IGpvaW4odG1wZGlyKCksIERFTU9fVkFVTFRTX0NBQ0hFX0ZPTERFUiwgRVhUUkFDVEVEX1ZBVUxUU19TVUJGT0xERVIpO1xuICBta2RpclN5bmMoZXh0cmFjdGVkVmF1bHRzUm9vdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IHVuaXF1ZVBhcmVudERpciA9IG1rZHRlbXBTeW5jKGpvaW4oZXh0cmFjdGVkVmF1bHRzUm9vdCwgYCR7cGx1Z2luSWR9LSR7dmVyc2lvbn0tYCkpO1xuICBjb25zdCB2YXVsdERpciA9IGpvaW4odW5pcXVlUGFyZW50RGlyLCBgJHtwbHVnaW5JZH0tJHt2ZXJzaW9ufS5kZW1vLXZhdWx0YCk7XG4gIGV4dHJhY3REZW1vVmF1bHRBcmNoaXZlKGFyY2hpdmUsIHZhdWx0RGlyKTtcbiAgcmV0dXJuIHZhdWx0RGlyO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkZW1vLXZhdWx0IGFyY2hpdmUgYnl0ZXMgZm9yIGEgdmVyc2lvbiwgZG93bmxvYWRpbmcgYW5kIGNhY2hpbmcgdGhlbSBvbiBmaXJzdCB1c2UuXG4gKlxuICogT25seSB0aGUgYXJjaGl2ZSBpcyBjYWNoZWQgKGtleWVkIGJ5IHBsdWdpbiBpZCArIHZlcnNpb24pOyB0aGUgZXh0cmFjdGVkIHZhdWx0IGlzIG5vdC4gQSBjYWNoZSBoaXQgaXNcbiAqIHJldHVybmVkIHdpdGhvdXQgYW55IG5ldHdvcmsgcmVxdWVzdDsgYSBtaXNzIGRvd25sb2FkcyB0aGUgcmVsZWFzZSBhc3NldCwgd3JpdGVzIGl0IHRvIHRoZSBhcmNoaXZlXG4gKiBjYWNoZSwgYW5kIHJldHVybnMgdGhlIGZyZXNobHkgZG93bmxvYWRlZCBieXRlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBSZXNvbHZlRGVtb1ZhdWx0QXJjaGl2ZVBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIGFyY2hpdmUgYnl0ZXMsIG9yIGBudWxsYCB3aGVuIG5vIGFyY2hpdmUgaXMgYXZhaWxhYmxlIGZvclxuICogdGhlIHZlcnNpb24gKGEgbm90aWNlIGhhcyBiZWVuIHNob3duKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURlbW9WYXVsdEFyY2hpdmUocGFyYW1zOiBSZXNvbHZlRGVtb1ZhdWx0QXJjaGl2ZVBhcmFtcyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICBjb25zdCB7XG4gICAgcGx1Z2luSWQsXG4gICAgcGx1Z2luTmFtZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcHJvZ3Jlc3NOb3RpY2UsXG4gICAgcmVwbyxcbiAgICB2ZXJzaW9uXG4gIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgYXJjaGl2ZXNEaXIgPSBqb2luKHRtcGRpcigpLCBERU1PX1ZBVUxUU19DQUNIRV9GT0xERVIsIEFSQ0hJVkVTX1NVQkZPTERFUik7XG4gIGNvbnN0IGFyY2hpdmVQYXRoID0gam9pbihhcmNoaXZlc0RpciwgYCR7cGx1Z2luSWR9LSR7dmVyc2lvbn0uemlwYCk7XG4gIGlmIChleGlzdHNTeW5jKGFyY2hpdmVQYXRoKSkge1xuICAgIHJldHVybiByZWFkRmlsZVN5bmMoYXJjaGl2ZVBhdGgpO1xuICB9XG5cbiAgcHJvZ3Jlc3NOb3RpY2Uuc2V0Q29udGVudChgRG93bmxvYWRpbmcgZGVtbyB2YXVsdCBmb3IgJHtwbHVnaW5OYW1lfSB2JHt2ZXJzaW9ufVx1MjAyNmApO1xuICBjb25zdCBhc3NldFVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvfS9yZWxlYXNlcy9kb3dubG9hZC8ke3ZlcnNpb259LyR7cGx1Z2luSWR9LWRlbW8tdmF1bHQtJHt2ZXJzaW9ufS56aXBgO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoe1xuICAgIHRocm93OiBmYWxzZSxcbiAgICB1cmw6IGFzc2V0VXJsXG4gIH0pO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSBIVFRQX1NUQVRVU19PSykge1xuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKGBObyBkZW1vIHZhdWx0IGlzIGF2YWlsYWJsZSBmb3IgcGx1Z2luICR7cGx1Z2luTmFtZX0gdiR7dmVyc2lvbn0uYCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBhcmNoaXZlID0gQnVmZmVyLmZyb20ocmVzcG9uc2UuYXJyYXlCdWZmZXIpO1xuICBta2RpclN5bmMoYXJjaGl2ZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKGFyY2hpdmVQYXRoLCBhcmNoaXZlKTtcbiAgcmV0dXJuIGFyY2hpdmU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCQSxPQUFPLFlBQVk7QUFDbkIsU0FBUyx1QkFBdUI7QUFFaEMsU0FBUyxVQUFBQSxlQUFjO0FBQ3ZCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBRXZCLFNBQVMsa0JBQWtCO0FBTzNCLFNBQVMsWUFBWTtBQUNyQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsb0JBQW9CO0FBaUQ3QixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLHFCQUFxQjtBQUMzQixNQUFNLDZCQUE2QjtBQUNuQyxNQUFNLGlCQUFpQjtBQUV2QixNQUFNLG1EQUFtRDtBQWV6RCxlQUFzQixjQUFjLFFBQTRDO0FBVzlFO0FBQUE7QUFWQSxVQUFNO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLElBQUk7QUFJSixVQUFNLGlCQUFpQixzQ0FBc0IscUJBQXFCO0FBQUEsTUFDaEUsU0FBUywwQkFBMEIsVUFBVTtBQUFBLE1BQzdDLHFCQUFxQjtBQUFBLElBQ3ZCLENBQUM7QUFFRCxVQUFNLE9BQU8sTUFBTSx1QkFBdUIsUUFBUTtBQUNsRCxRQUFJLENBQUMsTUFBTTtBQUNULDRCQUFzQixXQUFXLHlCQUF5QixVQUFVLHFDQUFxQztBQUN6RztBQUFBLElBQ0Y7QUFFQSxVQUFNLGlCQUFpQjtBQUN2QixVQUFNLGdCQUFnQixNQUFNLHdCQUF3QixJQUFJO0FBRXhELFFBQUk7QUFDSixRQUFJLGdCQUFnQixnQkFBZ0IsYUFBYSxLQUFLLEdBQUc7QUFDdkQsc0JBQWdCO0FBQUEsSUFDbEIsT0FBTztBQUNMLFlBQU0sZ0JBQWdCLE1BQU0sYUFBNEI7QUFBQSxRQUN0RDtBQUFBLFFBQ0EsU0FBUyw2QkFBNkIsVUFBVSxLQUFLLGNBQWMsd0JBQXdCLGFBQWE7QUFBQSxRQUN4RyxTQUFTO0FBQUEsVUFDUDtBQUFBLFlBQ0UsT0FBTztBQUFBLFlBQ1AsTUFBTSx3Q0FBd0MsYUFBYTtBQUFBLFlBQzNELE9BQU87QUFBQSxVQUNUO0FBQUEsVUFDQTtBQUFBLFlBQ0UsTUFBTSx5Q0FBeUMsY0FBYztBQUFBLFlBQzdELE9BQU87QUFBQSxVQUNUO0FBQUEsVUFDQTtBQUFBLFlBQ0UsTUFBTTtBQUFBLFlBQ04sT0FBTztBQUFBLFVBQ1Q7QUFBQSxRQUNGO0FBQUEsUUFDQSxPQUFPO0FBQUEsTUFDVCxDQUFDO0FBQ0QsVUFBSSxrQkFBa0IsTUFBTTtBQUMxQjtBQUFBLE1BQ0Y7QUFDQSxzQkFBZ0I7QUFBQSxJQUNsQjtBQUVBLFVBQU0sVUFBVSxNQUFNLHdCQUF3QjtBQUFBLE1BQzVDO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EsU0FBUztBQUFBLElBQ1gsQ0FBQztBQUNELFFBQUksQ0FBQyxTQUFTO0FBQ1o7QUFBQSxJQUNGO0FBRUEsbUJBQWUsV0FBVyw2QkFBNkIsVUFBVSxLQUFLLGFBQWEsUUFBRztBQUN0RixtQ0FBK0I7QUFDL0IsVUFBTSxXQUFXLDhCQUE4QjtBQUFBLE1BQzdDO0FBQUEsTUFDQTtBQUFBLE1BQ0EsU0FBUztBQUFBLElBQ1gsQ0FBQztBQUVELFdBQU8sU0FBUyxZQUFZLFNBQVMsY0FBYyxVQUFVLEtBQUs7QUFBQSxXQWhFbEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlFRjtBQVdBLFNBQVMsaUNBQXVDO0FBQzlDLFFBQU0sc0JBQXNCLEtBQUssT0FBTyxHQUFHLDBCQUEwQiwwQkFBMEI7QUFDL0YsTUFBSSxDQUFDLFdBQVcsbUJBQW1CLEdBQUc7QUFDcEM7QUFBQSxFQUNGO0FBRUEsUUFBTSxNQUFNLEtBQUssSUFBSTtBQUNyQixhQUFXLGFBQWEsWUFBWSxtQkFBbUIsR0FBRztBQUN4RCxVQUFNLFlBQVksS0FBSyxxQkFBcUIsU0FBUztBQUNyRCxRQUFJO0FBQ0YsWUFBTSxRQUFRLFNBQVMsU0FBUztBQUNoQyxVQUFJLE1BQU0sTUFBTSxVQUFVLGtEQUFrRDtBQUMxRTtBQUFBLE1BQ0Y7QUFDQSxhQUFPLFdBQVcsRUFBRSxPQUFPLE1BQU0sV0FBVyxLQUFLLENBQUM7QUFBQSxJQUNwRCxRQUFRO0FBQUEsSUFFUjtBQUFBLEVBQ0Y7QUFDRjtBQWdCQSxTQUFTLHdCQUF3QixTQUFpQixXQUF5QjtBQUN6RSxRQUFNLGFBQWEsT0FBTyxRQUFRLGtCQUFrQjtBQUNwRCxRQUFNLE1BQU0sSUFBSSxPQUFPLFNBQVMsRUFBRSxJQUFJLFdBQVcsQ0FBQztBQUNsRCxNQUFJLGFBQWEsV0FBVyxJQUFJO0FBQ2xDO0FBYUEsU0FBUyw4QkFBOEIsUUFBcUQ7QUFDMUYsUUFBTSxFQUFFLFNBQVMsVUFBVSxRQUFRLElBQUk7QUFDdkMsUUFBTSxzQkFBc0IsS0FBSyxPQUFPLEdBQUcsMEJBQTBCLDBCQUEwQjtBQUMvRixZQUFVLHFCQUFxQixFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ2xELFFBQU0sa0JBQWtCLFlBQVksS0FBSyxxQkFBcUIsR0FBRyxRQUFRLElBQUksT0FBTyxHQUFHLENBQUM7QUFDeEYsUUFBTSxXQUFXLEtBQUssaUJBQWlCLEdBQUcsUUFBUSxJQUFJLE9BQU8sYUFBYTtBQUMxRSwwQkFBd0IsU0FBUyxRQUFRO0FBQ3pDLFNBQU87QUFDVDtBQWFBLGVBQWUsd0JBQXdCLFFBQStEO0FBQ3BHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixRQUFNLGNBQWMsS0FBSyxPQUFPLEdBQUcsMEJBQTBCLGtCQUFrQjtBQUMvRSxRQUFNLGNBQWMsS0FBSyxhQUFhLEdBQUcsUUFBUSxJQUFJLE9BQU8sTUFBTTtBQUNsRSxNQUFJLFdBQVcsV0FBVyxHQUFHO0FBQzNCLFdBQU8sYUFBYSxXQUFXO0FBQUEsRUFDakM7QUFFQSxpQkFBZSxXQUFXLDhCQUE4QixVQUFVLEtBQUssT0FBTyxRQUFHO0FBQ2pGLFFBQU0sV0FBVyxzQkFBc0IsSUFBSSxzQkFBc0IsT0FBTyxJQUFJLFFBQVEsZUFBZSxPQUFPO0FBQzFHLFFBQU0sV0FBVyxNQUFNLFdBQVc7QUFBQSxJQUNoQyxPQUFPO0FBQUEsSUFDUCxLQUFLO0FBQUEsRUFDUCxDQUFDO0FBQ0QsTUFBSSxTQUFTLFdBQVcsZ0JBQWdCO0FBQ3RDLDBCQUFzQixXQUFXLHlDQUF5QyxVQUFVLEtBQUssT0FBTyxHQUFHO0FBQ25HLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxVQUFVQyxRQUFPLEtBQUssU0FBUyxXQUFXO0FBQ2hELFlBQVUsYUFBYSxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQzFDLGdCQUFjLGFBQWEsT0FBTztBQUNsQyxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbIkJ1ZmZlciIsICJCdWZmZXIiXQp9Cg==
@@ -6,16 +6,17 @@
6
6
  *
7
7
  * A plugin can ship a curated demo vault at `demo-vault/` in its repo root. At release time this
8
8
  * module installs the freshly built plugin into that vault's `.obsidian/plugins/<id>/` folder and
9
- * zips the whole vault into `dist/build/<plugin-id>.demo-vault.zip`, so the existing GitHub-release
10
- * step (which uploads every file in `dist/build/`) attaches it automatically. The archive is named by
11
- * plugin id (not just `demo-vault`) so several plugins' demo vaults never collide.
9
+ * zips the whole vault into `dist/build/<plugin-id>-demo-vault-<version>.zip`, so the existing
10
+ * GitHub-release step (which uploads every file in `dist/build/`) attaches it automatically. The
11
+ * archive name carries the plugin id (so several plugins' demo vaults never collide) and the version
12
+ * (so each release ships its own distinctly named artifact).
12
13
  */
13
14
  /**
14
15
  * Archives the plugin's demo vault (`demo-vault/` in the repo root) as a release artifact.
15
16
  *
16
17
  * Installs the freshly built plugin from `dist/build/` into the vault's
17
18
  * `.obsidian/plugins/<id>/` folder, then zips the whole vault to
18
- * `dist/build/<plugin-id>.demo-vault.zip`.
19
+ * `dist/build/<plugin-id>-demo-vault-<version>.zip`.
19
20
  *
20
21
  * @returns A {@link Promise} that resolves to the absolute path of the created zip archive, or
21
22
  * `null` if the repo has no `demo-vault/` folder.
@@ -59,7 +59,7 @@ async function archivePluginDemoVault() {
59
59
  await cp(distBuildPath, pluginFolder, { recursive: true });
60
60
  await injectDemoVaultHelper();
61
61
  const zipPath = resolvePathFromRootSafe({
62
- path: join(ObsidianPluginRepoPaths.DistBuild, `${manifest.id}.demo-vault.zip`)
62
+ path: join(ObsidianPluginRepoPaths.DistBuild, `${manifest.id}-demo-vault-${manifest.version}.zip`)
63
63
  });
64
64
  const zip = new AdmZip();
65
65
  zip.addLocalFolder(demoVaultPath);
@@ -86,4 +86,4 @@ async function injectDemoVaultHelper() {
86
86
  export {
87
87
  archivePluginDemoVault
88
88
  };
89
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQXJjaGl2ZXMgYSBwbHVnaW4ncyBkZW1vIHZhdWx0IGFzIGEgcmVsZWFzZSBhcnRpZmFjdC5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIEF0IHJlbGVhc2UgdGltZSB0aGlzXG4gKiBtb2R1bGUgaW5zdGFsbHMgdGhlIGZyZXNobHkgYnVpbHQgcGx1Z2luIGludG8gdGhhdCB2YXVsdCdzIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+L2AgZm9sZGVyIGFuZFxuICogemlwcyB0aGUgd2hvbGUgdmF1bHQgaW50byBgZGlzdC9idWlsZC88cGx1Z2luLWlkPi5kZW1vLXZhdWx0LnppcGAsIHNvIHRoZSBleGlzdGluZyBHaXRIdWItcmVsZWFzZVxuICogc3RlcCAod2hpY2ggdXBsb2FkcyBldmVyeSBmaWxlIGluIGBkaXN0L2J1aWxkL2ApIGF0dGFjaGVzIGl0IGF1dG9tYXRpY2FsbHkuIFRoZSBhcmNoaXZlIGlzIG5hbWVkIGJ5XG4gKiBwbHVnaW4gaWQgKG5vdCBqdXN0IGBkZW1vLXZhdWx0YCkgc28gc2V2ZXJhbCBwbHVnaW5zJyBkZW1vIHZhdWx0cyBuZXZlciBjb2xsaWRlLlxuICovXG5cbmltcG9ydCBBZG1aaXAgZnJvbSAnYWRtLXppcCc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gJy4uL29ic2lkaWFuL3BsdWdpbi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBnZXRGb2xkZXJOYW1lLFxuICBqb2luXG59IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocyB9IGZyb20gJy4vb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0Um9vdEZvbGRlcixcbiAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmVcbn0gZnJvbSAnLi9yb290LnRzJztcblxuY29uc3QgREVNT19WQVVMVF9IRUxQRVJfUExVR0lOX0lEID0gJ2RlbW8tdmF1bHQtaGVscGVyJztcblxuLyoqXG4gKiBUaGUgbWluaW1hbCBzaGFwZSBvZiBhIHBsdWdpbiBgbWFuaWZlc3QuanNvbmAgcmVhZCBieSB7QGxpbmsgYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdH0uXG4gKi9cbmludGVyZmFjZSBQbHVnaW5NYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlkLCB1c2VkIGFzIHRoZSBmb2xkZXIgbmFtZSB1bmRlciBgZGVtby12YXVsdC8ub2JzaWRpYW4vcGx1Z2lucy9gLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcmNoaXZlcyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCAoYGRlbW8tdmF1bHQvYCBpbiB0aGUgcmVwbyByb290KSBhcyBhIHJlbGVhc2UgYXJ0aWZhY3QuXG4gKlxuICogSW5zdGFsbHMgdGhlIGZyZXNobHkgYnVpbHQgcGx1Z2luIGZyb20gYGRpc3QvYnVpbGQvYCBpbnRvIHRoZSB2YXVsdCdzXG4gKiBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPi9gIGZvbGRlciwgdGhlbiB6aXBzIHRoZSB3aG9sZSB2YXVsdCB0b1xuICogYGRpc3QvYnVpbGQvPHBsdWdpbi1pZD4uZGVtby12YXVsdC56aXBgLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGNyZWF0ZWQgemlwIGFyY2hpdmUsIG9yXG4gKiBgbnVsbGAgaWYgdGhlIHJlcG8gaGFzIG5vIGBkZW1vLXZhdWx0L2AgZm9sZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdCgpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgY29uc3QgZGVtb1ZhdWx0UGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0IH0pO1xuICBpZiAoIWV4aXN0c1N5bmMoZGVtb1ZhdWx0UGF0aCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uIH0pO1xuICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUobWFuaWZlc3RQYXRoLCAndXRmLTgnKSkgYXMgUGx1Z2luTWFuaWZlc3Q7XG5cbiAgY29uc3QgcGx1Z2luRm9sZGVyID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQsXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbixcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlBsdWdpbnMsXG4gICAgICBtYW5pZmVzdC5pZFxuICAgIClcbiAgfSk7XG4gIGF3YWl0IG1rZGlyKHBsdWdpbkZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgZGlzdEJ1aWxkUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkIH0pO1xuICBhd2FpdCBjcChkaXN0QnVpbGRQYXRoLCBwbHVnaW5Gb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGF3YWl0IGluamVjdERlbW9WYXVsdEhlbHBlcigpO1xuXG4gIC8vIEFyY2hpdmUgbmFtZSBpcyBoYW5kLXN5bmNlZCB3aXRoIHRoZSBydW50aW1lIGBvcGVuRGVtb1ZhdWx0YCBvcGVuZXIsIHdoaWNoIGRvd25sb2FkcyB0aGlzIGV4YWN0IGFzc2V0IG5hbWUuXG4gIGNvbnN0IHppcFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7XG4gICAgcGF0aDogam9pbihPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQsIGAke21hbmlmZXN0LmlkfS5kZW1vLXZhdWx0LnppcGApXG4gIH0pO1xuICBjb25zdCB6aXAgPSBuZXcgQWRtWmlwKCk7XG4gIHppcC5hZGRMb2NhbEZvbGRlcihkZW1vVmF1bHRQYXRoKTtcbiAgYXdhaXQgemlwLndyaXRlWmlwUHJvbWlzZSh6aXBQYXRoKTtcbiAgcmV0dXJuIHppcFBhdGg7XG59XG5cbi8vIEluamVjdHMgdGhlIGJ1aWx0LCBgb2JzaWRpYW4tZGV2LXV0aWxzYC1vd25lZCBgZGVtby12YXVsdC1oZWxwZXJgIGJvb3RzdHJhcCBwbHVnaW4gKHNoaXBwZWQgaW4gdGhpcyBwYWNrYWdlKSBpbnRvIHRoZSBkZW1vIHZhdWx0LCBzbyBubyBwZXItdmF1bHQgY29weSBpcyBjb21taXR0ZWQgYW5kIGFuIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGJ1bXAgcHJvcGFnYXRlcyBmaXhlcy5cbmFzeW5jIGZ1bmN0aW9uIGluamVjdERlbW9WYXVsdEhlbHBlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZUZvbGRlciA9IGdldFJvb3RGb2xkZXIoZ2V0Rm9sZGVyTmFtZShpbXBvcnQubWV0YS51cmwpKTtcbiAgaWYgKCFwYWNrYWdlRm9sZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgcmVzb2x2ZSB0aGUgb2JzaWRpYW4tZGV2LXV0aWxzIHBhY2thZ2UgZm9sZGVyIHRvIGluamVjdCB0aGUgZGVtby12YXVsdC1oZWxwZXIgcGx1Z2luLicpO1xuICB9XG5cbiAgY29uc3QgaGVscGVyU291cmNlUGF0aCA9IGpvaW4ocGFja2FnZUZvbGRlciwgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0RGVtb1ZhdWx0SGVscGVyKTtcbiAgY29uc3QgaGVscGVyRm9sZGVyID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQsXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbixcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlBsdWdpbnMsXG4gICAgICBERU1PX1ZBVUxUX0hFTFBFUl9QTFVHSU5fSURcbiAgICApXG4gIH0pO1xuICBhd2FpdCBta2RpcihoZWxwZXJGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBjcChoZWxwZXJTb3VyY2VQYXRoLCBoZWxwZXJGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZQSxPQUFPLFlBQVk7QUFDbkIsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUywrQkFBK0I7QUFDeEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGlDQUFpQztBQUMxQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLE1BQU0sOEJBQThCO0FBc0JwQyxlQUFzQix5QkFBaUQ7QUFDckUsUUFBTSxnQkFBZ0Isd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsVUFBVSxDQUFDO0FBQ3pGLE1BQUksQ0FBQyxXQUFXLGFBQWEsR0FBRztBQUM5QixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sZUFBZSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixhQUFhLENBQUM7QUFDM0YsUUFBTSxXQUFXLEtBQUssTUFBTSxNQUFNLFNBQVMsY0FBYyxPQUFPLENBQUM7QUFFakUsUUFBTSxlQUFlLHdCQUF3QjtBQUFBLElBQzNDLE1BQU07QUFBQSxNQUNKLHdCQUF3QjtBQUFBLE1BQ3hCLHdCQUF3QjtBQUFBLE1BQ3hCLHdCQUF3QjtBQUFBLE1BQ3hCLFNBQVM7QUFBQSxJQUNYO0FBQUEsRUFDRixDQUFDO0FBQ0QsUUFBTSxNQUFNLGNBQWMsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUU3QyxRQUFNLGdCQUFnQix3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixVQUFVLENBQUM7QUFDekYsUUFBTSxHQUFHLGVBQWUsY0FBYyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBRXpELFFBQU0sc0JBQXNCO0FBRzVCLFFBQU0sVUFBVSx3QkFBd0I7QUFBQSxJQUN0QyxNQUFNLEtBQUssd0JBQXdCLFdBQVcsR0FBRyxTQUFTLEVBQUUsaUJBQWlCO0FBQUEsRUFDL0UsQ0FBQztBQUNELFFBQU0sTUFBTSxJQUFJLE9BQU87QUFDdkIsTUFBSSxlQUFlLGFBQWE7QUFDaEMsUUFBTSxJQUFJLGdCQUFnQixPQUFPO0FBQ2pDLFNBQU87QUFDVDtBQUdBLGVBQWUsd0JBQXVDO0FBQ3BELFFBQU0sZ0JBQWdCLGNBQWMsY0FBYyxZQUFZLEdBQUcsQ0FBQztBQUNsRSxNQUFJLENBQUMsZUFBZTtBQUNsQixVQUFNLElBQUksTUFBTSxpR0FBaUc7QUFBQSxFQUNuSDtBQUVBLFFBQU0sbUJBQW1CLEtBQUssZUFBZSwwQkFBMEIsbUJBQW1CO0FBQzFGLFFBQU0sZUFBZSx3QkFBd0I7QUFBQSxJQUMzQyxNQUFNO0FBQUEsTUFDSix3QkFBd0I7QUFBQSxNQUN4Qix3QkFBd0I7QUFBQSxNQUN4Qix3QkFBd0I7QUFBQSxNQUN4QjtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFDRCxRQUFNLE1BQU0sY0FBYyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQzdDLFFBQU0sR0FBRyxrQkFBa0IsY0FBYyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQzlEOyIsCiAgIm5hbWVzIjogW10KfQo=
89
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQXJjaGl2ZXMgYSBwbHVnaW4ncyBkZW1vIHZhdWx0IGFzIGEgcmVsZWFzZSBhcnRpZmFjdC5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIEF0IHJlbGVhc2UgdGltZSB0aGlzXG4gKiBtb2R1bGUgaW5zdGFsbHMgdGhlIGZyZXNobHkgYnVpbHQgcGx1Z2luIGludG8gdGhhdCB2YXVsdCdzIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+L2AgZm9sZGVyIGFuZFxuICogemlwcyB0aGUgd2hvbGUgdmF1bHQgaW50byBgZGlzdC9idWlsZC88cGx1Z2luLWlkPi1kZW1vLXZhdWx0LTx2ZXJzaW9uPi56aXBgLCBzbyB0aGUgZXhpc3RpbmdcbiAqIEdpdEh1Yi1yZWxlYXNlIHN0ZXAgKHdoaWNoIHVwbG9hZHMgZXZlcnkgZmlsZSBpbiBgZGlzdC9idWlsZC9gKSBhdHRhY2hlcyBpdCBhdXRvbWF0aWNhbGx5LiBUaGVcbiAqIGFyY2hpdmUgbmFtZSBjYXJyaWVzIHRoZSBwbHVnaW4gaWQgKHNvIHNldmVyYWwgcGx1Z2lucycgZGVtbyB2YXVsdHMgbmV2ZXIgY29sbGlkZSkgYW5kIHRoZSB2ZXJzaW9uXG4gKiAoc28gZWFjaCByZWxlYXNlIHNoaXBzIGl0cyBvd24gZGlzdGluY3RseSBuYW1lZCBhcnRpZmFjdCkuXG4gKi9cblxuaW1wb3J0IEFkbVppcCBmcm9tICdhZG0temlwJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIGNwLFxuICBta2RpcixcbiAgcmVhZEZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4vcGx1Z2luL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIGdldEZvbGRlck5hbWUsXG4gIGpvaW5cbn0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQgeyBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIH0gZnJvbSAnLi9vYnNpZGlhbi1kZXYtdXRpbHMtcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBnZXRSb290Rm9sZGVyLFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICcuL3Jvb3QudHMnO1xuXG5jb25zdCBERU1PX1ZBVUxUX0hFTFBFUl9QTFVHSU5fSUQgPSAnZGVtby12YXVsdC1oZWxwZXInO1xuXG4vKipcbiAqIFRoZSBtaW5pbWFsIHNoYXBlIG9mIGEgcGx1Z2luIGBtYW5pZmVzdC5qc29uYCByZWFkIGJ5IHtAbGluayBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0fS5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbk1hbmlmZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQsIHVzZWQgYXMgdGhlIGZvbGRlciBuYW1lIHVuZGVyIGBkZW1vLXZhdWx0Ly5vYnNpZGlhbi9wbHVnaW5zL2AuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHZlcnNpb24sIGVtYmVkZGVkIGluIHRoZSBhcmNoaXZlIGZpbGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcmNoaXZlcyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCAoYGRlbW8tdmF1bHQvYCBpbiB0aGUgcmVwbyByb290KSBhcyBhIHJlbGVhc2UgYXJ0aWZhY3QuXG4gKlxuICogSW5zdGFsbHMgdGhlIGZyZXNobHkgYnVpbHQgcGx1Z2luIGZyb20gYGRpc3QvYnVpbGQvYCBpbnRvIHRoZSB2YXVsdCdzXG4gKiBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPi9gIGZvbGRlciwgdGhlbiB6aXBzIHRoZSB3aG9sZSB2YXVsdCB0b1xuICogYGRpc3QvYnVpbGQvPHBsdWdpbi1pZD4tZGVtby12YXVsdC08dmVyc2lvbj4uemlwYC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBjcmVhdGVkIHppcCBhcmNoaXZlLCBvclxuICogYG51bGxgIGlmIHRoZSByZXBvIGhhcyBubyBgZGVtby12YXVsdC9gIGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFyY2hpdmVQbHVnaW5EZW1vVmF1bHQoKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIGNvbnN0IGRlbW9WYXVsdFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCB9KTtcbiAgaWYgKCFleGlzdHNTeW5jKGRlbW9WYXVsdFBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtYW5pZmVzdFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbiB9KTtcbiAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuXG4gIGNvbnN0IHBsdWdpbkZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5QbHVnaW5zLFxuICAgICAgbWFuaWZlc3QuaWRcbiAgICApXG4gIH0pO1xuICBhd2FpdCBta2RpcihwbHVnaW5Gb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGRpc3RCdWlsZFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCB9KTtcbiAgYXdhaXQgY3AoZGlzdEJ1aWxkUGF0aCwgcGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBhd2FpdCBpbmplY3REZW1vVmF1bHRIZWxwZXIoKTtcblxuICAvLyBBcmNoaXZlIG5hbWUgaXMgaGFuZC1zeW5jZWQgd2l0aCB0aGUgcnVudGltZSBgb3BlbkRlbW9WYXVsdGAgb3BlbmVyLCB3aGljaCBkb3dubG9hZHMgdGhpcyBleGFjdCBhc3NldCBuYW1lLlxuICBjb25zdCB6aXBQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkLCBgJHttYW5pZmVzdC5pZH0tZGVtby12YXVsdC0ke21hbmlmZXN0LnZlcnNpb259LnppcGApXG4gIH0pO1xuICBjb25zdCB6aXAgPSBuZXcgQWRtWmlwKCk7XG4gIHppcC5hZGRMb2NhbEZvbGRlcihkZW1vVmF1bHRQYXRoKTtcbiAgYXdhaXQgemlwLndyaXRlWmlwUHJvbWlzZSh6aXBQYXRoKTtcbiAgcmV0dXJuIHppcFBhdGg7XG59XG5cbi8vIEluamVjdHMgdGhlIGJ1aWx0LCBgb2JzaWRpYW4tZGV2LXV0aWxzYC1vd25lZCBgZGVtby12YXVsdC1oZWxwZXJgIGJvb3RzdHJhcCBwbHVnaW4gKHNoaXBwZWQgaW4gdGhpcyBwYWNrYWdlKSBpbnRvIHRoZSBkZW1vIHZhdWx0LCBzbyBubyBwZXItdmF1bHQgY29weSBpcyBjb21taXR0ZWQgYW5kIGFuIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGJ1bXAgcHJvcGFnYXRlcyBmaXhlcy5cbmFzeW5jIGZ1bmN0aW9uIGluamVjdERlbW9WYXVsdEhlbHBlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZUZvbGRlciA9IGdldFJvb3RGb2xkZXIoZ2V0Rm9sZGVyTmFtZShpbXBvcnQubWV0YS51cmwpKTtcbiAgaWYgKCFwYWNrYWdlRm9sZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgcmVzb2x2ZSB0aGUgb2JzaWRpYW4tZGV2LXV0aWxzIHBhY2thZ2UgZm9sZGVyIHRvIGluamVjdCB0aGUgZGVtby12YXVsdC1oZWxwZXIgcGx1Z2luLicpO1xuICB9XG5cbiAgY29uc3QgaGVscGVyU291cmNlUGF0aCA9IGpvaW4ocGFja2FnZUZvbGRlciwgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0RGVtb1ZhdWx0SGVscGVyKTtcbiAgY29uc3QgaGVscGVyRm9sZGVyID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQsXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbixcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlBsdWdpbnMsXG4gICAgICBERU1PX1ZBVUxUX0hFTFBFUl9QTFVHSU5fSURcbiAgICApXG4gIH0pO1xuICBhd2FpdCBta2RpcihoZWxwZXJGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBjcChoZWxwZXJTb3VyY2VQYXRoLCBoZWxwZXJGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhQSxPQUFPLFlBQVk7QUFDbkIsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUywrQkFBK0I7QUFDeEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGlDQUFpQztBQUMxQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLE1BQU0sOEJBQThCO0FBMkJwQyxlQUFzQix5QkFBaUQ7QUFDckUsUUFBTSxnQkFBZ0Isd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsVUFBVSxDQUFDO0FBQ3pGLE1BQUksQ0FBQyxXQUFXLGFBQWEsR0FBRztBQUM5QixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sZUFBZSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixhQUFhLENBQUM7QUFDM0YsUUFBTSxXQUFXLEtBQUssTUFBTSxNQUFNLFNBQVMsY0FBYyxPQUFPLENBQUM7QUFFakUsUUFBTSxlQUFlLHdCQUF3QjtBQUFBLElBQzNDLE1BQU07QUFBQSxNQUNKLHdCQUF3QjtBQUFBLE1BQ3hCLHdCQUF3QjtBQUFBLE1BQ3hCLHdCQUF3QjtBQUFBLE1BQ3hCLFNBQVM7QUFBQSxJQUNYO0FBQUEsRUFDRixDQUFDO0FBQ0QsUUFBTSxNQUFNLGNBQWMsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUU3QyxRQUFNLGdCQUFnQix3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixVQUFVLENBQUM7QUFDekYsUUFBTSxHQUFHLGVBQWUsY0FBYyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBRXpELFFBQU0sc0JBQXNCO0FBRzVCLFFBQU0sVUFBVSx3QkFBd0I7QUFBQSxJQUN0QyxNQUFNLEtBQUssd0JBQXdCLFdBQVcsR0FBRyxTQUFTLEVBQUUsZUFBZSxTQUFTLE9BQU8sTUFBTTtBQUFBLEVBQ25HLENBQUM7QUFDRCxRQUFNLE1BQU0sSUFBSSxPQUFPO0FBQ3ZCLE1BQUksZUFBZSxhQUFhO0FBQ2hDLFFBQU0sSUFBSSxnQkFBZ0IsT0FBTztBQUNqQyxTQUFPO0FBQ1Q7QUFHQSxlQUFlLHdCQUF1QztBQUNwRCxRQUFNLGdCQUFnQixjQUFjLGNBQWMsWUFBWSxHQUFHLENBQUM7QUFDbEUsTUFBSSxDQUFDLGVBQWU7QUFDbEIsVUFBTSxJQUFJLE1BQU0saUdBQWlHO0FBQUEsRUFDbkg7QUFFQSxRQUFNLG1CQUFtQixLQUFLLGVBQWUsMEJBQTBCLG1CQUFtQjtBQUMxRixRQUFNLGVBQWUsd0JBQXdCO0FBQUEsSUFDM0MsTUFBTTtBQUFBLE1BQ0osd0JBQXdCO0FBQUEsTUFDeEIsd0JBQXdCO0FBQUEsTUFDeEIsd0JBQXdCO0FBQUEsTUFDeEI7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBQ0QsUUFBTSxNQUFNLGNBQWMsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUM3QyxRQUFNLEdBQUcsa0JBQWtCLGNBQWMsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUM5RDsiLAogICJuYW1lcyI6IFtdCn0K
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "87.1.2",
3
+ "version": "87.3.0",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development.",
5
5
  "keywords": [
6
6
  "obsidian"