├── .DS_Store
├── .eslintrc.json
├── .gitignore
├── README.md
├── data.json
├── demo.gif
├── main.js
├── manifest.json
├── package.json
├── rollup.config.js
├── settings.png
├── ship.sh
├── src
├── expander-plugin-settings.ts
├── expander-setting-tab.ts
├── main.js
└── main.ts
├── styles.css
├── tsconfig.json
└── yarn.lock
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akaalias/text-expander-plugin/b0271c2b7d8f77d59b52994992b4472bea5c8a5f/.DS_Store
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": true,
4 | "es2021": true
5 | },
6 | "extends": [
7 | "eslint:recommended",
8 | "plugin:@typescript-eslint/recommended"
9 | ],
10 | "parser": "@typescript-eslint/parser",
11 | "parserOptions": {
12 | "ecmaVersion": 12,
13 | "sourceType": "module"
14 | },
15 | "plugins": [
16 | "@typescript-eslint"
17 | ],
18 | "rules": {
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | # Intellij
3 | *.iml
4 | .idea
5 |
6 | # npm
7 | node_modules
8 | package-lock.json
9 |
10 | # build
11 | # main.js
12 | *.js.map
13 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Text-expander
2 |
3 | A bare-bones proof-of-concept implementation of a simple text-expander in Obsidian.
4 |
5 | 1. Uses `::` (two colons) to start the trigger-sequence
6 | 2. Define your own custom trigger keyword like `foo`
7 | 3. In the editor, type ::foo + ENTER (or Tab or Space) to expand
8 |
9 | Built-in is ::date which will expand to todays date such as `Mon Nov 09 2020` and ::time which will expand to your current timezone's time.
10 |
11 | ## Demo
12 |
13 | 
14 |
15 | ## Settings
16 |
17 | 
18 |
19 | ## Hacking and Help
20 | This is mostly a proof of concept for myself and it's rather, erm, "pragmatic" code. If you see something you'd like to change, let me know. Here's how you can fiddle around on your own yourself and send a pull-request
21 |
22 | ### Clone and make new branch
23 | - `cd $VAULT/.obsidian/plugins`
24 | - `git clone https://github.com/akaalias/text-expander-plugin`
25 | - `cd text-expander-plugin`
26 | - `git checkout -b my_branch`
27 | - `git remote add upstream https://github.com/akaalias/text-expander-plugin`
28 |
29 | ### Install deps
30 | - `npm i && npm install -g prettier && npm install -g eslint`
31 | - `npm run dev`
32 |
33 | ### Edit
34 | - `git checkout -b my_branch`
35 | - Make your edits
36 | - To check your changes, reload Obsidian (Command-R)
37 |
38 | ### Commit-prep
39 | - `./ship.sh` will prettify and elsint once again
40 | - `git add -p` to stage changes individually
41 | - `git commit -m "my message"`
42 |
43 | ### Publish pull request
44 | - `git push -u origin my_branch`
45 |
--------------------------------------------------------------------------------
/data.json:
--------------------------------------------------------------------------------
1 | {"triggerOneValue":"- [ ] ⭐️ Spirit: \n- [ ] 🏄 Health: \n- [ ] 🧡 Relationships: \n- [ ] 🏆 Wealth: ","triggerOneKeyword":"cats","triggerTwoKeyword":"table","triggerTwoValue":"| A | B | \n| -- | -- | \n| X | Y |","triggerThreeKeyword":"prompts","triggerThreeValue":"## What's important about this?\n## What questions remain?\n## What's related?"}
--------------------------------------------------------------------------------
/demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akaalias/text-expander-plugin/b0271c2b7d8f77d59b52994992b4472bea5c8a5f/demo.gif
--------------------------------------------------------------------------------
/main.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var obsidian = require('obsidian');
4 |
5 | /*! *****************************************************************************
6 | Copyright (c) Microsoft Corporation.
7 |
8 | Permission to use, copy, modify, and/or distribute this software for any
9 | purpose with or without fee is hereby granted.
10 |
11 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 | PERFORMANCE OF THIS SOFTWARE.
18 | ***************************************************************************** */
19 | /* global Reflect, Promise */
20 |
21 | var extendStatics = function(d, b) {
22 | extendStatics = Object.setPrototypeOf ||
23 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
24 | function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
25 | return extendStatics(d, b);
26 | };
27 |
28 | function __extends(d, b) {
29 | extendStatics(d, b);
30 | function __() { this.constructor = d; }
31 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
32 | }
33 |
34 | function __awaiter(thisArg, _arguments, P, generator) {
35 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
36 | return new (P || (P = Promise))(function (resolve, reject) {
37 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
38 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
39 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
40 | step((generator = generator.apply(thisArg, _arguments || [])).next());
41 | });
42 | }
43 |
44 | function __generator(thisArg, body) {
45 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
46 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
47 | function verb(n) { return function (v) { return step([n, v]); }; }
48 | function step(op) {
49 | if (f) throw new TypeError("Generator is already executing.");
50 | while (_) try {
51 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
52 | if (y = 0, t) op = [op[0] & 2, t.value];
53 | switch (op[0]) {
54 | case 0: case 1: t = op; break;
55 | case 4: _.label++; return { value: op[1], done: false };
56 | case 5: _.label++; y = op[1]; op = [0]; continue;
57 | case 7: op = _.ops.pop(); _.trys.pop(); continue;
58 | default:
59 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
60 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
61 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
62 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
63 | if (t[2]) _.ops.pop();
64 | _.trys.pop(); continue;
65 | }
66 | op = body.call(thisArg, _);
67 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
68 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
69 | }
70 | }
71 |
72 | var ExpanderSettingTab = /** @class */ (function (_super) {
73 | __extends(ExpanderSettingTab, _super);
74 | function ExpanderSettingTab(app, plugin) {
75 | var _this = _super.call(this, app, plugin) || this;
76 | _this.plugin = plugin;
77 | return _this;
78 | }
79 | ExpanderSettingTab.prototype.display = function () {
80 | var _this = this;
81 | var containerEl = this.containerEl;
82 | containerEl.empty();
83 | containerEl.createEl("h2", { text: "Expander Plugin - Custom Keywords" });
84 | containerEl.createEl("p", {
85 | text: "To start your expanders, type :: (colon-character twice) and then your keyword. Press [Enter], [Tab] or [Space] to fire the expansion. Built-in keywords are `date` (::date) and `time` (::time) which will expand to the current date and time respectively.",
86 | });
87 | new obsidian.Setting(containerEl)
88 | .setName("Trigger #1 Keyword")
89 | .setDesc("")
90 | .addText(function (text) {
91 | return text
92 | .setPlaceholder("foo (no colons needed)")
93 | .setValue(_this.plugin.settings.triggerOneKeyword)
94 | .onChange(function (value) {
95 | _this.plugin.settings.triggerOneKeyword = value;
96 | _this.plugin.saveData(_this.plugin.settings);
97 | });
98 | });
99 | new obsidian.Setting(containerEl)
100 | .setName("Trigger #1 Replacement")
101 | .setDesc("What keyword #1 should expand to")
102 | .addTextArea(function (text) {
103 | return text
104 | .setPlaceholder("")
105 | .setValue(_this.plugin.settings.triggerOneValue)
106 | .onChange(function (value) {
107 | _this.plugin.settings.triggerOneValue = value;
108 | _this.plugin.saveData(_this.plugin.settings);
109 | });
110 | });
111 | // custom trigger #2
112 | new obsidian.Setting(containerEl)
113 | .setName("Trigger #2 Keyword")
114 | .setDesc("")
115 | .addText(function (text) {
116 | return text
117 | .setPlaceholder("bar (no colons needed)")
118 | .setValue(_this.plugin.settings.triggerTwoKeyword)
119 | .onChange(function (value) {
120 | _this.plugin.settings.triggerTwoKeyword = value;
121 | _this.plugin.saveData(_this.plugin.settings);
122 | });
123 | });
124 | new obsidian.Setting(containerEl)
125 | .setName("Trigger #2 Replacement")
126 | .setDesc("What keyword #2 should expand to")
127 | .addTextArea(function (text) {
128 | return text
129 | .setPlaceholder("")
130 | .setValue(_this.plugin.settings.triggerTwoValue)
131 | .onChange(function (value) {
132 | _this.plugin.settings.triggerTwoValue = value;
133 | _this.plugin.saveData(_this.plugin.settings);
134 | });
135 | });
136 | // custom trigger #3
137 | new obsidian.Setting(containerEl)
138 | .setName("Trigger #3 Keyword")
139 | .setDesc("")
140 | .addText(function (text) {
141 | return text
142 | .setPlaceholder("baz (no colons needed)")
143 | .setValue(_this.plugin.settings.triggerThreeKeyword)
144 | .onChange(function (value) {
145 | _this.plugin.settings.triggerThreeKeyword = value;
146 | _this.plugin.saveData(_this.plugin.settings);
147 | });
148 | });
149 | new obsidian.Setting(containerEl)
150 | .setName("Trigger #3 Replacement")
151 | .setDesc("What keyword #3 should expand to")
152 | .addTextArea(function (text) {
153 | return text
154 | .setPlaceholder("")
155 | .setValue(_this.plugin.settings.triggerThreeValue)
156 | .onChange(function (value) {
157 | _this.plugin.settings.triggerThreeValue = value;
158 | _this.plugin.saveData(_this.plugin.settings);
159 | });
160 | });
161 | };
162 | return ExpanderSettingTab;
163 | }(obsidian.PluginSettingTab));
164 |
165 | var ExpanderPluginSettings = /** @class */ (function () {
166 | function ExpanderPluginSettings() {
167 | this.triggerOneValue = "";
168 | this.triggerOneKeyword = "";
169 | this.triggerTwoKeyword = "";
170 | this.triggerTwoValue = "";
171 | this.triggerThreeKeyword = "";
172 | this.triggerThreeValue = "";
173 | }
174 | return ExpanderPluginSettings;
175 | }());
176 |
177 | var ExpanderPlugin = /** @class */ (function (_super) {
178 | __extends(ExpanderPlugin, _super);
179 | function ExpanderPlugin() {
180 | var _this = _super !== null && _super.apply(this, arguments) || this;
181 | _this.handleKeyDown = function (cm, event) {
182 | if (!_this.listening) {
183 | if (event.key == ":") {
184 | // see if this is the second :
185 | var cursor = cm.getCursor();
186 | var previousPosition = {
187 | ch: cursor.ch - 1,
188 | line: cursor.line,
189 | sticky: "yes",
190 | };
191 | var range = cm.getRange(previousPosition, cursor);
192 | if ([":"].contains(range.charAt(0))) {
193 | _this.listening = true;
194 | _this.statusBar.setText("I'm listening...");
195 | }
196 | }
197 | }
198 | else if (event.key == "Enter" || event.key == "Tab" || event.key == " ") {
199 | var cursor = cm.getCursor();
200 | var line_1 = cursor.line;
201 | var lineString_1 = cm.getLine(line_1);
202 | var patterns = new Map();
203 | // default triggers
204 | var d = new Date();
205 | patterns.set("::date", d.toDateString());
206 | patterns.set("::time", d.toLocaleTimeString());
207 | // custom triggers
208 | if (_this.settings.triggerOneKeyword) {
209 | patterns.set("::" + _this.settings.triggerOneKeyword, _this.settings.triggerOneValue);
210 | }
211 | if (_this.settings.triggerTwoKeyword) {
212 | patterns.set("::" + _this.settings.triggerTwoKeyword, _this.settings.triggerTwoValue);
213 | }
214 | if (_this.settings.triggerThreeKeyword) {
215 | patterns.set("::" + _this.settings.triggerThreeKeyword, _this.settings.triggerThreeValue);
216 | }
217 | patterns.forEach(function (value, key) {
218 | var pattern = key;
219 | var regex = RegExp(pattern);
220 | if (regex.test(lineString_1)) {
221 | var patternMatchIndex = lineString_1.match(pattern).index;
222 | var patternLength = pattern.length;
223 | cm.replaceRange(value, { ch: patternMatchIndex, line: line_1 }, { ch: patternMatchIndex + patternLength, line: line_1 });
224 | }
225 | });
226 | _this.listening = false;
227 | _this.statusBar.setText("");
228 | }
229 | else if (event.key == "Escape") {
230 | _this.listening = false;
231 | _this.statusBar.setText("");
232 | }
233 | };
234 | return _this;
235 | }
236 | ExpanderPlugin.prototype.onload = function () {
237 | return __awaiter(this, void 0, void 0, function () {
238 | var _this = this;
239 | return __generator(this, function (_a) {
240 | this.loadSettings();
241 | this.addSettingTab(new ExpanderSettingTab(this.app, this));
242 | this.statusBar = this.addStatusBarItem();
243 | this.cmEditors = [];
244 | this.registerEvent(this.app.on("codemirror", function (cm) {
245 | _this.cmEditors.push(cm);
246 | cm.on("keydown", _this.handleKeyDown);
247 | }));
248 | return [2 /*return*/];
249 | });
250 | });
251 | };
252 | ExpanderPlugin.prototype.onunload = function () {
253 | var _this = this;
254 | console.log("unloading plugin");
255 | this.cmEditors.forEach(function (cm) {
256 | cm.off("keydown", _this.handleKeyDown);
257 | });
258 | };
259 | ExpanderPlugin.prototype.loadSettings = function () {
260 | return __awaiter(this, void 0, void 0, function () {
261 | var _this = this;
262 | return __generator(this, function (_a) {
263 | this.settings = new ExpanderPluginSettings();
264 | (function () { return __awaiter(_this, void 0, void 0, function () {
265 | var loadedSettings;
266 | return __generator(this, function (_a) {
267 | switch (_a.label) {
268 | case 0: return [4 /*yield*/, this.loadData()];
269 | case 1:
270 | loadedSettings = _a.sent();
271 | if (loadedSettings) {
272 | console.log("Found existing settings file");
273 | this.settings.triggerOneKeyword = loadedSettings.triggerOneKeyword;
274 | this.settings.triggerOneValue = loadedSettings.triggerOneValue;
275 | this.settings.triggerTwoKeyword = loadedSettings.triggerTwoKeyword;
276 | this.settings.triggerTwoValue = loadedSettings.triggerTwoValue;
277 | this.settings.triggerThreeKeyword = loadedSettings.triggerThreeKeyword;
278 | this.settings.triggerThreeValue = loadedSettings.triggerThreeValue;
279 | }
280 | else {
281 | console.log("No settings file found, saving...");
282 | this.saveData(this.settings);
283 | }
284 | return [2 /*return*/];
285 | }
286 | });
287 | }); })();
288 | return [2 /*return*/];
289 | });
290 | });
291 | };
292 | return ExpanderPlugin;
293 | }(obsidian.Plugin));
294 |
295 | module.exports = ExpanderPlugin;
296 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9leHBhbmRlci1zZXR0aW5nLXRhYi50cyIsInNyYy9leHBhbmRlci1wbHVnaW4tc2V0dGluZ3MudHMiLCJzcmMvbWFpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7XHJcbiAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7XHJcbiAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZU1hcC5zZXQocmVjZWl2ZXIsIHZhbHVlKTtcclxuICAgIHJldHVybiB2YWx1ZTtcclxufVxyXG4iLCJpbXBvcnQgeyBBcHAsIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCBFeHBhbmRlclBsdWdpbiBmcm9tIFwiLi9tYWluXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4cGFuZGVyU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogRXhwYW5kZXJQbHVnaW47XG5cbiAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogRXhwYW5kZXJQbHVnaW4pIHtcbiAgICBzdXBlcihhcHAsIHBsdWdpbik7XG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gIH1cblxuICBkaXNwbGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XG5cbiAgICBjb250YWluZXJFbC5lbXB0eSgpO1xuXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiRXhwYW5kZXIgUGx1Z2luIC0gQ3VzdG9tIEtleXdvcmRzXCIgfSk7XG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIsIHtcbiAgICAgIHRleHQ6XG4gICAgICAgIFwiVG8gc3RhcnQgeW91ciBleHBhbmRlcnMsIHR5cGUgOjogKGNvbG9uLWNoYXJhY3RlciB0d2ljZSkgYW5kIHRoZW4geW91ciBrZXl3b3JkLiBQcmVzcyBbRW50ZXJdLCBbVGFiXSBvciBbU3BhY2VdIHRvIGZpcmUgdGhlIGV4cGFuc2lvbi4gQnVpbHQtaW4ga2V5d29yZHMgYXJlIGBkYXRlYCAoOjpkYXRlKSBhbmQgYHRpbWVgICg6OnRpbWUpIHdoaWNoIHdpbGwgZXhwYW5kIHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgcmVzcGVjdGl2ZWx5LlwiLFxuICAgIH0pO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZShcIlRyaWdnZXIgIzEgS2V5d29yZFwiKVxuICAgICAgLnNldERlc2MoXCJcIilcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICB0ZXh0XG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiZm9vIChubyBjb2xvbnMgbmVlZGVkKVwiKVxuICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy50cmlnZ2VyT25lS2V5d29yZClcbiAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy50cmlnZ2VyT25lS2V5d29yZCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZShcIlRyaWdnZXIgIzEgUmVwbGFjZW1lbnRcIilcbiAgICAgIC5zZXREZXNjKFwiV2hhdCBrZXl3b3JkICMxIHNob3VsZCBleHBhbmQgdG9cIilcbiAgICAgIC5hZGRUZXh0QXJlYSgodGV4dCkgPT5cbiAgICAgICAgdGV4dFxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIlwiKVxuICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy50cmlnZ2VyT25lVmFsdWUpXG4gICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudHJpZ2dlck9uZVZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAvLyBjdXN0b20gdHJpZ2dlciAjMlxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoXCJUcmlnZ2VyICMyIEtleXdvcmRcIilcbiAgICAgIC5zZXREZXNjKFwiXCIpXG4gICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgdGV4dFxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcImJhciAobm8gY29sb25zIG5lZWRlZClcIilcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudHJpZ2dlclR3b0tleXdvcmQpXG4gICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudHJpZ2dlclR3b0tleXdvcmQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoXCJUcmlnZ2VyICMyIFJlcGxhY2VtZW50XCIpXG4gICAgICAuc2V0RGVzYyhcIldoYXQga2V5d29yZCAjMiBzaG91bGQgZXhwYW5kIHRvXCIpXG4gICAgICAuYWRkVGV4dEFyZWEoKHRleHQpID0+XG4gICAgICAgIHRleHRcbiAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJcIilcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudHJpZ2dlclR3b1ZhbHVlKVxuICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnRyaWdnZXJUd29WYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgLy8gY3VzdG9tIHRyaWdnZXIgIzNcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKFwiVHJpZ2dlciAjMyBLZXl3b3JkXCIpXG4gICAgICAuc2V0RGVzYyhcIlwiKVxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgIHRleHRcbiAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJiYXogKG5vIGNvbG9ucyBuZWVkZWQpXCIpXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRyaWdnZXJUaHJlZUtleXdvcmQpXG4gICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudHJpZ2dlclRocmVlS2V5d29yZCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZShcIlRyaWdnZXIgIzMgUmVwbGFjZW1lbnRcIilcbiAgICAgIC5zZXREZXNjKFwiV2hhdCBrZXl3b3JkICMzIHNob3VsZCBleHBhbmQgdG9cIilcbiAgICAgIC5hZGRUZXh0QXJlYSgodGV4dCkgPT5cbiAgICAgICAgdGV4dFxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIlwiKVxuICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy50cmlnZ2VyVGhyZWVWYWx1ZSlcbiAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy50cmlnZ2VyVGhyZWVWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBFeHBhbmRlclBsdWdpblNldHRpbmdzIHtcbiAgcHVibGljIHRyaWdnZXJPbmVWYWx1ZTogc3RyaW5nO1xuXG4gIHB1YmxpYyB0cmlnZ2VyT25lS2V5d29yZDogc3RyaW5nO1xuXG4gIHB1YmxpYyB0cmlnZ2VyVHdvS2V5d29yZDogc3RyaW5nO1xuXG4gIHB1YmxpYyB0cmlnZ2VyVHdvVmFsdWU6IHN0cmluZztcblxuICBwdWJsaWMgdHJpZ2dlclRocmVlS2V5d29yZDogc3RyaW5nO1xuXG4gIHB1YmxpYyB0cmlnZ2VyVGhyZWVWYWx1ZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudHJpZ2dlck9uZVZhbHVlID0gXCJcIjtcbiAgICB0aGlzLnRyaWdnZXJPbmVLZXl3b3JkID0gXCJcIjtcbiAgICB0aGlzLnRyaWdnZXJUd29LZXl3b3JkID0gXCJcIjtcbiAgICB0aGlzLnRyaWdnZXJUd29WYWx1ZSA9IFwiXCI7XG4gICAgdGhpcy50cmlnZ2VyVGhyZWVLZXl3b3JkID0gXCJcIjtcbiAgICB0aGlzLnRyaWdnZXJUaHJlZVZhbHVlID0gXCJcIjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgRXhwYW5kZXJTZXR0aW5nVGFiIGZyb20gXCIuL2V4cGFuZGVyLXNldHRpbmctdGFiXCI7XG5pbXBvcnQgRXhwYW5kZXJQbHVnaW5TZXR0aW5ncyBmcm9tIFwiLi9leHBhbmRlci1wbHVnaW4tc2V0dGluZ3NcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXhwYW5kZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBwdWJsaWMgc2V0dGluZ3M6IEV4cGFuZGVyUGx1Z2luU2V0dGluZ3M7XG5cbiAgcHJpdmF0ZSBjbUVkaXRvcnM6IENvZGVNaXJyb3IuRWRpdG9yW107XG5cbiAgcHJpdmF0ZSBzdGF0dXNCYXI6IEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgbGlzdGVuaW5nOiBib29sZWFuO1xuXG4gIHB1YmxpYyBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2FkU2V0dGluZ3MoKTtcbiAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IEV4cGFuZGVyU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG4gICAgdGhpcy5zdGF0dXNCYXIgPSB0aGlzLmFkZFN0YXR1c0Jhckl0ZW0oKTtcblxuICAgIHRoaXMuY21FZGl0b3JzID0gW107XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KFxuICAgICAgdGhpcy5hcHAub24oXCJjb2RlbWlycm9yXCIsIChjbTogQ29kZU1pcnJvci5FZGl0b3IpID0+IHtcbiAgICAgICAgdGhpcy5jbUVkaXRvcnMucHVzaChjbSk7XG4gICAgICAgIGNtLm9uKFwia2V5ZG93blwiLCB0aGlzLmhhbmRsZUtleURvd24pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwidW5sb2FkaW5nIHBsdWdpblwiKTtcblxuICAgIHRoaXMuY21FZGl0b3JzLmZvckVhY2goKGNtKSA9PiB7XG4gICAgICBjbS5vZmYoXCJrZXlkb3duXCIsIHRoaXMuaGFuZGxlS2V5RG93bik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNldHRpbmdzID0gbmV3IEV4cGFuZGVyUGx1Z2luU2V0dGluZ3MoKTtcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbG9hZGVkU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XG4gICAgICBpZiAobG9hZGVkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJGb3VuZCBleGlzdGluZyBzZXR0aW5ncyBmaWxlXCIpO1xuICAgICAgICB0aGlzLnNldHRpbmdzLnRyaWdnZXJPbmVLZXl3b3JkID0gbG9hZGVkU2V0dGluZ3MudHJpZ2dlck9uZUtleXdvcmQ7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MudHJpZ2dlck9uZVZhbHVlID0gbG9hZGVkU2V0dGluZ3MudHJpZ2dlck9uZVZhbHVlO1xuXG4gICAgICAgIHRoaXMuc2V0dGluZ3MudHJpZ2dlclR3b0tleXdvcmQgPSBsb2FkZWRTZXR0aW5ncy50cmlnZ2VyVHdvS2V5d29yZDtcbiAgICAgICAgdGhpcy5zZXR0aW5ncy50cmlnZ2VyVHdvVmFsdWUgPSBsb2FkZWRTZXR0aW5ncy50cmlnZ2VyVHdvVmFsdWU7XG5cbiAgICAgICAgdGhpcy5zZXR0aW5ncy50cmlnZ2VyVGhyZWVLZXl3b3JkID0gbG9hZGVkU2V0dGluZ3MudHJpZ2dlclRocmVlS2V5d29yZDtcbiAgICAgICAgdGhpcy5zZXR0aW5ncy50cmlnZ2VyVGhyZWVWYWx1ZSA9IGxvYWRlZFNldHRpbmdzLnRyaWdnZXJUaHJlZVZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJObyBzZXR0aW5ncyBmaWxlIGZvdW5kLCBzYXZpbmcuLi5cIik7XG4gICAgICAgIHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlS2V5RG93biA9IChcbiAgICBjbTogQ29kZU1pcnJvci5FZGl0b3IsXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnRcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKCF0aGlzLmxpc3RlbmluZykge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PSBcIjpcIikge1xuICAgICAgICAvLyBzZWUgaWYgdGhpcyBpcyB0aGUgc2Vjb25kIDpcbiAgICAgICAgY29uc3QgY3Vyc29yID0gY20uZ2V0Q3Vyc29yKCk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSB7XG4gICAgICAgICAgY2g6IGN1cnNvci5jaCAtIDEsXG4gICAgICAgICAgbGluZTogY3Vyc29yLmxpbmUsXG4gICAgICAgICAgc3RpY2t5OiBcInllc1wiLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByYW5nZSA9IGNtLmdldFJhbmdlKHByZXZpb3VzUG9zaXRpb24sIGN1cnNvcik7XG5cbiAgICAgICAgaWYgKFtcIjpcIl0uY29udGFpbnMocmFuZ2UuY2hhckF0KDApKSkge1xuICAgICAgICAgIHRoaXMubGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnN0YXR1c0Jhci5zZXRUZXh0KFwiSSdtIGxpc3RlbmluZy4uLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09IFwiRW50ZXJcIiB8fCBldmVudC5rZXkgPT0gXCJUYWJcIiB8fCBldmVudC5rZXkgPT0gXCIgXCIpIHtcbiAgICAgIGNvbnN0IGN1cnNvciA9IGNtLmdldEN1cnNvcigpO1xuICAgICAgY29uc3QgeyBsaW5lIH0gPSBjdXJzb3I7XG4gICAgICBjb25zdCBsaW5lU3RyaW5nID0gY20uZ2V0TGluZShsaW5lKTtcblxuICAgICAgY29uc3QgcGF0dGVybnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gICAgICAvLyBkZWZhdWx0IHRyaWdnZXJzXG4gICAgICBjb25zdCBkID0gbmV3IERhdGUoKTtcbiAgICAgIHBhdHRlcm5zLnNldChcIjo6ZGF0ZVwiLCBkLnRvRGF0ZVN0cmluZygpKTtcbiAgICAgIHBhdHRlcm5zLnNldChcIjo6dGltZVwiLCBkLnRvTG9jYWxlVGltZVN0cmluZygpKTtcblxuICAgICAgLy8gY3VzdG9tIHRyaWdnZXJzXG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy50cmlnZ2VyT25lS2V5d29yZCkge1xuICAgICAgICBwYXR0ZXJucy5zZXQoXG4gICAgICAgICAgYDo6JHt0aGlzLnNldHRpbmdzLnRyaWdnZXJPbmVLZXl3b3JkfWAsXG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy50cmlnZ2VyT25lVmFsdWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2V0dGluZ3MudHJpZ2dlclR3b0tleXdvcmQpIHtcbiAgICAgICAgcGF0dGVybnMuc2V0KFxuICAgICAgICAgIGA6OiR7dGhpcy5zZXR0aW5ncy50cmlnZ2VyVHdvS2V5d29yZH1gLFxuICAgICAgICAgIHRoaXMuc2V0dGluZ3MudHJpZ2dlclR3b1ZhbHVlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLnRyaWdnZXJUaHJlZUtleXdvcmQpIHtcbiAgICAgICAgcGF0dGVybnMuc2V0KFxuICAgICAgICAgIGA6OiR7dGhpcy5zZXR0aW5ncy50cmlnZ2VyVGhyZWVLZXl3b3JkfWAsXG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy50cmlnZ2VyVGhyZWVWYWx1ZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwYXR0ZXJucy5mb3JFYWNoKCh2YWx1ZTogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0ga2V5O1xuICAgICAgICBjb25zdCByZWdleCA9IFJlZ0V4cChwYXR0ZXJuKTtcblxuICAgICAgICBpZiAocmVnZXgudGVzdChsaW5lU3RyaW5nKSkge1xuICAgICAgICAgIGNvbnN0IHBhdHRlcm5NYXRjaEluZGV4ID0gbGluZVN0cmluZy5tYXRjaChwYXR0ZXJuKS5pbmRleDtcbiAgICAgICAgICBjb25zdCBwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi5sZW5ndGg7XG5cbiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHsgY2g6IHBhdHRlcm5NYXRjaEluZGV4LCBsaW5lIH0sXG4gICAgICAgICAgICB7IGNoOiBwYXR0ZXJuTWF0Y2hJbmRleCArIHBhdHRlcm5MZW5ndGgsIGxpbmUgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxpc3RlbmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zdGF0dXNCYXIuc2V0VGV4dChcIlwiKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PSBcIkVzY2FwZVwiKSB7XG4gICAgICB0aGlzLmxpc3RlbmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zdGF0dXNCYXIuc2V0VGV4dChcIlwiKTtcbiAgICB9XG4gIH07XG59XG4iXSwibmFtZXMiOlsiU2V0dGluZyIsIlBsdWdpblNldHRpbmdUYWIiLCJQbHVnaW4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuQyxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsY0FBYztBQUN6QyxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxZQUFZLEtBQUssSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDcEYsUUFBUSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDMUcsSUFBSSxPQUFPLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDO0FBQ0Y7QUFDTyxTQUFTLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLElBQUksYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4QixJQUFJLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUMzQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDekYsQ0FBQztBQXVDRDtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDbkcsUUFBUSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDdEcsUUFBUSxTQUFTLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDdEgsUUFBUSxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUUsS0FBSyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBQ0Q7QUFDTyxTQUFTLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFO0FBQzNDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNySCxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLE1BQU0sS0FBSyxVQUFVLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdKLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxVQUFVLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdEUsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLEVBQUU7QUFDdEIsUUFBUSxJQUFJLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFDdEUsUUFBUSxPQUFPLENBQUMsRUFBRSxJQUFJO0FBQ3RCLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxD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
297 |
--------------------------------------------------------------------------------
/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "obsidian-text-expander-plugin",
3 | "name": "Text Expander",
4 | "version": "0.0.2",
5 | "description": "A bare-bones and opinionated proof-of-concept text expander utility for Obsidian",
6 | "author": "Alexis Rondeau",
7 | "authorUrl": "https://publish.obsidian.md/alexisrondeau",
8 | "isDesktopOnly": false
9 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "obsidian-text-expander-plugin",
3 | "version": "0.0.2",
4 | "description": "A bare-bones and opinionated proof-of-concept text expander utility for Obsidian",
5 | "main": "main.js",
6 | "scripts": {
7 | "dev": "rollup --config rollup.config.js -w",
8 | "build": "rollup --config rollup.config.js",
9 | "prettier": "prettier --write 'src/**/*.+(ts|tsx|json|html|css)'",
10 | "eslint": "eslint . --ext .ts,.tsx --fix"
11 | },
12 | "keywords": [],
13 | "author": "",
14 | "license": "MIT",
15 | "devDependencies": {
16 | "@rollup/plugin-commonjs": "^15.1.0",
17 | "@rollup/plugin-node-resolve": "^9.0.0",
18 | "@rollup/plugin-typescript": "^6.0.0",
19 | "@types/node": "^14.14.2",
20 | "@typescript-eslint/eslint-plugin": "^4.7.0",
21 | "@typescript-eslint/parser": "^4.7.0",
22 | "eslint": "^7.12.1",
23 | "eslint-config-airbnb-base": "^14.2.1",
24 | "eslint-plugin-babel": "5.3.1",
25 | "eslint-plugin-import": "^2.22.1",
26 | "eslint-plugin-jsdoc": "30.7.3",
27 | "eslint-plugin-prefer-arrow": "1.2.2",
28 | "eslint-plugin-simple-import-sort": "5.0.3",
29 | "obsidian": "https://github.com/obsidianmd/obsidian-api/tarball/master",
30 | "rollup": "^2.32.1",
31 | "tslib": "^2.0.3",
32 | "typescript": "^4.0.3"
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/rollup.config.js:
--------------------------------------------------------------------------------
1 | import typescript from '@rollup/plugin-typescript';
2 | import {nodeResolve} from '@rollup/plugin-node-resolve';
3 | import commonjs from '@rollup/plugin-commonjs';
4 |
5 | export default {
6 | input: 'src/main.ts',
7 | output: {
8 | dir: '.',
9 | sourcemap: 'inline',
10 | format: 'cjs',
11 | exports: 'default'
12 | },
13 | external: ['obsidian'],
14 | plugins: [
15 | typescript(),
16 | nodeResolve({browser: true}),
17 | commonjs(),
18 | ]
19 | };
20 |
21 |
--------------------------------------------------------------------------------
/settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akaalias/text-expander-plugin/b0271c2b7d8f77d59b52994992b4472bea5c8a5f/settings.png
--------------------------------------------------------------------------------
/ship.sh:
--------------------------------------------------------------------------------
1 | #!/bin/zsh
2 |
3 | npm run prettier
4 | npm run eslint
5 | git status
6 |
--------------------------------------------------------------------------------
/src/expander-plugin-settings.ts:
--------------------------------------------------------------------------------
1 | export default class ExpanderPluginSettings {
2 | public triggerOneValue: string;
3 |
4 | public triggerOneKeyword: string;
5 |
6 | public triggerTwoKeyword: string;
7 |
8 | public triggerTwoValue: string;
9 |
10 | public triggerThreeKeyword: string;
11 |
12 | public triggerThreeValue: string;
13 |
14 | constructor() {
15 | this.triggerOneValue = "";
16 | this.triggerOneKeyword = "";
17 | this.triggerTwoKeyword = "";
18 | this.triggerTwoValue = "";
19 | this.triggerThreeKeyword = "";
20 | this.triggerThreeValue = "";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/expander-setting-tab.ts:
--------------------------------------------------------------------------------
1 | import { App, PluginSettingTab, Setting } from "obsidian";
2 | import ExpanderPlugin from "./main";
3 |
4 | export default class ExpanderSettingTab extends PluginSettingTab {
5 | private readonly plugin: ExpanderPlugin;
6 |
7 | constructor(app: App, plugin: ExpanderPlugin) {
8 | super(app, plugin);
9 | this.plugin = plugin;
10 | }
11 |
12 | display(): void {
13 | const { containerEl } = this;
14 |
15 | containerEl.empty();
16 |
17 | containerEl.createEl("h2", { text: "Expander Plugin - Custom Keywords" });
18 | containerEl.createEl("p", {
19 | text:
20 | "To start your expanders, type :: (colon-character twice) and then your keyword. Press [Enter], [Tab] or [Space] to fire the expansion. Built-in keywords are `date` (::date) and `time` (::time) which will expand to the current date and time respectively.",
21 | });
22 |
23 | new Setting(containerEl)
24 | .setName("Trigger #1 Keyword")
25 | .setDesc("")
26 | .addText((text) =>
27 | text
28 | .setPlaceholder("foo (no colons needed)")
29 | .setValue(this.plugin.settings.triggerOneKeyword)
30 | .onChange((value) => {
31 | this.plugin.settings.triggerOneKeyword = value;
32 | this.plugin.saveData(this.plugin.settings);
33 | })
34 | );
35 |
36 | new Setting(containerEl)
37 | .setName("Trigger #1 Replacement")
38 | .setDesc("What keyword #1 should expand to")
39 | .addTextArea((text) =>
40 | text
41 | .setPlaceholder("")
42 | .setValue(this.plugin.settings.triggerOneValue)
43 | .onChange((value) => {
44 | this.plugin.settings.triggerOneValue = value;
45 | this.plugin.saveData(this.plugin.settings);
46 | })
47 | );
48 |
49 | // custom trigger #2
50 | new Setting(containerEl)
51 | .setName("Trigger #2 Keyword")
52 | .setDesc("")
53 | .addText((text) =>
54 | text
55 | .setPlaceholder("bar (no colons needed)")
56 | .setValue(this.plugin.settings.triggerTwoKeyword)
57 | .onChange((value) => {
58 | this.plugin.settings.triggerTwoKeyword = value;
59 | this.plugin.saveData(this.plugin.settings);
60 | })
61 | );
62 |
63 | new Setting(containerEl)
64 | .setName("Trigger #2 Replacement")
65 | .setDesc("What keyword #2 should expand to")
66 | .addTextArea((text) =>
67 | text
68 | .setPlaceholder("")
69 | .setValue(this.plugin.settings.triggerTwoValue)
70 | .onChange((value) => {
71 | this.plugin.settings.triggerTwoValue = value;
72 | this.plugin.saveData(this.plugin.settings);
73 | })
74 | );
75 |
76 | // custom trigger #3
77 | new Setting(containerEl)
78 | .setName("Trigger #3 Keyword")
79 | .setDesc("")
80 | .addText((text) =>
81 | text
82 | .setPlaceholder("baz (no colons needed)")
83 | .setValue(this.plugin.settings.triggerThreeKeyword)
84 | .onChange((value) => {
85 | this.plugin.settings.triggerThreeKeyword = value;
86 | this.plugin.saveData(this.plugin.settings);
87 | })
88 | );
89 |
90 | new Setting(containerEl)
91 | .setName("Trigger #3 Replacement")
92 | .setDesc("What keyword #3 should expand to")
93 | .addTextArea((text) =>
94 | text
95 | .setPlaceholder("")
96 | .setValue(this.plugin.settings.triggerThreeValue)
97 | .onChange((value) => {
98 | this.plugin.settings.triggerThreeValue = value;
99 | this.plugin.saveData(this.plugin.settings);
100 | })
101 | );
102 | }
103 | }
104 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var obsidian = require('obsidian');
4 |
5 | /*! *****************************************************************************
6 | Copyright (c) Microsoft Corporation.
7 |
8 | Permission to use, copy, modify, and/or distribute this software for any
9 | purpose with or without fee is hereby granted.
10 |
11 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 | PERFORMANCE OF THIS SOFTWARE.
18 | ***************************************************************************** */
19 | /* global Reflect, Promise */
20 |
21 | var extendStatics = function(d, b) {
22 | extendStatics = Object.setPrototypeOf ||
23 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
24 | function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
25 | return extendStatics(d, b);
26 | };
27 |
28 | function __extends(d, b) {
29 | extendStatics(d, b);
30 | function __() { this.constructor = d; }
31 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
32 | }
33 |
34 | function __awaiter(thisArg, _arguments, P, generator) {
35 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
36 | return new (P || (P = Promise))(function (resolve, reject) {
37 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
38 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
39 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
40 | step((generator = generator.apply(thisArg, _arguments || [])).next());
41 | });
42 | }
43 |
44 | function __generator(thisArg, body) {
45 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
46 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
47 | function verb(n) { return function (v) { return step([n, v]); }; }
48 | function step(op) {
49 | if (f) throw new TypeError("Generator is already executing.");
50 | while (_) try {
51 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
52 | if (y = 0, t) op = [op[0] & 2, t.value];
53 | switch (op[0]) {
54 | case 0: case 1: t = op; break;
55 | case 4: _.label++; return { value: op[1], done: false };
56 | case 5: _.label++; y = op[1]; op = [0]; continue;
57 | case 7: op = _.ops.pop(); _.trys.pop(); continue;
58 | default:
59 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
60 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
61 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
62 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
63 | if (t[2]) _.ops.pop();
64 | _.trys.pop(); continue;
65 | }
66 | op = body.call(thisArg, _);
67 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
68 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
69 | }
70 | }
71 |
72 | var ExpanderPlugin = /** @class */ (function (_super) {
73 | __extends(ExpanderPlugin, _super);
74 | function ExpanderPlugin() {
75 | var _this = _super !== null && _super.apply(this, arguments) || this;
76 | _this.handleKeyDown = function (cm, event) {
77 | if (!_this.listening) {
78 | if (event.key == ':') {
79 | //see if this is the second :
80 | var cursor = cm.getCursor();
81 | var line = cursor.line;
82 | var previousPosition = { ch: cursor.ch - 1, line: cursor.line, sticky: 'yes' };
83 | var range = cm.getRange(previousPosition, cursor);
84 | if ([':'].contains(range.charAt(0))) {
85 | _this.listening = true;
86 | _this.statusBar.setText("I'm listening...");
87 | }
88 | }
89 | }
90 | else if (event.key == 'Enter' || event.key == 'Tab' || event.key == ' ') {
91 | var cursor = cm.getCursor();
92 | var line_1 = cursor.line;
93 | var lineString_1 = cm.getLine(line_1);
94 | var patterns = new Map();
95 | // default triggers
96 | patterns.set("::date", new Date().toDateString());
97 | //custom triggers
98 | if (_this.settings.triggerOneKeyword) {
99 | patterns.set("::" + _this.settings.triggerOneKeyword, _this.settings.triggerOneValue);
100 | }
101 | if (_this.settings.triggerTwoKeyword) {
102 | patterns.set("::" + _this.settings.triggerTwoKeyword, _this.settings.triggerTwoValue);
103 | }
104 | patterns.forEach(function (value, key) {
105 | var pattern = key;
106 | var regex = RegExp(pattern);
107 | if (regex.test(lineString_1)) {
108 | var patternMatchIndex = lineString_1.match(pattern).index;
109 | var patternLength = pattern.length;
110 | cm.replaceRange(value, { ch: patternMatchIndex, line: line_1 }, { ch: patternMatchIndex + patternLength, line: line_1 });
111 | }
112 | });
113 | _this.listening = false;
114 | _this.statusBar.setText("");
115 | }
116 | else if (event.key == 'Escape') {
117 | _this.listening = false;
118 | _this.statusBar.setText("");
119 | }
120 | };
121 | return _this;
122 | }
123 | ExpanderPlugin.prototype.onload = function () {
124 | var _this = this;
125 | this.loadSettings();
126 | this.addSettingTab(new ExpanderSettingTab(this.app, this));
127 | this.statusBar = this.addStatusBarItem();
128 | this.cmEditors = [];
129 | this.registerEvent(this.app.on('codemirror', function (cm) {
130 | _this.cmEditors.push(cm);
131 | cm.on('keydown', _this.handleKeyDown);
132 | }));
133 | };
134 | ExpanderPlugin.prototype.onunload = function () {
135 | var _this = this;
136 | console.log('unloading plugin');
137 | this.cmEditors.forEach(function (cm) {
138 | cm.off('keydown', _this.handleKeyDown);
139 | });
140 | };
141 | ExpanderPlugin.prototype.loadSettings = function () {
142 | return __awaiter(this, void 0, void 0, function () {
143 | var _this = this;
144 | return __generator(this, function (_a) {
145 | this.settings = new ExpanderPluginSettings();
146 | (function () { return __awaiter(_this, void 0, void 0, function () {
147 | var loadedSettings;
148 | return __generator(this, function (_a) {
149 | switch (_a.label) {
150 | case 0: return [4 /*yield*/, this.loadData()];
151 | case 1:
152 | loadedSettings = _a.sent();
153 | if (loadedSettings) {
154 | console.log('Found existing settings file');
155 | this.settings.triggerOneKeyword = loadedSettings.triggerOneKeyword;
156 | this.settings.triggerOneValue = loadedSettings.triggerOneValue;
157 | this.settings.triggerTwoKeyword = loadedSettings.triggerTwoKeyword;
158 | this.settings.triggerTwoValue = loadedSettings.triggerTwoValue;
159 | }
160 | else {
161 | console.log('No settings file found, saving...');
162 | this.saveData(this.settings);
163 | }
164 | return [2 /*return*/];
165 | }
166 | });
167 | }); })();
168 | return [2 /*return*/];
169 | });
170 | });
171 | };
172 | return ExpanderPlugin;
173 | }(obsidian.Plugin));
174 | var ExpanderPluginSettings = /** @class */ (function () {
175 | function ExpanderPluginSettings() {
176 | }
177 | return ExpanderPluginSettings;
178 | }());
179 | var ExpanderSettingTab = /** @class */ (function (_super) {
180 | __extends(ExpanderSettingTab, _super);
181 | function ExpanderSettingTab(app, plugin) {
182 | var _this = _super.call(this, app, plugin) || this;
183 | _this.plugin = plugin;
184 | return _this;
185 | }
186 | ExpanderSettingTab.prototype.display = function () {
187 | var _this = this;
188 | var containerEl = this.containerEl;
189 | containerEl.empty();
190 | containerEl.createEl('h2', { text: 'Expander Plugin - Custom Keywords' });
191 | new obsidian.Setting(containerEl)
192 | .setName('Trigger #1 Keyword')
193 | .setDesc('To fire this, use ::foo while writing')
194 | .addText(function (text) { return text.setPlaceholder('foo (no colons needed)')
195 | .setValue(_this.plugin.settings.triggerOneKeyword)
196 | .onChange(function (value) {
197 | _this.plugin.settings.triggerOneKeyword = value;
198 | _this.plugin.saveData(_this.plugin.settings);
199 | }); });
200 | new obsidian.Setting(containerEl)
201 | .setName('Trigger #1 Replacement')
202 | .setDesc('What trigger keyword #1 should expand to')
203 | .addTextArea(function (text) { return text.setPlaceholder('')
204 | .setValue(_this.plugin.settings.triggerOneValue)
205 | .onChange(function (value) {
206 | _this.plugin.settings.triggerOneValue = value;
207 | _this.plugin.saveData(_this.plugin.settings);
208 | }); });
209 | //custom trigger #2
210 | new obsidian.Setting(containerEl)
211 | .setName('Trigger #2 Keyword')
212 | .setDesc('To fire this, use ::bar while writing')
213 | .addText(function (text) { return text.setPlaceholder('bar (no colons needed)')
214 | .setValue(_this.plugin.settings.triggerTwoKeyword)
215 | .onChange(function (value) {
216 | _this.plugin.settings.triggerTwoKeyword = value;
217 | _this.plugin.saveData(_this.plugin.settings);
218 | }); });
219 | new obsidian.Setting(containerEl)
220 | .setName('Trigger #2 Replacement')
221 | .setDesc('What trigger keyword #2 should expand to')
222 | .addTextArea(function (text) { return text.setPlaceholder('')
223 | .setValue(_this.plugin.settings.triggerTwoValue)
224 | .onChange(function (value) {
225 | _this.plugin.settings.triggerTwoValue = value;
226 | _this.plugin.saveData(_this.plugin.settings);
227 | }); });
228 | };
229 | return ExpanderSettingTab;
230 | }(obsidian.PluginSettingTab));
231 |
232 | module.exports = ExpanderPlugin;
233 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHByaXZhdGVNYXAuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuIiwiaW1wb3J0IHsgQXBwLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeHBhbmRlclBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcblx0XHJcblx0cHVibGljIHNldHRpbmdzOiBFeHBhbmRlclBsdWdpblNldHRpbmdzO1xyXG5cclxuICBcdHByaXZhdGUgY21FZGl0b3JzOiBDb2RlTWlycm9yLkVkaXRvcltdO1xyXG5cdHByaXZhdGUgc3RhdHVzQmFyOiBIVE1MRWxlbWVudDtcclxuXHRwcml2YXRlIGxpc3RlbmluZzogYm9vbGVhbjtcclxuXHJcblx0b25sb2FkKCkge1xyXG5cclxuXHRcdHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEV4cGFuZGVyU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cclxuXHRcdHRoaXMuc3RhdHVzQmFyID0gdGhpcy5hZGRTdGF0dXNCYXJJdGVtKClcclxuXHJcblx0XHR0aGlzLmNtRWRpdG9ycyA9IFtdO1xyXG5cdFx0dGhpcy5yZWdpc3RlckV2ZW50KFxyXG5cdFx0ICB0aGlzLmFwcC5vbignY29kZW1pcnJvcicsIChjbTogQ29kZU1pcnJvci5FZGl0b3IpID0+IHtcclxuXHRcdFx0dGhpcy5jbUVkaXRvcnMucHVzaChjbSk7XHJcblx0XHRcdGNtLm9uKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duKTtcclxuXHRcdCAgfSksXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0b251bmxvYWQoKSB7XHJcblx0XHRjb25zb2xlLmxvZygndW5sb2FkaW5nIHBsdWdpbicpO1xyXG5cclxuXHRcdHRoaXMuY21FZGl0b3JzLmZvckVhY2goKGNtKSA9PiB7XHJcblx0XHRcdGNtLm9mZigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bik7XHJcblx0XHQgIH0pO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhc3luYyBsb2FkU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gbmV3IEV4cGFuZGVyUGx1Z2luU2V0dGluZ3MoKTtcclxuXHRcdChhc3luYyAoKSA9PiB7XHJcblx0XHQgIGNvbnN0IGxvYWRlZFNldHRpbmdzID0gYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xyXG5cdFx0ICBpZiAobG9hZGVkU2V0dGluZ3MpIHtcclxuXHRcdFx0Y29uc29sZS5sb2coJ0ZvdW5kIGV4aXN0aW5nIHNldHRpbmdzIGZpbGUnKTtcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy50cmlnZ2VyT25lS2V5d29yZCA9IGxvYWRlZFNldHRpbmdzLnRyaWdnZXJPbmVLZXl3b3JkO1xyXG5cdFx0XHR0aGlzLnNldHRpbmdzLnRyaWdnZXJPbmVWYWx1ZSA9IGxvYWRlZFNldHRpbmdzLnRyaWdnZXJPbmVWYWx1ZTtcclxuXHJcblx0XHRcdHRoaXMuc2V0dGluZ3MudHJpZ2dlclR3b0tleXdvcmQgPSBsb2FkZWRTZXR0aW5ncy50cmlnZ2VyVHdvS2V5d29yZDtcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy50cmlnZ2VyVHdvVmFsdWUgPSBsb2FkZWRTZXR0aW5ncy50cmlnZ2VyVHdvVmFsdWU7XHJcblx0XHQgIH0gZWxzZSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdObyBzZXR0aW5ncyBmaWxlIGZvdW5kLCBzYXZpbmcuLi4nKTtcclxuXHRcdFx0dGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHRcdCAgfVxyXG5cdFx0fSkoKTtcclxuXHQgIH1cclxuXHJcblx0cHJpdmF0ZSByZWFkb25seSBoYW5kbGVLZXlEb3duID0gKFxyXG5cdFx0Y206IENvZGVNaXJyb3IuRWRpdG9yLFxyXG5cdFx0ZXZlbnQ6IEtleWJvYXJkRXZlbnQsXHJcblx0ICApOiB2b2lkID0+IHtcclxuXHJcblx0XHRpZighdGhpcy5saXN0ZW5pbmcpIHtcclxuXHRcdFx0aWYgKGV2ZW50LmtleSA9PSAnOicpIHtcdFx0XHRcdFx0XHJcblx0XHRcdFx0Ly9zZWUgaWYgdGhpcyBpcyB0aGUgc2Vjb25kIDpcclxuXHRcdFx0XHRsZXQgY3Vyc29yID0gY20uZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0bGV0IGxpbmUgPSBjdXJzb3IubGluZTtcclxuXHRcdFx0XHRsZXQgcHJldmlvdXNQb3NpdGlvbiA9IHtjaDogY3Vyc29yLmNoIC0gMSwgbGluZTogY3Vyc29yLmxpbmUsIHN0aWNreTogJ3llcyd9XHJcblx0XHRcdFx0bGV0IHJhbmdlID0gY20uZ2V0UmFuZ2UocHJldmlvdXNQb3NpdGlvbiwgY3Vyc29yKTtcclxuXHJcblx0XHRcdFx0aWYoWyc6J10uY29udGFpbnMocmFuZ2UuY2hhckF0KDApKSkgeyBcclxuXHRcdFx0XHRcdHRoaXMubGlzdGVuaW5nID0gdHJ1ZVxyXG5cdFx0XHRcdFx0dGhpcy5zdGF0dXNCYXIuc2V0VGV4dChcIkknbSBsaXN0ZW5pbmcuLi5cIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKGV2ZW50LmtleSA9PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PSAnVGFiJyB8fCBldmVudC5rZXkgPT0gJyAnKSB7XHJcblxyXG5cdFx0XHRsZXQgY3Vyc29yID0gY20uZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdGxldCBsaW5lID0gY3Vyc29yLmxpbmU7XHJcblx0XHRcdGxldCBsaW5lU3RyaW5nID0gY20uZ2V0TGluZShsaW5lKTtcclxuXHJcblx0XHRcdGxldCBwYXR0ZXJucyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcblxyXG5cdFx0XHQvLyBkZWZhdWx0IHRyaWdnZXJzXHJcblx0XHRcdHBhdHRlcm5zLnNldChcIjo6ZGF0ZVwiLCBuZXcgRGF0ZSgpLnRvRGF0ZVN0cmluZygpKTtcclxuXHRcclxuXHRcdFx0Ly9jdXN0b20gdHJpZ2dlcnNcclxuXHRcdFx0aWYodGhpcy5zZXR0aW5ncy50cmlnZ2VyT25lS2V5d29yZCkge1xyXG5cdFx0XHRcdHBhdHRlcm5zLnNldChcIjo6XCIgKyB0aGlzLnNldHRpbmdzLnRyaWdnZXJPbmVLZXl3b3JkLCB0aGlzLnNldHRpbmdzLnRyaWdnZXJPbmVWYWx1ZSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmKHRoaXMuc2V0dGluZ3MudHJpZ2dlclR3b0tleXdvcmQpIHtcclxuXHRcdFx0XHRwYXR0ZXJucy5zZXQoXCI6OlwiICsgdGhpcy5zZXR0aW5ncy50cmlnZ2VyVHdvS2V5d29yZCwgdGhpcy5zZXR0aW5ncy50cmlnZ2VyVHdvVmFsdWUpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwYXR0ZXJucy5mb3JFYWNoKCh2YWx1ZTogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHBhdHRlcm4gPSBrZXk7XHJcblx0XHRcdFx0Y29uc3QgcmVnZXggPSBSZWdFeHAocGF0dGVybik7XHJcblx0XHJcblx0XHRcdFx0aWYocmVnZXgudGVzdChsaW5lU3RyaW5nKSkge1xyXG5cdFx0XHRcdFx0bGV0IHBhdHRlcm5NYXRjaEluZGV4ID0gbGluZVN0cmluZy5tYXRjaChwYXR0ZXJuKS5pbmRleFxyXG5cdFx0XHRcdFx0bGV0IHBhdHRlcm5MZW5ndGggPSBwYXR0ZXJuLmxlbmd0aFxyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRjbS5yZXBsYWNlUmFuZ2UodmFsdWUsIHtjaDogcGF0dGVybk1hdGNoSW5kZXgsIGxpbmU6IGxpbmV9LCB7Y2g6IHBhdHRlcm5NYXRjaEluZGV4ICsgcGF0dGVybkxlbmd0aCwgbGluZTogbGluZX0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5saXN0ZW5pbmcgPSBmYWxzZVxyXG5cdFx0dGhpcy5zdGF0dXNCYXIuc2V0VGV4dChcIlwiKTtcclxuXHJcblx0ICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PSAnRXNjYXBlJykge1xyXG5cdFx0dGhpcy5saXN0ZW5pbmcgPSBmYWxzZTtcclxuXHRcdHRoaXMuc3RhdHVzQmFyLnNldFRleHQoXCJcIik7XHJcblx0fVxyXG59XHJcblxyXG5jbGFzcyBFeHBhbmRlclBsdWdpblNldHRpbmdzIHtcclxuXHRwdWJsaWMgdHJpZ2dlck9uZUtleXdvcmQ6IHN0cmluZztcclxuXHRwdWJsaWMgdHJpZ2dlck9uZVZhbHVlOiBzdHJpbmc7XHJcblx0cHVibGljIHRyaWdnZXJUd29LZXl3b3JkOiBzdHJpbmc7XHJcblx0cHVibGljIHRyaWdnZXJUd29WYWx1ZTogc3RyaW5nO1xyXG5cdFxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdH1cclxufVxyXG5cclxuY2xhc3MgRXhwYW5kZXJTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luOiBFeHBhbmRlclBsdWdpbjtcclxuXHJcblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogRXhwYW5kZXJQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdCAgfVxyXG5cclxuXHQgIGRpc3BsYXkoKTogdm9pZCB7XHJcblx0XHRsZXQge2NvbnRhaW5lckVsfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdFeHBhbmRlciBQbHVnaW4gLSBDdXN0b20gS2V5d29yZHMnIH0pO1x0XHRcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1RyaWdnZXIgIzEgS2V5d29yZCcpXHJcblx0XHRcdC5zZXREZXNjKCdUbyBmaXJlIHRoaXMsIHVzZSA6OmZvbzxFbnRlcj4gd2hpbGUgd3JpdGluZycpXHJcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4gdGV4dC5zZXRQbGFjZWhvbGRlcignZm9vIChubyBjb2xvbnMgbmVlZGVkKScpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRyaWdnZXJPbmVLZXl3b3JkKVxyXG5cdFx0XHRcdC5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnRyaWdnZXJPbmVLZXl3b3JkID0gdmFsdWVcclxuXHRcdFx0XHQgIFx0dGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0LnNldE5hbWUoJ1RyaWdnZXIgIzEgUmVwbGFjZW1lbnQnKVxyXG5cdFx0LnNldERlc2MoJ1doYXQgdHJpZ2dlciBrZXl3b3JkICMxIHNob3VsZCBleHBhbmQgdG8nKVxyXG5cdFx0LmFkZFRleHRBcmVhKHRleHQgPT4gdGV4dC5zZXRQbGFjZWhvbGRlcignJylcclxuXHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRyaWdnZXJPbmVWYWx1ZSlcclxuXHRcdFx0Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnRyaWdnZXJPbmVWYWx1ZSA9IHZhbHVlXHJcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0fSkpO1xyXG5cclxuXHRcdC8vY3VzdG9tIHRyaWdnZXIgIzJcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0LnNldE5hbWUoJ1RyaWdnZXIgIzIgS2V5d29yZCcpXHJcblx0XHQuc2V0RGVzYygnVG8gZmlyZSB0aGlzLCB1c2UgOjpiYXI8RW50ZXI+IHdoaWxlIHdyaXRpbmcnKVxyXG5cdFx0LmFkZFRleHQodGV4dCA9PiB0ZXh0LnNldFBsYWNlaG9sZGVyKCdiYXIgKG5vIGNvbG9ucyBuZWVkZWQpJylcclxuXHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRyaWdnZXJUd29LZXl3b3JkKVxyXG5cdFx0XHQub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudHJpZ2dlclR3b0tleXdvcmQgPSB2YWx1ZVxyXG5cdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdC5zZXROYW1lKCdUcmlnZ2VyICMyIFJlcGxhY2VtZW50JylcclxuXHRcdC5zZXREZXNjKCdXaGF0IHRyaWdnZXIga2V5d29yZCAjMiBzaG91bGQgZXhwYW5kIHRvJylcclxuXHRcdC5hZGRUZXh0QXJlYSh0ZXh0ID0+IHRleHQuc2V0UGxhY2Vob2xkZXIoJycpXHJcblx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy50cmlnZ2VyVHdvVmFsdWUpXHJcblx0XHRcdC5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuXHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy50cmlnZ2VyVHdvVmFsdWUgPSB2YWx1ZVxyXG5cdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdH0pKTtcdFxyXG5cdH1cclxufVxyXG5cclxuIl0sIm5hbWVzIjpbIlBsdWdpbiIsIlNldHRpbmciLCJQbHVnaW5TZXR0aW5nVGFiIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWM7QUFDekMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsWUFBWSxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3BGLFFBQVEsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzFHLElBQUksT0FBTyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLENBQUMsQ0FBQztBQUNGO0FBQ08sU0FBUyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNoQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEIsSUFBSSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDM0MsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUF1Q0Q7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ25HLFFBQVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ3RHLFFBQVEsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3RILFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlFLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNEO0FBQ08sU0FBUyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUMzQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckgsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxNQUFNLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3SixJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3RFLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ3RFLFFBQVEsT0FBTyxDQUFDLEVBQUUsSUFBSTtBQUN0QixZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pLLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwRCxZQUFZLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QixnQkFBZ0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTTtBQUM5QyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3hFLGdCQUFnQixLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0FBQ2pFLGdCQUFnQixLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxTQUFTO0FBQ2pFLGdCQUFnQjtBQUNoQixvQkFBb0IsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRTtBQUNoSSxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUMxRyxvQkFB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
234 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import { Plugin } from "obsidian";
2 | import ExpanderSettingTab from "./expander-setting-tab";
3 | import ExpanderPluginSettings from "./expander-plugin-settings";
4 |
5 | export default class ExpanderPlugin extends Plugin {
6 | public settings: ExpanderPluginSettings;
7 |
8 | private cmEditors: CodeMirror.Editor[];
9 |
10 | private statusBar: HTMLElement;
11 |
12 | private listening: boolean;
13 |
14 | public async onload(): Promise {
15 | this.loadSettings();
16 | this.addSettingTab(new ExpanderSettingTab(this.app, this));
17 |
18 | this.statusBar = this.addStatusBarItem();
19 |
20 | this.cmEditors = [];
21 | this.registerEvent(
22 | this.app.on("codemirror", (cm: CodeMirror.Editor) => {
23 | this.cmEditors.push(cm);
24 | cm.on("keydown", this.handleKeyDown);
25 | })
26 | );
27 | }
28 |
29 | public onunload(): void {
30 | console.log("unloading plugin");
31 |
32 | this.cmEditors.forEach((cm) => {
33 | cm.off("keydown", this.handleKeyDown);
34 | });
35 | }
36 |
37 | private async loadSettings(): Promise {
38 | this.settings = new ExpanderPluginSettings();
39 | (async () => {
40 | const loadedSettings = await this.loadData();
41 | if (loadedSettings) {
42 | console.log("Found existing settings file");
43 | this.settings.triggerOneKeyword = loadedSettings.triggerOneKeyword;
44 | this.settings.triggerOneValue = loadedSettings.triggerOneValue;
45 |
46 | this.settings.triggerTwoKeyword = loadedSettings.triggerTwoKeyword;
47 | this.settings.triggerTwoValue = loadedSettings.triggerTwoValue;
48 |
49 | this.settings.triggerThreeKeyword = loadedSettings.triggerThreeKeyword;
50 | this.settings.triggerThreeValue = loadedSettings.triggerThreeValue;
51 | } else {
52 | console.log("No settings file found, saving...");
53 | this.saveData(this.settings);
54 | }
55 | })();
56 | }
57 |
58 | private readonly handleKeyDown = (
59 | cm: CodeMirror.Editor,
60 | event: KeyboardEvent
61 | ): void => {
62 | if (!this.listening) {
63 | if (event.key == ":") {
64 | // see if this is the second :
65 | const cursor = cm.getCursor();
66 | const previousPosition = {
67 | ch: cursor.ch - 1,
68 | line: cursor.line,
69 | sticky: "yes",
70 | };
71 | const range = cm.getRange(previousPosition, cursor);
72 |
73 | if ([":"].contains(range.charAt(0))) {
74 | this.listening = true;
75 | this.statusBar.setText("I'm listening...");
76 | }
77 | }
78 | } else if (event.key == "Enter" || event.key == "Tab" || event.key == " ") {
79 | const cursor = cm.getCursor();
80 | const { line } = cursor;
81 | const lineString = cm.getLine(line);
82 |
83 | const patterns = new Map();
84 |
85 | // default triggers
86 | const d = new Date();
87 | patterns.set("::date", d.toDateString());
88 | patterns.set("::time", d.toLocaleTimeString());
89 |
90 | // custom triggers
91 | if (this.settings.triggerOneKeyword) {
92 | patterns.set(
93 | `::${this.settings.triggerOneKeyword}`,
94 | this.settings.triggerOneValue
95 | );
96 | }
97 |
98 | if (this.settings.triggerTwoKeyword) {
99 | patterns.set(
100 | `::${this.settings.triggerTwoKeyword}`,
101 | this.settings.triggerTwoValue
102 | );
103 | }
104 |
105 | if (this.settings.triggerThreeKeyword) {
106 | patterns.set(
107 | `::${this.settings.triggerThreeKeyword}`,
108 | this.settings.triggerThreeValue
109 | );
110 | }
111 |
112 | patterns.forEach((value: string, key: string) => {
113 | const pattern = key;
114 | const regex = RegExp(pattern);
115 |
116 | if (regex.test(lineString)) {
117 | const patternMatchIndex = lineString.match(pattern).index;
118 | const patternLength = pattern.length;
119 |
120 | cm.replaceRange(
121 | value,
122 | { ch: patternMatchIndex, line },
123 | { ch: patternMatchIndex + patternLength, line }
124 | );
125 | }
126 | });
127 |
128 | this.listening = false;
129 | this.statusBar.setText("");
130 | } else if (event.key == "Escape") {
131 | this.listening = false;
132 | this.statusBar.setText("");
133 | }
134 | };
135 | }
136 |
--------------------------------------------------------------------------------
/styles.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akaalias/text-expander-plugin/b0271c2b7d8f77d59b52994992b4472bea5c8a5f/styles.css
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "baseUrl": ".",
4 | "inlineSourceMap": true,
5 | "inlineSources": true,
6 | "module": "ESNext",
7 | "target": "es5",
8 | "allowJs": true,
9 | "noImplicitAny": true,
10 | "moduleResolution": "node",
11 | "importHelpers": true,
12 | "lib": [
13 | "dom",
14 | "es5",
15 | "scripthost",
16 | "es2015"
17 | ]
18 | },
19 | "include": [
20 | "**/*.ts"
21 | ]
22 | }
23 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@babel/code-frame@^7.0.0":
6 | "integrity" "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg=="
7 | "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz"
8 | "version" "7.10.4"
9 | dependencies:
10 | "@babel/highlight" "^7.10.4"
11 |
12 | "@babel/helper-validator-identifier@^7.10.4":
13 | "integrity" "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw=="
14 | "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz"
15 | "version" "7.10.4"
16 |
17 | "@babel/highlight@^7.10.4":
18 | "integrity" "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA=="
19 | "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz"
20 | "version" "7.10.4"
21 | dependencies:
22 | "@babel/helper-validator-identifier" "^7.10.4"
23 | "chalk" "^2.0.0"
24 | "js-tokens" "^4.0.0"
25 |
26 | "@eslint/eslintrc@^0.2.1":
27 | "integrity" "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA=="
28 | "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz"
29 | "version" "0.2.1"
30 | dependencies:
31 | "ajv" "^6.12.4"
32 | "debug" "^4.1.1"
33 | "espree" "^7.3.0"
34 | "globals" "^12.1.0"
35 | "ignore" "^4.0.6"
36 | "import-fresh" "^3.2.1"
37 | "js-yaml" "^3.13.1"
38 | "lodash" "^4.17.19"
39 | "minimatch" "^3.0.4"
40 | "strip-json-comments" "^3.1.1"
41 |
42 | "@nodelib/fs.scandir@2.1.3":
43 | "integrity" "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw=="
44 | "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz"
45 | "version" "2.1.3"
46 | dependencies:
47 | "@nodelib/fs.stat" "2.0.3"
48 | "run-parallel" "^1.1.9"
49 |
50 | "@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.3":
51 | "integrity" "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA=="
52 | "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz"
53 | "version" "2.0.3"
54 |
55 | "@nodelib/fs.walk@^1.2.3":
56 | "integrity" "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ=="
57 | "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz"
58 | "version" "1.2.4"
59 | dependencies:
60 | "@nodelib/fs.scandir" "2.1.3"
61 | "fastq" "^1.6.0"
62 |
63 | "@rollup/plugin-commonjs@^15.1.0":
64 | "integrity" "sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ=="
65 | "resolved" "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz"
66 | "version" "15.1.0"
67 | dependencies:
68 | "@rollup/pluginutils" "^3.1.0"
69 | "commondir" "^1.0.1"
70 | "estree-walker" "^2.0.1"
71 | "glob" "^7.1.6"
72 | "is-reference" "^1.2.1"
73 | "magic-string" "^0.25.7"
74 | "resolve" "^1.17.0"
75 |
76 | "@rollup/plugin-node-resolve@^9.0.0":
77 | "integrity" "sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg=="
78 | "resolved" "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz"
79 | "version" "9.0.0"
80 | dependencies:
81 | "@rollup/pluginutils" "^3.1.0"
82 | "@types/resolve" "1.17.1"
83 | "builtin-modules" "^3.1.0"
84 | "deepmerge" "^4.2.2"
85 | "is-module" "^1.0.0"
86 | "resolve" "^1.17.0"
87 |
88 | "@rollup/plugin-typescript@^6.0.0":
89 | "integrity" "sha512-hJxaiE6WyNOsK+fZpbFh9CUijZYqPQuAOWO5khaGTUkM8DYNNyA2TDlgamecE+qLOG1G1+CwbWMAx3rbqpp6xQ=="
90 | "resolved" "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-6.1.0.tgz"
91 | "version" "6.1.0"
92 | dependencies:
93 | "@rollup/pluginutils" "^3.1.0"
94 | "resolve" "^1.17.0"
95 |
96 | "@rollup/pluginutils@^3.1.0":
97 | "integrity" "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="
98 | "resolved" "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz"
99 | "version" "3.1.0"
100 | dependencies:
101 | "@types/estree" "0.0.39"
102 | "estree-walker" "^1.0.1"
103 | "picomatch" "^2.2.2"
104 |
105 | "@types/codemirror@0.0.98":
106 | "integrity" "sha512-cbty5LPayy2vNSeuUdjNA9tggG+go5vAxmnLDRWpiZI5a+RDBi9dlozy4/jW/7P/gletbBWbQREEa7A81YxstA=="
107 | "resolved" "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.98.tgz"
108 | "version" "0.0.98"
109 | dependencies:
110 | "@types/tern" "*"
111 |
112 | "@types/estree@*", "@types/estree@0.0.39":
113 | "integrity" "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
114 | "resolved" "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz"
115 | "version" "0.0.39"
116 |
117 | "@types/json-schema@^7.0.3":
118 | "integrity" "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw=="
119 | "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz"
120 | "version" "7.0.6"
121 |
122 | "@types/json5@^0.0.29":
123 | "integrity" "sha1-7ihweulOEdK4J7y+UnC86n8+ce4="
124 | "resolved" "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz"
125 | "version" "0.0.29"
126 |
127 | "@types/node@*", "@types/node@^14.14.2":
128 | "integrity" "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw=="
129 | "resolved" "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz"
130 | "version" "14.14.6"
131 |
132 | "@types/resolve@1.17.1":
133 | "integrity" "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw=="
134 | "resolved" "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz"
135 | "version" "1.17.1"
136 | dependencies:
137 | "@types/node" "*"
138 |
139 | "@types/tern@*":
140 | "integrity" "sha512-imDtS4TAoTcXk0g7u4kkWqedB3E4qpjXzCpD2LU5M5NAXHzCDsypyvXSaG7mM8DKYkCRa7tFp4tS/lp/Wo7Q3w=="
141 | "resolved" "https://registry.npmjs.org/@types/tern/-/tern-0.23.3.tgz"
142 | "version" "0.23.3"
143 | dependencies:
144 | "@types/estree" "*"
145 |
146 | "@typescript-eslint/eslint-plugin@^4.7.0":
147 | "integrity" "sha512-li9aiSVBBd7kU5VlQlT1AqP0uWGDK6JYKUQ9cVDnOg34VNnd9t4jr0Yqc/bKxJr/tDCPDaB4KzoSFN9fgVxe/Q=="
148 | "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.7.0.tgz"
149 | "version" "4.7.0"
150 | dependencies:
151 | "@typescript-eslint/experimental-utils" "4.7.0"
152 | "@typescript-eslint/scope-manager" "4.7.0"
153 | "debug" "^4.1.1"
154 | "functional-red-black-tree" "^1.0.1"
155 | "regexpp" "^3.0.0"
156 | "semver" "^7.3.2"
157 | "tsutils" "^3.17.1"
158 |
159 | "@typescript-eslint/experimental-utils@4.7.0":
160 | "integrity" "sha512-cymzovXAiD4EF+YoHAB5Oh02MpnXjvyaOb+v+BdpY7lsJXZQN34oIETeUwVT2XfV9rSNpXaIcknDLfupO/tUoA=="
161 | "resolved" "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.7.0.tgz"
162 | "version" "4.7.0"
163 | dependencies:
164 | "@types/json-schema" "^7.0.3"
165 | "@typescript-eslint/scope-manager" "4.7.0"
166 | "@typescript-eslint/types" "4.7.0"
167 | "@typescript-eslint/typescript-estree" "4.7.0"
168 | "eslint-scope" "^5.0.0"
169 | "eslint-utils" "^2.0.0"
170 |
171 | "@typescript-eslint/parser@^4.0.0", "@typescript-eslint/parser@^4.7.0":
172 | "integrity" "sha512-+meGV8bMP1sJHBI2AFq1GeTwofcGiur8LoIr6v+rEmD9knyCqDlrQcFHR0KDDfldHIFDU/enZ53fla6ReF4wRw=="
173 | "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.7.0.tgz"
174 | "version" "4.7.0"
175 | dependencies:
176 | "@typescript-eslint/scope-manager" "4.7.0"
177 | "@typescript-eslint/types" "4.7.0"
178 | "@typescript-eslint/typescript-estree" "4.7.0"
179 | "debug" "^4.1.1"
180 |
181 | "@typescript-eslint/scope-manager@4.7.0":
182 | "integrity" "sha512-ILITvqwDJYbcDCROj6+Ob0oCKNg3SH46iWcNcTIT9B5aiVssoTYkhKjxOMNzR1F7WSJkik4zmuqve5MdnA0DyA=="
183 | "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.7.0.tgz"
184 | "version" "4.7.0"
185 | dependencies:
186 | "@typescript-eslint/types" "4.7.0"
187 | "@typescript-eslint/visitor-keys" "4.7.0"
188 |
189 | "@typescript-eslint/types@4.7.0":
190 | "integrity" "sha512-uLszFe0wExJc+I7q0Z/+BnP7wao/kzX0hB5vJn4LIgrfrMLgnB2UXoReV19lkJQS1a1mHWGGODSxnBx6JQC3Sg=="
191 | "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.7.0.tgz"
192 | "version" "4.7.0"
193 |
194 | "@typescript-eslint/typescript-estree@4.7.0":
195 | "integrity" "sha512-5XZRQznD1MfUmxu1t8/j2Af4OxbA7EFU2rbo0No7meb46eHgGkSieFdfV6omiC/DGIBhH9H9gXn7okBbVOm8jw=="
196 | "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.7.0.tgz"
197 | "version" "4.7.0"
198 | dependencies:
199 | "@typescript-eslint/types" "4.7.0"
200 | "@typescript-eslint/visitor-keys" "4.7.0"
201 | "debug" "^4.1.1"
202 | "globby" "^11.0.1"
203 | "is-glob" "^4.0.1"
204 | "lodash" "^4.17.15"
205 | "semver" "^7.3.2"
206 | "tsutils" "^3.17.1"
207 |
208 | "@typescript-eslint/visitor-keys@4.7.0":
209 | "integrity" "sha512-aDJDWuCRsf1lXOtignlfiPODkzSxxop7D0rZ91L6ZuMlcMCSh0YyK+gAfo5zN/ih6WxMwhoXgJWC3cWQdaKC+A=="
210 | "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.7.0.tgz"
211 | "version" "4.7.0"
212 | dependencies:
213 | "@typescript-eslint/types" "4.7.0"
214 | "eslint-visitor-keys" "^2.0.0"
215 |
216 | "acorn-jsx@^5.2.0":
217 | "integrity" "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng=="
218 | "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz"
219 | "version" "5.3.1"
220 |
221 | "acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^7.4.0":
222 | "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
223 | "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz"
224 | "version" "7.4.1"
225 |
226 | "ajv@^6.10.0", "ajv@^6.10.2", "ajv@^6.12.4":
227 | "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="
228 | "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
229 | "version" "6.12.6"
230 | dependencies:
231 | "fast-deep-equal" "^3.1.1"
232 | "fast-json-stable-stringify" "^2.0.0"
233 | "json-schema-traverse" "^0.4.1"
234 | "uri-js" "^4.2.2"
235 |
236 | "ansi-colors@^4.1.1":
237 | "integrity" "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
238 | "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz"
239 | "version" "4.1.1"
240 |
241 | "ansi-regex@^4.1.0":
242 | "integrity" "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
243 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz"
244 | "version" "4.1.0"
245 |
246 | "ansi-regex@^5.0.0":
247 | "integrity" "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
248 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz"
249 | "version" "5.0.0"
250 |
251 | "ansi-styles@^3.2.0":
252 | "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
253 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
254 | "version" "3.2.1"
255 | dependencies:
256 | "color-convert" "^1.9.0"
257 |
258 | "ansi-styles@^3.2.1":
259 | "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
260 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
261 | "version" "3.2.1"
262 | dependencies:
263 | "color-convert" "^1.9.0"
264 |
265 | "ansi-styles@^4.1.0":
266 | "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
267 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
268 | "version" "4.3.0"
269 | dependencies:
270 | "color-convert" "^2.0.1"
271 |
272 | "argparse@^1.0.7":
273 | "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="
274 | "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz"
275 | "version" "1.0.10"
276 | dependencies:
277 | "sprintf-js" "~1.0.2"
278 |
279 | "array-includes@^3.1.1":
280 | "integrity" "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ=="
281 | "resolved" "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz"
282 | "version" "3.1.1"
283 | dependencies:
284 | "define-properties" "^1.1.3"
285 | "es-abstract" "^1.17.0"
286 | "is-string" "^1.0.5"
287 |
288 | "array-union@^2.1.0":
289 | "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
290 | "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz"
291 | "version" "2.1.0"
292 |
293 | "array.prototype.flat@^1.2.3":
294 | "integrity" "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ=="
295 | "resolved" "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz"
296 | "version" "1.2.3"
297 | dependencies:
298 | "define-properties" "^1.1.3"
299 | "es-abstract" "^1.17.0-next.1"
300 |
301 | "astral-regex@^1.0.0":
302 | "integrity" "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="
303 | "resolved" "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz"
304 | "version" "1.0.0"
305 |
306 | "balanced-match@^1.0.0":
307 | "integrity" "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
308 | "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz"
309 | "version" "1.0.0"
310 |
311 | "brace-expansion@^1.1.7":
312 | "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="
313 | "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
314 | "version" "1.1.11"
315 | dependencies:
316 | "balanced-match" "^1.0.0"
317 | "concat-map" "0.0.1"
318 |
319 | "braces@^3.0.1":
320 | "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="
321 | "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
322 | "version" "3.0.2"
323 | dependencies:
324 | "fill-range" "^7.0.1"
325 |
326 | "builtin-modules@^3.1.0":
327 | "integrity" "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw=="
328 | "resolved" "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz"
329 | "version" "3.1.0"
330 |
331 | "call-bind@^1.0.0":
332 | "integrity" "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w=="
333 | "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz"
334 | "version" "1.0.0"
335 | dependencies:
336 | "function-bind" "^1.1.1"
337 | "get-intrinsic" "^1.0.0"
338 |
339 | "callsites@^3.0.0":
340 | "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
341 | "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
342 | "version" "3.1.0"
343 |
344 | "chalk@^2.0.0":
345 | "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
346 | "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
347 | "version" "2.4.2"
348 | dependencies:
349 | "ansi-styles" "^3.2.1"
350 | "escape-string-regexp" "^1.0.5"
351 | "supports-color" "^5.3.0"
352 |
353 | "chalk@^4.0.0":
354 | "integrity" "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A=="
355 | "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz"
356 | "version" "4.1.0"
357 | dependencies:
358 | "ansi-styles" "^4.1.0"
359 | "supports-color" "^7.1.0"
360 |
361 | "color-convert@^1.9.0":
362 | "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="
363 | "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
364 | "version" "1.9.3"
365 | dependencies:
366 | "color-name" "1.1.3"
367 |
368 | "color-convert@^2.0.1":
369 | "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="
370 | "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
371 | "version" "2.0.1"
372 | dependencies:
373 | "color-name" "~1.1.4"
374 |
375 | "color-name@~1.1.4":
376 | "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
377 | "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
378 | "version" "1.1.4"
379 |
380 | "color-name@1.1.3":
381 | "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
382 | "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
383 | "version" "1.1.3"
384 |
385 | "comment-parser@^0.7.6":
386 | "integrity" "sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg=="
387 | "resolved" "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.6.tgz"
388 | "version" "0.7.6"
389 |
390 | "commondir@^1.0.1":
391 | "integrity" "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
392 | "resolved" "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz"
393 | "version" "1.0.1"
394 |
395 | "concat-map@0.0.1":
396 | "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
397 | "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
398 | "version" "0.0.1"
399 |
400 | "confusing-browser-globals@^1.0.10":
401 | "integrity" "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA=="
402 | "resolved" "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz"
403 | "version" "1.0.10"
404 |
405 | "contains-path@^0.1.0":
406 | "integrity" "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo="
407 | "resolved" "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz"
408 | "version" "0.1.0"
409 |
410 | "cross-spawn@^7.0.2":
411 | "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="
412 | "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
413 | "version" "7.0.3"
414 | dependencies:
415 | "path-key" "^3.1.0"
416 | "shebang-command" "^2.0.0"
417 | "which" "^2.0.1"
418 |
419 | "debug@^2.6.9":
420 | "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
421 | "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
422 | "version" "2.6.9"
423 | dependencies:
424 | "ms" "2.0.0"
425 |
426 | "debug@^4.0.1", "debug@^4.1.1", "debug@^4.2.0":
427 | "integrity" "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg=="
428 | "resolved" "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz"
429 | "version" "4.2.0"
430 | dependencies:
431 | "ms" "2.1.2"
432 |
433 | "deep-is@^0.1.3":
434 | "integrity" "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
435 | "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz"
436 | "version" "0.1.3"
437 |
438 | "deepmerge@^4.2.2":
439 | "integrity" "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
440 | "resolved" "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz"
441 | "version" "4.2.2"
442 |
443 | "define-properties@^1.1.3":
444 | "integrity" "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ=="
445 | "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz"
446 | "version" "1.1.3"
447 | dependencies:
448 | "object-keys" "^1.0.12"
449 |
450 | "dir-glob@^3.0.1":
451 | "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="
452 | "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
453 | "version" "3.0.1"
454 | dependencies:
455 | "path-type" "^4.0.0"
456 |
457 | "doctrine@^3.0.0":
458 | "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="
459 | "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz"
460 | "version" "3.0.0"
461 | dependencies:
462 | "esutils" "^2.0.2"
463 |
464 | "doctrine@1.5.0":
465 | "integrity" "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo="
466 | "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz"
467 | "version" "1.5.0"
468 | dependencies:
469 | "esutils" "^2.0.2"
470 | "isarray" "^1.0.0"
471 |
472 | "emoji-regex@^7.0.1":
473 | "integrity" "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
474 | "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz"
475 | "version" "7.0.3"
476 |
477 | "enquirer@^2.3.5":
478 | "integrity" "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg=="
479 | "resolved" "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz"
480 | "version" "2.3.6"
481 | dependencies:
482 | "ansi-colors" "^4.1.1"
483 |
484 | "error-ex@^1.2.0":
485 | "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="
486 | "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
487 | "version" "1.3.2"
488 | dependencies:
489 | "is-arrayish" "^0.2.1"
490 |
491 | "es-abstract@^1.17.0", "es-abstract@^1.17.0-next.1", "es-abstract@^1.17.5":
492 | "integrity" "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g=="
493 | "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz"
494 | "version" "1.17.7"
495 | dependencies:
496 | "es-to-primitive" "^1.2.1"
497 | "function-bind" "^1.1.1"
498 | "has" "^1.0.3"
499 | "has-symbols" "^1.0.1"
500 | "is-callable" "^1.2.2"
501 | "is-regex" "^1.1.1"
502 | "object-inspect" "^1.8.0"
503 | "object-keys" "^1.1.1"
504 | "object.assign" "^4.1.1"
505 | "string.prototype.trimend" "^1.0.1"
506 | "string.prototype.trimstart" "^1.0.1"
507 |
508 | "es-abstract@^1.18.0-next.1":
509 | "integrity" "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA=="
510 | "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz"
511 | "version" "1.18.0-next.1"
512 | dependencies:
513 | "es-to-primitive" "^1.2.1"
514 | "function-bind" "^1.1.1"
515 | "has" "^1.0.3"
516 | "has-symbols" "^1.0.1"
517 | "is-callable" "^1.2.2"
518 | "is-negative-zero" "^2.0.0"
519 | "is-regex" "^1.1.1"
520 | "object-inspect" "^1.8.0"
521 | "object-keys" "^1.1.1"
522 | "object.assign" "^4.1.1"
523 | "string.prototype.trimend" "^1.0.1"
524 | "string.prototype.trimstart" "^1.0.1"
525 |
526 | "es-to-primitive@^1.2.1":
527 | "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="
528 | "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz"
529 | "version" "1.2.1"
530 | dependencies:
531 | "is-callable" "^1.1.4"
532 | "is-date-object" "^1.0.1"
533 | "is-symbol" "^1.0.2"
534 |
535 | "escape-string-regexp@^1.0.5":
536 | "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
537 | "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
538 | "version" "1.0.5"
539 |
540 | "eslint-config-airbnb-base@^14.2.1":
541 | "integrity" "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA=="
542 | "resolved" "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz"
543 | "version" "14.2.1"
544 | dependencies:
545 | "confusing-browser-globals" "^1.0.10"
546 | "object.assign" "^4.1.2"
547 | "object.entries" "^1.1.2"
548 |
549 | "eslint-import-resolver-node@^0.3.4":
550 | "integrity" "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA=="
551 | "resolved" "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz"
552 | "version" "0.3.4"
553 | dependencies:
554 | "debug" "^2.6.9"
555 | "resolve" "^1.13.1"
556 |
557 | "eslint-module-utils@^2.6.0":
558 | "integrity" "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA=="
559 | "resolved" "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz"
560 | "version" "2.6.0"
561 | dependencies:
562 | "debug" "^2.6.9"
563 | "pkg-dir" "^2.0.0"
564 |
565 | "eslint-plugin-babel@5.3.1":
566 | "integrity" "sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g=="
567 | "resolved" "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz"
568 | "version" "5.3.1"
569 | dependencies:
570 | "eslint-rule-composer" "^0.3.0"
571 |
572 | "eslint-plugin-import@^2.22.1":
573 | "integrity" "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw=="
574 | "resolved" "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz"
575 | "version" "2.22.1"
576 | dependencies:
577 | "array-includes" "^3.1.1"
578 | "array.prototype.flat" "^1.2.3"
579 | "contains-path" "^0.1.0"
580 | "debug" "^2.6.9"
581 | "doctrine" "1.5.0"
582 | "eslint-import-resolver-node" "^0.3.4"
583 | "eslint-module-utils" "^2.6.0"
584 | "has" "^1.0.3"
585 | "minimatch" "^3.0.4"
586 | "object.values" "^1.1.1"
587 | "read-pkg-up" "^2.0.0"
588 | "resolve" "^1.17.0"
589 | "tsconfig-paths" "^3.9.0"
590 |
591 | "eslint-plugin-jsdoc@30.7.3":
592 | "integrity" "sha512-slzJeKrm3vXabRYcFBpbUgWgdnATN9rNOFAr7IhmkxmR9Vk/6qN1c/IdvTqVSEctDRQ08chR+Lvk8fRayXgYZg=="
593 | "resolved" "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.7.3.tgz"
594 | "version" "30.7.3"
595 | dependencies:
596 | "comment-parser" "^0.7.6"
597 | "debug" "^4.2.0"
598 | "jsdoctypeparser" "^9.0.0"
599 | "lodash" "^4.17.20"
600 | "regextras" "^0.7.1"
601 | "semver" "^7.3.2"
602 | "spdx-expression-parse" "^3.0.1"
603 |
604 | "eslint-plugin-prefer-arrow@1.2.2":
605 | "integrity" "sha512-C8YMhL+r8RMeMdYAw/rQtE6xNdMulj+zGWud/qIGnlmomiPRaLDGLMeskZ3alN6uMBojmooRimtdrXebLN4svQ=="
606 | "resolved" "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.2.tgz"
607 | "version" "1.2.2"
608 |
609 | "eslint-plugin-simple-import-sort@5.0.3":
610 | "integrity" "sha512-1rf3AWiHeWNCQdAq0iXNnlccnH1UDnelGgrPbjBBHE8d2hXVtOudcmy0vTF4hri3iJ0MKz8jBhmH6lJ0ZWZLHQ=="
611 | "resolved" "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-5.0.3.tgz"
612 | "version" "5.0.3"
613 |
614 | "eslint-rule-composer@^0.3.0":
615 | "integrity" "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg=="
616 | "resolved" "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz"
617 | "version" "0.3.0"
618 |
619 | "eslint-scope@^5.0.0", "eslint-scope@^5.1.1":
620 | "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="
621 | "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz"
622 | "version" "5.1.1"
623 | dependencies:
624 | "esrecurse" "^4.3.0"
625 | "estraverse" "^4.1.1"
626 |
627 | "eslint-utils@^2.0.0", "eslint-utils@^2.1.0":
628 | "integrity" "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg=="
629 | "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz"
630 | "version" "2.1.0"
631 | dependencies:
632 | "eslint-visitor-keys" "^1.1.0"
633 |
634 | "eslint-visitor-keys@^1.1.0":
635 | "integrity" "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
636 | "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz"
637 | "version" "1.3.0"
638 |
639 | "eslint-visitor-keys@^1.3.0":
640 | "integrity" "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
641 | "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz"
642 | "version" "1.3.0"
643 |
644 | "eslint-visitor-keys@^2.0.0":
645 | "integrity" "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ=="
646 | "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz"
647 | "version" "2.0.0"
648 |
649 | "eslint@*", "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0", "eslint@^5.0.0 || ^6.0.0 || ^7.0.0", "eslint@^5.16.0 || ^6.8.0 || ^7.2.0", "eslint@^6.0.0 || ^7.0.0", "eslint@^7.12.1", "eslint@>=2.0.0", "eslint@>=4.0.0", "eslint@>=5.0.0":
650 | "integrity" "sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg=="
651 | "resolved" "https://registry.npmjs.org/eslint/-/eslint-7.12.1.tgz"
652 | "version" "7.12.1"
653 | dependencies:
654 | "@babel/code-frame" "^7.0.0"
655 | "@eslint/eslintrc" "^0.2.1"
656 | "ajv" "^6.10.0"
657 | "chalk" "^4.0.0"
658 | "cross-spawn" "^7.0.2"
659 | "debug" "^4.0.1"
660 | "doctrine" "^3.0.0"
661 | "enquirer" "^2.3.5"
662 | "eslint-scope" "^5.1.1"
663 | "eslint-utils" "^2.1.0"
664 | "eslint-visitor-keys" "^2.0.0"
665 | "espree" "^7.3.0"
666 | "esquery" "^1.2.0"
667 | "esutils" "^2.0.2"
668 | "file-entry-cache" "^5.0.1"
669 | "functional-red-black-tree" "^1.0.1"
670 | "glob-parent" "^5.0.0"
671 | "globals" "^12.1.0"
672 | "ignore" "^4.0.6"
673 | "import-fresh" "^3.0.0"
674 | "imurmurhash" "^0.1.4"
675 | "is-glob" "^4.0.0"
676 | "js-yaml" "^3.13.1"
677 | "json-stable-stringify-without-jsonify" "^1.0.1"
678 | "levn" "^0.4.1"
679 | "lodash" "^4.17.19"
680 | "minimatch" "^3.0.4"
681 | "natural-compare" "^1.4.0"
682 | "optionator" "^0.9.1"
683 | "progress" "^2.0.0"
684 | "regexpp" "^3.1.0"
685 | "semver" "^7.2.1"
686 | "strip-ansi" "^6.0.0"
687 | "strip-json-comments" "^3.1.0"
688 | "table" "^5.2.3"
689 | "text-table" "^0.2.0"
690 | "v8-compile-cache" "^2.0.3"
691 |
692 | "espree@^7.3.0":
693 | "integrity" "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw=="
694 | "resolved" "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz"
695 | "version" "7.3.0"
696 | dependencies:
697 | "acorn" "^7.4.0"
698 | "acorn-jsx" "^5.2.0"
699 | "eslint-visitor-keys" "^1.3.0"
700 |
701 | "esprima@^4.0.0":
702 | "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
703 | "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
704 | "version" "4.0.1"
705 |
706 | "esquery@^1.2.0":
707 | "integrity" "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ=="
708 | "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz"
709 | "version" "1.3.1"
710 | dependencies:
711 | "estraverse" "^5.1.0"
712 |
713 | "esrecurse@^4.3.0":
714 | "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="
715 | "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
716 | "version" "4.3.0"
717 | dependencies:
718 | "estraverse" "^5.2.0"
719 |
720 | "estraverse@^4.1.1":
721 | "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
722 | "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
723 | "version" "4.3.0"
724 |
725 | "estraverse@^5.1.0":
726 | "integrity" "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
727 | "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz"
728 | "version" "5.2.0"
729 |
730 | "estraverse@^5.2.0":
731 | "integrity" "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
732 | "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz"
733 | "version" "5.2.0"
734 |
735 | "estree-walker@^1.0.1":
736 | "integrity" "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="
737 | "resolved" "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz"
738 | "version" "1.0.1"
739 |
740 | "estree-walker@^2.0.1":
741 | "integrity" "sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg=="
742 | "resolved" "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.1.tgz"
743 | "version" "2.0.1"
744 |
745 | "esutils@^2.0.2":
746 | "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
747 | "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
748 | "version" "2.0.3"
749 |
750 | "fast-deep-equal@^3.1.1":
751 | "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
752 | "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
753 | "version" "3.1.3"
754 |
755 | "fast-glob@^3.1.1":
756 | "integrity" "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ=="
757 | "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz"
758 | "version" "3.2.4"
759 | dependencies:
760 | "@nodelib/fs.stat" "^2.0.2"
761 | "@nodelib/fs.walk" "^1.2.3"
762 | "glob-parent" "^5.1.0"
763 | "merge2" "^1.3.0"
764 | "micromatch" "^4.0.2"
765 | "picomatch" "^2.2.1"
766 |
767 | "fast-json-stable-stringify@^2.0.0":
768 | "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
769 | "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
770 | "version" "2.1.0"
771 |
772 | "fast-levenshtein@^2.0.6":
773 | "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
774 | "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
775 | "version" "2.0.6"
776 |
777 | "fastq@^1.6.0":
778 | "integrity" "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w=="
779 | "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz"
780 | "version" "1.9.0"
781 | dependencies:
782 | "reusify" "^1.0.4"
783 |
784 | "file-entry-cache@^5.0.1":
785 | "integrity" "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g=="
786 | "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz"
787 | "version" "5.0.1"
788 | dependencies:
789 | "flat-cache" "^2.0.1"
790 |
791 | "fill-range@^7.0.1":
792 | "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="
793 | "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz"
794 | "version" "7.0.1"
795 | dependencies:
796 | "to-regex-range" "^5.0.1"
797 |
798 | "find-up@^2.0.0", "find-up@^2.1.0":
799 | "integrity" "sha1-RdG35QbHF93UgndaK3eSCjwMV6c="
800 | "resolved" "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz"
801 | "version" "2.1.0"
802 | dependencies:
803 | "locate-path" "^2.0.0"
804 |
805 | "flat-cache@^2.0.1":
806 | "integrity" "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA=="
807 | "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz"
808 | "version" "2.0.1"
809 | dependencies:
810 | "flatted" "^2.0.0"
811 | "rimraf" "2.6.3"
812 | "write" "1.0.3"
813 |
814 | "flatted@^2.0.0":
815 | "integrity" "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
816 | "resolved" "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz"
817 | "version" "2.0.2"
818 |
819 | "fs.realpath@^1.0.0":
820 | "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
821 | "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
822 | "version" "1.0.0"
823 |
824 | "fsevents@~2.1.2":
825 | "integrity" "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ=="
826 | "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz"
827 | "version" "2.1.3"
828 |
829 | "function-bind@^1.1.1":
830 | "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
831 | "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
832 | "version" "1.1.1"
833 |
834 | "functional-red-black-tree@^1.0.1":
835 | "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
836 | "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz"
837 | "version" "1.0.1"
838 |
839 | "get-intrinsic@^1.0.0":
840 | "integrity" "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg=="
841 | "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz"
842 | "version" "1.0.1"
843 | dependencies:
844 | "function-bind" "^1.1.1"
845 | "has" "^1.0.3"
846 | "has-symbols" "^1.0.1"
847 |
848 | "glob-parent@^5.0.0", "glob-parent@^5.1.0":
849 | "integrity" "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ=="
850 | "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz"
851 | "version" "5.1.1"
852 | dependencies:
853 | "is-glob" "^4.0.1"
854 |
855 | "glob@^7.1.3", "glob@^7.1.6":
856 | "integrity" "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="
857 | "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
858 | "version" "7.1.6"
859 | dependencies:
860 | "fs.realpath" "^1.0.0"
861 | "inflight" "^1.0.4"
862 | "inherits" "2"
863 | "minimatch" "^3.0.4"
864 | "once" "^1.3.0"
865 | "path-is-absolute" "^1.0.0"
866 |
867 | "globals@^12.1.0":
868 | "integrity" "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg=="
869 | "resolved" "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz"
870 | "version" "12.4.0"
871 | dependencies:
872 | "type-fest" "^0.8.1"
873 |
874 | "globby@^11.0.1":
875 | "integrity" "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ=="
876 | "resolved" "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz"
877 | "version" "11.0.1"
878 | dependencies:
879 | "array-union" "^2.1.0"
880 | "dir-glob" "^3.0.1"
881 | "fast-glob" "^3.1.1"
882 | "ignore" "^5.1.4"
883 | "merge2" "^1.3.0"
884 | "slash" "^3.0.0"
885 |
886 | "graceful-fs@^4.1.2":
887 | "integrity" "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
888 | "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz"
889 | "version" "4.2.4"
890 |
891 | "has-flag@^3.0.0":
892 | "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
893 | "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
894 | "version" "3.0.0"
895 |
896 | "has-flag@^4.0.0":
897 | "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
898 | "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
899 | "version" "4.0.0"
900 |
901 | "has-symbols@^1.0.1":
902 | "integrity" "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
903 | "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz"
904 | "version" "1.0.1"
905 |
906 | "has@^1.0.3":
907 | "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="
908 | "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
909 | "version" "1.0.3"
910 | dependencies:
911 | "function-bind" "^1.1.1"
912 |
913 | "hosted-git-info@^2.1.4":
914 | "integrity" "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
915 | "resolved" "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz"
916 | "version" "2.8.8"
917 |
918 | "ignore@^4.0.6":
919 | "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
920 | "resolved" "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz"
921 | "version" "4.0.6"
922 |
923 | "ignore@^5.1.4":
924 | "integrity" "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw=="
925 | "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz"
926 | "version" "5.1.8"
927 |
928 | "import-fresh@^3.0.0", "import-fresh@^3.2.1":
929 | "integrity" "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw=="
930 | "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz"
931 | "version" "3.2.2"
932 | dependencies:
933 | "parent-module" "^1.0.0"
934 | "resolve-from" "^4.0.0"
935 |
936 | "imurmurhash@^0.1.4":
937 | "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o="
938 | "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
939 | "version" "0.1.4"
940 |
941 | "inflight@^1.0.4":
942 | "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk="
943 | "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
944 | "version" "1.0.6"
945 | dependencies:
946 | "once" "^1.3.0"
947 | "wrappy" "1"
948 |
949 | "inherits@2":
950 | "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
951 | "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
952 | "version" "2.0.4"
953 |
954 | "is-arrayish@^0.2.1":
955 | "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
956 | "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
957 | "version" "0.2.1"
958 |
959 | "is-callable@^1.1.4", "is-callable@^1.2.2":
960 | "integrity" "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA=="
961 | "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz"
962 | "version" "1.2.2"
963 |
964 | "is-core-module@^2.0.0":
965 | "integrity" "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA=="
966 | "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz"
967 | "version" "2.1.0"
968 | dependencies:
969 | "has" "^1.0.3"
970 |
971 | "is-date-object@^1.0.1":
972 | "integrity" "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
973 | "resolved" "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz"
974 | "version" "1.0.2"
975 |
976 | "is-extglob@^2.1.1":
977 | "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
978 | "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
979 | "version" "2.1.1"
980 |
981 | "is-fullwidth-code-point@^2.0.0":
982 | "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
983 | "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz"
984 | "version" "2.0.0"
985 |
986 | "is-glob@^4.0.0", "is-glob@^4.0.1":
987 | "integrity" "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg=="
988 | "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz"
989 | "version" "4.0.1"
990 | dependencies:
991 | "is-extglob" "^2.1.1"
992 |
993 | "is-module@^1.0.0":
994 | "integrity" "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE="
995 | "resolved" "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz"
996 | "version" "1.0.0"
997 |
998 | "is-negative-zero@^2.0.0":
999 | "integrity" "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE="
1000 | "resolved" "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz"
1001 | "version" "2.0.0"
1002 |
1003 | "is-number@^7.0.0":
1004 | "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
1005 | "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
1006 | "version" "7.0.0"
1007 |
1008 | "is-reference@^1.2.1":
1009 | "integrity" "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="
1010 | "resolved" "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz"
1011 | "version" "1.2.1"
1012 | dependencies:
1013 | "@types/estree" "*"
1014 |
1015 | "is-regex@^1.1.1":
1016 | "integrity" "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg=="
1017 | "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz"
1018 | "version" "1.1.1"
1019 | dependencies:
1020 | "has-symbols" "^1.0.1"
1021 |
1022 | "is-string@^1.0.5":
1023 | "integrity" "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ=="
1024 | "resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz"
1025 | "version" "1.0.5"
1026 |
1027 | "is-symbol@^1.0.2":
1028 | "integrity" "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ=="
1029 | "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz"
1030 | "version" "1.0.3"
1031 | dependencies:
1032 | "has-symbols" "^1.0.1"
1033 |
1034 | "isarray@^1.0.0":
1035 | "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
1036 | "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
1037 | "version" "1.0.0"
1038 |
1039 | "isexe@^2.0.0":
1040 | "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
1041 | "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
1042 | "version" "2.0.0"
1043 |
1044 | "js-tokens@^4.0.0":
1045 | "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
1046 | "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
1047 | "version" "4.0.0"
1048 |
1049 | "js-yaml@^3.13.1":
1050 | "integrity" "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A=="
1051 | "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz"
1052 | "version" "3.14.0"
1053 | dependencies:
1054 | "argparse" "^1.0.7"
1055 | "esprima" "^4.0.0"
1056 |
1057 | "jsdoctypeparser@^9.0.0":
1058 | "integrity" "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw=="
1059 | "resolved" "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz"
1060 | "version" "9.0.0"
1061 |
1062 | "json-schema-traverse@^0.4.1":
1063 | "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
1064 | "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
1065 | "version" "0.4.1"
1066 |
1067 | "json-stable-stringify-without-jsonify@^1.0.1":
1068 | "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
1069 | "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
1070 | "version" "1.0.1"
1071 |
1072 | "json5@^1.0.1":
1073 | "integrity" "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow=="
1074 | "resolved" "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz"
1075 | "version" "1.0.1"
1076 | dependencies:
1077 | "minimist" "^1.2.0"
1078 |
1079 | "levn@^0.4.1":
1080 | "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="
1081 | "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
1082 | "version" "0.4.1"
1083 | dependencies:
1084 | "prelude-ls" "^1.2.1"
1085 | "type-check" "~0.4.0"
1086 |
1087 | "load-json-file@^2.0.0":
1088 | "integrity" "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg="
1089 | "resolved" "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz"
1090 | "version" "2.0.0"
1091 | dependencies:
1092 | "graceful-fs" "^4.1.2"
1093 | "parse-json" "^2.2.0"
1094 | "pify" "^2.0.0"
1095 | "strip-bom" "^3.0.0"
1096 |
1097 | "locate-path@^2.0.0":
1098 | "integrity" "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4="
1099 | "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz"
1100 | "version" "2.0.0"
1101 | dependencies:
1102 | "p-locate" "^2.0.0"
1103 | "path-exists" "^3.0.0"
1104 |
1105 | "lodash@^4.17.14", "lodash@^4.17.15", "lodash@^4.17.19", "lodash@^4.17.20":
1106 | "integrity" "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
1107 | "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz"
1108 | "version" "4.17.20"
1109 |
1110 | "magic-string@^0.25.7":
1111 | "integrity" "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA=="
1112 | "resolved" "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz"
1113 | "version" "0.25.7"
1114 | dependencies:
1115 | "sourcemap-codec" "^1.4.4"
1116 |
1117 | "merge2@^1.3.0":
1118 | "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
1119 | "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
1120 | "version" "1.4.1"
1121 |
1122 | "micromatch@^4.0.2":
1123 | "integrity" "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q=="
1124 | "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz"
1125 | "version" "4.0.2"
1126 | dependencies:
1127 | "braces" "^3.0.1"
1128 | "picomatch" "^2.0.5"
1129 |
1130 | "minimatch@^3.0.4":
1131 | "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA=="
1132 | "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
1133 | "version" "3.0.4"
1134 | dependencies:
1135 | "brace-expansion" "^1.1.7"
1136 |
1137 | "minimist@^1.2.0", "minimist@^1.2.5":
1138 | "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
1139 | "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
1140 | "version" "1.2.5"
1141 |
1142 | "mkdirp@^0.5.1":
1143 | "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ=="
1144 | "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz"
1145 | "version" "0.5.5"
1146 | dependencies:
1147 | "minimist" "^1.2.5"
1148 |
1149 | "ms@2.0.0":
1150 | "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1151 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
1152 | "version" "2.0.0"
1153 |
1154 | "ms@2.1.2":
1155 | "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1156 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
1157 | "version" "2.1.2"
1158 |
1159 | "natural-compare@^1.4.0":
1160 | "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
1161 | "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
1162 | "version" "1.4.0"
1163 |
1164 | "normalize-package-data@^2.3.2":
1165 | "integrity" "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA=="
1166 | "resolved" "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz"
1167 | "version" "2.5.0"
1168 | dependencies:
1169 | "hosted-git-info" "^2.1.4"
1170 | "resolve" "^1.10.0"
1171 | "semver" "2 || 3 || 4 || 5"
1172 | "validate-npm-package-license" "^3.0.1"
1173 |
1174 | "object-inspect@^1.8.0":
1175 | "integrity" "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA=="
1176 | "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz"
1177 | "version" "1.8.0"
1178 |
1179 | "object-keys@^1.0.12", "object-keys@^1.1.1":
1180 | "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
1181 | "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
1182 | "version" "1.1.1"
1183 |
1184 | "object.assign@^4.1.1", "object.assign@^4.1.2":
1185 | "integrity" "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ=="
1186 | "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz"
1187 | "version" "4.1.2"
1188 | dependencies:
1189 | "call-bind" "^1.0.0"
1190 | "define-properties" "^1.1.3"
1191 | "has-symbols" "^1.0.1"
1192 | "object-keys" "^1.1.1"
1193 |
1194 | "object.entries@^1.1.2":
1195 | "integrity" "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA=="
1196 | "resolved" "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz"
1197 | "version" "1.1.2"
1198 | dependencies:
1199 | "define-properties" "^1.1.3"
1200 | "es-abstract" "^1.17.5"
1201 | "has" "^1.0.3"
1202 |
1203 | "object.values@^1.1.1":
1204 | "integrity" "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA=="
1205 | "resolved" "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz"
1206 | "version" "1.1.1"
1207 | dependencies:
1208 | "define-properties" "^1.1.3"
1209 | "es-abstract" "^1.17.0-next.1"
1210 | "function-bind" "^1.1.1"
1211 | "has" "^1.0.3"
1212 |
1213 | "obsidian@https://github.com/obsidianmd/obsidian-api/tarball/master":
1214 | "integrity" "sha512-PNg5nE/Benbe4t+Sse5Omcq27f+EJwNH8sQfdk9w1RQks1Z3DmGf5hf9+QdR1Gunt3r2T6cDP2ZD/PIh/FDHtA=="
1215 | "resolved" "https://github.com/obsidianmd/obsidian-api/tarball/master"
1216 | "version" "0.9.11"
1217 | dependencies:
1218 | "@types/codemirror" "0.0.98"
1219 |
1220 | "once@^1.3.0":
1221 | "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E="
1222 | "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
1223 | "version" "1.4.0"
1224 | dependencies:
1225 | "wrappy" "1"
1226 |
1227 | "optionator@^0.9.1":
1228 | "integrity" "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw=="
1229 | "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz"
1230 | "version" "0.9.1"
1231 | dependencies:
1232 | "deep-is" "^0.1.3"
1233 | "fast-levenshtein" "^2.0.6"
1234 | "levn" "^0.4.1"
1235 | "prelude-ls" "^1.2.1"
1236 | "type-check" "^0.4.0"
1237 | "word-wrap" "^1.2.3"
1238 |
1239 | "p-limit@^1.1.0":
1240 | "integrity" "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q=="
1241 | "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz"
1242 | "version" "1.3.0"
1243 | dependencies:
1244 | "p-try" "^1.0.0"
1245 |
1246 | "p-locate@^2.0.0":
1247 | "integrity" "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM="
1248 | "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz"
1249 | "version" "2.0.0"
1250 | dependencies:
1251 | "p-limit" "^1.1.0"
1252 |
1253 | "p-try@^1.0.0":
1254 | "integrity" "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
1255 | "resolved" "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz"
1256 | "version" "1.0.0"
1257 |
1258 | "parent-module@^1.0.0":
1259 | "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="
1260 | "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
1261 | "version" "1.0.1"
1262 | dependencies:
1263 | "callsites" "^3.0.0"
1264 |
1265 | "parse-json@^2.2.0":
1266 | "integrity" "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck="
1267 | "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz"
1268 | "version" "2.2.0"
1269 | dependencies:
1270 | "error-ex" "^1.2.0"
1271 |
1272 | "path-exists@^3.0.0":
1273 | "integrity" "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
1274 | "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz"
1275 | "version" "3.0.0"
1276 |
1277 | "path-is-absolute@^1.0.0":
1278 | "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
1279 | "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
1280 | "version" "1.0.1"
1281 |
1282 | "path-key@^3.1.0":
1283 | "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
1284 | "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
1285 | "version" "3.1.1"
1286 |
1287 | "path-parse@^1.0.6":
1288 | "integrity" "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
1289 | "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz"
1290 | "version" "1.0.6"
1291 |
1292 | "path-type@^2.0.0":
1293 | "integrity" "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM="
1294 | "resolved" "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz"
1295 | "version" "2.0.0"
1296 | dependencies:
1297 | "pify" "^2.0.0"
1298 |
1299 | "path-type@^4.0.0":
1300 | "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
1301 | "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
1302 | "version" "4.0.0"
1303 |
1304 | "picomatch@^2.0.5", "picomatch@^2.2.1", "picomatch@^2.2.2":
1305 | "integrity" "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
1306 | "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz"
1307 | "version" "2.2.2"
1308 |
1309 | "pify@^2.0.0":
1310 | "integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
1311 | "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
1312 | "version" "2.3.0"
1313 |
1314 | "pkg-dir@^2.0.0":
1315 | "integrity" "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s="
1316 | "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz"
1317 | "version" "2.0.0"
1318 | dependencies:
1319 | "find-up" "^2.1.0"
1320 |
1321 | "prelude-ls@^1.2.1":
1322 | "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
1323 | "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
1324 | "version" "1.2.1"
1325 |
1326 | "progress@^2.0.0":
1327 | "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
1328 | "resolved" "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"
1329 | "version" "2.0.3"
1330 |
1331 | "punycode@^2.1.0":
1332 | "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
1333 | "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
1334 | "version" "2.1.1"
1335 |
1336 | "read-pkg-up@^2.0.0":
1337 | "integrity" "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4="
1338 | "resolved" "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz"
1339 | "version" "2.0.0"
1340 | dependencies:
1341 | "find-up" "^2.0.0"
1342 | "read-pkg" "^2.0.0"
1343 |
1344 | "read-pkg@^2.0.0":
1345 | "integrity" "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg="
1346 | "resolved" "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz"
1347 | "version" "2.0.0"
1348 | dependencies:
1349 | "load-json-file" "^2.0.0"
1350 | "normalize-package-data" "^2.3.2"
1351 | "path-type" "^2.0.0"
1352 |
1353 | "regexpp@^3.0.0", "regexpp@^3.1.0":
1354 | "integrity" "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q=="
1355 | "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz"
1356 | "version" "3.1.0"
1357 |
1358 | "regextras@^0.7.1":
1359 | "integrity" "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w=="
1360 | "resolved" "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz"
1361 | "version" "0.7.1"
1362 |
1363 | "resolve-from@^4.0.0":
1364 | "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
1365 | "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
1366 | "version" "4.0.0"
1367 |
1368 | "resolve@^1.10.0", "resolve@^1.13.1", "resolve@^1.17.0":
1369 | "integrity" "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA=="
1370 | "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz"
1371 | "version" "1.18.1"
1372 | dependencies:
1373 | "is-core-module" "^2.0.0"
1374 | "path-parse" "^1.0.6"
1375 |
1376 | "reusify@^1.0.4":
1377 | "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
1378 | "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
1379 | "version" "1.0.4"
1380 |
1381 | "rimraf@2.6.3":
1382 | "integrity" "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA=="
1383 | "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz"
1384 | "version" "2.6.3"
1385 | dependencies:
1386 | "glob" "^7.1.3"
1387 |
1388 | "rollup@^1.20.0||^2.0.0", "rollup@^2.14.0", "rollup@^2.22.0", "rollup@^2.32.1":
1389 | "integrity" "sha512-uY4O/IoL9oNW8MMcbA5hcOaz6tZTMIh7qJHx/tzIJm+n1wLoY38BLn6fuy7DhR57oNFLMbDQtDeJoFURt5933w=="
1390 | "resolved" "https://registry.npmjs.org/rollup/-/rollup-2.33.1.tgz"
1391 | "version" "2.33.1"
1392 | dependencies:
1393 | "fsevents" "~2.1.2"
1394 | optionalDependencies:
1395 | "fsevents" "~2.1.2"
1396 |
1397 | "run-parallel@^1.1.9":
1398 | "integrity" "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw=="
1399 | "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz"
1400 | "version" "1.1.10"
1401 |
1402 | "semver@^7.2.1", "semver@^7.3.2":
1403 | "integrity" "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
1404 | "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz"
1405 | "version" "7.3.2"
1406 |
1407 | "semver@2 || 3 || 4 || 5":
1408 | "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
1409 | "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz"
1410 | "version" "5.7.1"
1411 |
1412 | "shebang-command@^2.0.0":
1413 | "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="
1414 | "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
1415 | "version" "2.0.0"
1416 | dependencies:
1417 | "shebang-regex" "^3.0.0"
1418 |
1419 | "shebang-regex@^3.0.0":
1420 | "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
1421 | "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
1422 | "version" "3.0.0"
1423 |
1424 | "slash@^3.0.0":
1425 | "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
1426 | "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
1427 | "version" "3.0.0"
1428 |
1429 | "slice-ansi@^2.1.0":
1430 | "integrity" "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ=="
1431 | "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz"
1432 | "version" "2.1.0"
1433 | dependencies:
1434 | "ansi-styles" "^3.2.0"
1435 | "astral-regex" "^1.0.0"
1436 | "is-fullwidth-code-point" "^2.0.0"
1437 |
1438 | "sourcemap-codec@^1.4.4":
1439 | "integrity" "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
1440 | "resolved" "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz"
1441 | "version" "1.4.8"
1442 |
1443 | "spdx-correct@^3.0.0":
1444 | "integrity" "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w=="
1445 | "resolved" "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz"
1446 | "version" "3.1.1"
1447 | dependencies:
1448 | "spdx-expression-parse" "^3.0.0"
1449 | "spdx-license-ids" "^3.0.0"
1450 |
1451 | "spdx-exceptions@^2.1.0":
1452 | "integrity" "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
1453 | "resolved" "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz"
1454 | "version" "2.3.0"
1455 |
1456 | "spdx-expression-parse@^3.0.0", "spdx-expression-parse@^3.0.1":
1457 | "integrity" "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="
1458 | "resolved" "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz"
1459 | "version" "3.0.1"
1460 | dependencies:
1461 | "spdx-exceptions" "^2.1.0"
1462 | "spdx-license-ids" "^3.0.0"
1463 |
1464 | "spdx-license-ids@^3.0.0":
1465 | "integrity" "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw=="
1466 | "resolved" "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz"
1467 | "version" "3.0.6"
1468 |
1469 | "sprintf-js@~1.0.2":
1470 | "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
1471 | "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
1472 | "version" "1.0.3"
1473 |
1474 | "string-width@^3.0.0":
1475 | "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w=="
1476 | "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz"
1477 | "version" "3.1.0"
1478 | dependencies:
1479 | "emoji-regex" "^7.0.1"
1480 | "is-fullwidth-code-point" "^2.0.0"
1481 | "strip-ansi" "^5.1.0"
1482 |
1483 | "string.prototype.trimend@^1.0.1":
1484 | "integrity" "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw=="
1485 | "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz"
1486 | "version" "1.0.2"
1487 | dependencies:
1488 | "define-properties" "^1.1.3"
1489 | "es-abstract" "^1.18.0-next.1"
1490 |
1491 | "string.prototype.trimstart@^1.0.1":
1492 | "integrity" "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg=="
1493 | "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz"
1494 | "version" "1.0.2"
1495 | dependencies:
1496 | "define-properties" "^1.1.3"
1497 | "es-abstract" "^1.18.0-next.1"
1498 |
1499 | "strip-ansi@^5.1.0":
1500 | "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="
1501 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz"
1502 | "version" "5.2.0"
1503 | dependencies:
1504 | "ansi-regex" "^4.1.0"
1505 |
1506 | "strip-ansi@^6.0.0":
1507 | "integrity" "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w=="
1508 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz"
1509 | "version" "6.0.0"
1510 | dependencies:
1511 | "ansi-regex" "^5.0.0"
1512 |
1513 | "strip-bom@^3.0.0":
1514 | "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
1515 | "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz"
1516 | "version" "3.0.0"
1517 |
1518 | "strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1":
1519 | "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
1520 | "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
1521 | "version" "3.1.1"
1522 |
1523 | "supports-color@^5.3.0":
1524 | "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="
1525 | "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
1526 | "version" "5.5.0"
1527 | dependencies:
1528 | "has-flag" "^3.0.0"
1529 |
1530 | "supports-color@^7.1.0":
1531 | "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="
1532 | "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
1533 | "version" "7.2.0"
1534 | dependencies:
1535 | "has-flag" "^4.0.0"
1536 |
1537 | "table@^5.2.3":
1538 | "integrity" "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug=="
1539 | "resolved" "https://registry.npmjs.org/table/-/table-5.4.6.tgz"
1540 | "version" "5.4.6"
1541 | dependencies:
1542 | "ajv" "^6.10.2"
1543 | "lodash" "^4.17.14"
1544 | "slice-ansi" "^2.1.0"
1545 | "string-width" "^3.0.0"
1546 |
1547 | "text-table@^0.2.0":
1548 | "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
1549 | "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
1550 | "version" "0.2.0"
1551 |
1552 | "to-regex-range@^5.0.1":
1553 | "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="
1554 | "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
1555 | "version" "5.0.1"
1556 | dependencies:
1557 | "is-number" "^7.0.0"
1558 |
1559 | "tsconfig-paths@^3.9.0":
1560 | "integrity" "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw=="
1561 | "resolved" "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz"
1562 | "version" "3.9.0"
1563 | dependencies:
1564 | "@types/json5" "^0.0.29"
1565 | "json5" "^1.0.1"
1566 | "minimist" "^1.2.0"
1567 | "strip-bom" "^3.0.0"
1568 |
1569 | "tslib@*", "tslib@^2.0.3":
1570 | "integrity" "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
1571 | "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz"
1572 | "version" "2.0.3"
1573 |
1574 | "tslib@^1.8.1":
1575 | "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
1576 | "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
1577 | "version" "1.14.1"
1578 |
1579 | "tsutils@^3.17.1":
1580 | "integrity" "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g=="
1581 | "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz"
1582 | "version" "3.17.1"
1583 | dependencies:
1584 | "tslib" "^1.8.1"
1585 |
1586 | "type-check@^0.4.0", "type-check@~0.4.0":
1587 | "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="
1588 | "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
1589 | "version" "0.4.0"
1590 | dependencies:
1591 | "prelude-ls" "^1.2.1"
1592 |
1593 | "type-fest@^0.8.1":
1594 | "integrity" "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
1595 | "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz"
1596 | "version" "0.8.1"
1597 |
1598 | "typescript@^4.0.3", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.4.0":
1599 | "integrity" "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ=="
1600 | "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz"
1601 | "version" "4.0.5"
1602 |
1603 | "uri-js@^4.2.2":
1604 | "integrity" "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g=="
1605 | "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz"
1606 | "version" "4.4.0"
1607 | dependencies:
1608 | "punycode" "^2.1.0"
1609 |
1610 | "v8-compile-cache@^2.0.3":
1611 | "integrity" "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q=="
1612 | "resolved" "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz"
1613 | "version" "2.2.0"
1614 |
1615 | "validate-npm-package-license@^3.0.1":
1616 | "integrity" "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="
1617 | "resolved" "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz"
1618 | "version" "3.0.4"
1619 | dependencies:
1620 | "spdx-correct" "^3.0.0"
1621 | "spdx-expression-parse" "^3.0.0"
1622 |
1623 | "which@^2.0.1":
1624 | "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="
1625 | "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
1626 | "version" "2.0.2"
1627 | dependencies:
1628 | "isexe" "^2.0.0"
1629 |
1630 | "word-wrap@^1.2.3":
1631 | "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
1632 | "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz"
1633 | "version" "1.2.3"
1634 |
1635 | "wrappy@1":
1636 | "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
1637 | "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
1638 | "version" "1.0.2"
1639 |
1640 | "write@1.0.3":
1641 | "integrity" "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig=="
1642 | "resolved" "https://registry.npmjs.org/write/-/write-1.0.3.tgz"
1643 | "version" "1.0.3"
1644 | dependencies:
1645 | "mkdirp" "^0.5.1"
1646 |
--------------------------------------------------------------------------------