├── .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 | ![Demo](https://github.com/akaalias/obsidian-text-expander-plugin/blob/main/demo.gif?raw=true) 14 | 15 | ## Settings 16 | 17 | ![Settings](https://github.com/akaalias/obsidian-text-expander-plugin/raw/main/settings.png) 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 | --------------------------------------------------------------------------------