UNPKG

21.8 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var tslib_1 = require("tslib");
4var fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
5var path_1 = tslib_1.__importDefault(require("path"));
6var commander_1 = require("./lib/commander");
7var pkg_up_1 = tslib_1.__importDefault(require("pkg-up"));
8var resolve_pkg_1 = tslib_1.__importDefault(require("resolve-pkg"));
9var config_1 = require("./lib/config");
10var debug = require('debug')('app:main');
11var plugin_1 = require("./lib/plugin");
12var requireg = require('requireg');
13var globalDirs = require('global-dirs');
14var App = /** @class */ (function () {
15 function App() {
16 var _this = this;
17 /**
18 * plugin's name
19 */
20 this.plugins = [];
21 /**
22 * is plugin folder
23 */
24 this.isPluginFolder = function (folder) {
25 return new RegExp(_this.conf.prefix).test(folder);
26 };
27 this.conf = config_1.getConf();
28 this.program = commander_1.getProgram();
29 }
30 /**
31 * add plugin
32 * @param pluginName plugin name
33 * @param cwd plugin cwd
34 */
35 App.prototype.addPlugin = function (pluginName, cwd, checkDeps) {
36 if (checkDeps === void 0) { checkDeps = true; }
37 return tslib_1.__awaiter(this, void 0, void 0, function () {
38 var pkgCwd, plugin, plug, Plug;
39 return tslib_1.__generator(this, function (_a) {
40 switch (_a.label) {
41 case 0:
42 debug('add plugin: %o at %o', pluginName, cwd);
43 pkgCwd = pkg_up_1.default.sync(cwd);
44 if (!pkgCwd) {
45 return [2 /*return*/];
46 }
47 if (!checkDeps) return [3 /*break*/, 2];
48 // add missing deps
49 return [4 /*yield*/, require('check-dependencies')({
50 install: true,
51 verbose: false,
52 packageDir: cwd,
53 })];
54 case 1:
55 // add missing deps
56 _a.sent();
57 _a.label = 2;
58 case 2:
59 if (!this.plugins.includes(pluginName)) {
60 plugin = requireg(cwd);
61 plug = plugin.default || plugin;
62 if (typeof plug === 'function') {
63 try {
64 Plug = new plugin_1.Plugin(this.program, this.conf, pkgCwd);
65 plug(Plug);
66 this.plugins.push(pluginName);
67 debug('loading plugin at path: %o succeed', cwd);
68 }
69 catch (error) {
70 debug('loading plugin at path: %o failed with errors: %o', cwd, error);
71 }
72 }
73 else {
74 debug('loading plugin at path: %o failed\n%s must be a function instead of %o', cwd, pluginName, typeof plug);
75 }
76 }
77 return [2 /*return*/];
78 }
79 });
80 });
81 };
82 /**
83 * load local plugins defined by user
84 * @param dir dir for local plugins
85 */
86 App.prototype.loadPluginsByDir = function (dir, checkDeps) {
87 if (checkDeps === void 0) { checkDeps = true; }
88 return tslib_1.__awaiter(this, void 0, void 0, function () {
89 var _this = this;
90 var folders, folders_1, folders_1_1, f, cwd, e_1_1, e_1, _a;
91 return tslib_1.__generator(this, function (_b) {
92 switch (_b.label) {
93 case 0:
94 if (!fs_extra_1.default.pathExistsSync(dir)) {
95 debug('Not found local plugins at: %o', dir);
96 return [2 /*return*/];
97 }
98 return [4 /*yield*/, fs_extra_1.default.readdir(dir)];
99 case 1:
100 folders = _b.sent();
101 if (!(folders && folders.length)) return [3 /*break*/, 9];
102 folders = folders.filter(function (f) { return _this.isPluginFolder(f); });
103 _b.label = 2;
104 case 2:
105 _b.trys.push([2, 7, 8, 9]);
106 folders_1 = tslib_1.__values(folders), folders_1_1 = folders_1.next();
107 _b.label = 3;
108 case 3:
109 if (!!folders_1_1.done) return [3 /*break*/, 6];
110 f = folders_1_1.value;
111 cwd = path_1.default.join(dir, f);
112 return [4 /*yield*/, this.addPlugin(f, cwd, checkDeps)];
113 case 4:
114 _b.sent();
115 _b.label = 5;
116 case 5:
117 folders_1_1 = folders_1.next();
118 return [3 /*break*/, 3];
119 case 6: return [3 /*break*/, 9];
120 case 7:
121 e_1_1 = _b.sent();
122 e_1 = { error: e_1_1 };
123 return [3 /*break*/, 9];
124 case 8:
125 try {
126 if (folders_1_1 && !folders_1_1.done && (_a = folders_1.return)) _a.call(folders_1);
127 }
128 finally { if (e_1) throw e_1.error; }
129 return [7 /*endfinally*/];
130 case 9: return [2 /*return*/];
131 }
132 });
133 });
134 };
135 /**
136 * load ./plugins
137 */
138 App.prototype.loadUserLocalPlugins = function () {
139 return tslib_1.__awaiter(this, void 0, void 0, function () {
140 var cwd;
141 return tslib_1.__generator(this, function (_a) {
142 switch (_a.label) {
143 case 0:
144 cwd = path_1.default.join(process.cwd(), this.conf.pluginDir);
145 return [4 /*yield*/, this.loadPluginsByDir(cwd)];
146 case 1:
147 _a.sent();
148 return [2 /*return*/];
149 }
150 });
151 });
152 };
153 /**
154 * loading plugins which install it as a dependence in package.json
155 */
156 App.prototype.loadPlugins = function () {
157 return tslib_1.__awaiter(this, void 0, void 0, function () {
158 var _this = this;
159 var cwdPkg, pkg, deps, npmPlugins, npmPlugins_1, npmPlugins_1_1, dep, cwd, e_2_1, e_2, _a;
160 return tslib_1.__generator(this, function (_b) {
161 switch (_b.label) {
162 case 0:
163 cwdPkg = path_1.default.join(process.cwd(), 'package.json');
164 if (!fs_extra_1.default.existsSync(cwdPkg)) {
165 return [2 /*return*/];
166 }
167 debug('finding npm plugins in %o ', cwdPkg);
168 return [4 /*yield*/, fs_extra_1.default.readJSON(cwdPkg)];
169 case 1:
170 pkg = _b.sent();
171 if (!(pkg.dependencies || pkg.devDependencies)) return [3 /*break*/, 10];
172 deps = tslib_1.__assign({}, pkg.dependencies, pkg.devDependencies);
173 npmPlugins = Object.keys(deps).filter(function (f) { return _this.isPluginFolder(f); });
174 debug('npm plugins: %o', npmPlugins);
175 _b.label = 2;
176 case 2:
177 _b.trys.push([2, 8, 9, 10]);
178 npmPlugins_1 = tslib_1.__values(npmPlugins), npmPlugins_1_1 = npmPlugins_1.next();
179 _b.label = 3;
180 case 3:
181 if (!!npmPlugins_1_1.done) return [3 /*break*/, 7];
182 dep = npmPlugins_1_1.value;
183 cwd = resolve_pkg_1.default(dep);
184 if (!cwd) return [3 /*break*/, 5];
185 return [4 /*yield*/, this.addPlugin(dep, cwd, false)];
186 case 4:
187 _b.sent();
188 return [3 /*break*/, 6];
189 case 5:
190 console.log('can not find %o, make sure you have installed it already', dep);
191 _b.label = 6;
192 case 6:
193 npmPlugins_1_1 = npmPlugins_1.next();
194 return [3 /*break*/, 3];
195 case 7: return [3 /*break*/, 10];
196 case 8:
197 e_2_1 = _b.sent();
198 e_2 = { error: e_2_1 };
199 return [3 /*break*/, 10];
200 case 9:
201 try {
202 if (npmPlugins_1_1 && !npmPlugins_1_1.done && (_a = npmPlugins_1.return)) _a.call(npmPlugins_1);
203 }
204 finally { if (e_2) throw e_2.error; }
205 return [7 /*endfinally*/];
206 case 10: return [2 /*return*/];
207 }
208 });
209 });
210 };
211 App.prototype.loadGlobalPlugins = function () {
212 return tslib_1.__awaiter(this, void 0, void 0, function () {
213 return tslib_1.__generator(this, function (_a) {
214 switch (_a.label) {
215 case 0: return [4 /*yield*/, this.loadPluginsByDir(globalDirs.npm.packages, false)];
216 case 1:
217 _a.sent();
218 return [4 /*yield*/, this.loadPluginsByDir(globalDirs.yarn.packages, false)];
219 case 2:
220 _a.sent();
221 return [2 /*return*/];
222 }
223 });
224 });
225 };
226 /**
227 * install plugins the order is:
228 * - user local plugins
229 * - system local plugins
230 * - plugins
231 */
232 App.prototype.install = function () {
233 return tslib_1.__awaiter(this, void 0, void 0, function () {
234 return tslib_1.__generator(this, function (_a) {
235 switch (_a.label) {
236 case 0: return [4 /*yield*/, this.loadPluginsByDir(path_1.default.join(__dirname, 'plugins'))];
237 case 1:
238 _a.sent();
239 return [4 /*yield*/, this.loadUserLocalPlugins()];
240 case 2:
241 _a.sent();
242 return [4 /*yield*/, this.loadPlugins()];
243 case 3:
244 _a.sent();
245 return [4 /*yield*/, this.loadGlobalPlugins()];
246 case 4:
247 _a.sent();
248 return [2 /*return*/];
249 }
250 });
251 });
252 };
253 /**
254 * run a plugin immediately
255 * @param plugin local plugin for debug
256 * - ./path/to/plugin-entry
257 * - /path/to/plugin-entry
258 * - merry-plugin-awesome-plugin
259 * @param options
260 */
261 App.prototype.debug = function (plugin, options) {
262 return tslib_1.__awaiter(this, void 0, void 0, function () {
263 var p, plug, pkgCwd, Plug;
264 return tslib_1.__generator(this, function (_a) {
265 switch (_a.label) {
266 case 0:
267 debug('isAbsolute: %o', path_1.default.isAbsolute(plugin));
268 if (!(!path_1.default.isAbsolute(plugin) && this.isPluginFolder(plugin))) return [3 /*break*/, 2];
269 return [4 /*yield*/, this.addPlugin(plugin, process.cwd())];
270 case 1:
271 _a.sent();
272 return [3 /*break*/, 3];
273 case 2:
274 plugin = path_1.default.isAbsolute(plugin)
275 ? plugin
276 : path_1.default.join(process.cwd(), plugin);
277 if (fs_extra_1.default.existsSync(plugin)) {
278 try {
279 p = require(plugin);
280 plug = p.default || p;
281 pkgCwd = pkg_up_1.default.sync(plugin);
282 Plug = new plugin_1.Plugin(this.program, this.conf, pkgCwd);
283 plug(Plug);
284 debug('loading plugin at path: %o succeed', pkgCwd);
285 }
286 catch (error) {
287 debug('error: %o', error);
288 }
289 }
290 _a.label = 3;
291 case 3: return [2 /*return*/];
292 }
293 });
294 });
295 };
296 /**
297 * install plugins and run
298 */
299 App.prototype.run = function () {
300 return tslib_1.__awaiter(this, void 0, void 0, function () {
301 var _this = this;
302 return tslib_1.__generator(this, function (_a) {
303 switch (_a.label) {
304 case 0: return [4 /*yield*/, this.install()
305 // only install debug plugin in DEBUG mode
306 ];
307 case 1:
308 _a.sent();
309 // only install debug plugin in DEBUG mode
310 if (!!process.env.DEBUG) {
311 this.program
312 .command('debug [plugin]')
313 .action(function (p, options) {
314 _this.debug(p, options);
315 });
316 }
317 this.program.parse(process.argv);
318 if (!process.argv.slice(2).length) {
319 this.program.outputHelp();
320 }
321 return [2 /*return*/];
322 }
323 });
324 });
325 };
326 return App;
327}());
328exports.App = App;
329exports.default = new App();
330//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4REFBeUI7QUFDekIsc0RBQXVCO0FBRXZCLDZDQUE0QztBQUM1QywwREFBMEI7QUFDMUIsb0VBQW9DO0FBQ3BDLHVDQUErQztBQUMvQyxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7QUFDMUMsdUNBQThDO0FBQzlDLElBQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtBQUNwQyxJQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUE7QUFDekM7SUFhQztRQUFBLGlCQUdDO1FBUEQ7O1dBRUc7UUFDTyxZQUFPLEdBQVUsRUFBRSxDQUFBO1FBSzdCOztXQUVHO1FBQ0ssbUJBQWMsR0FBRyxVQUFDLE1BQWM7WUFDdkMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNqRCxDQUFDLENBQUE7UUFSQSxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFPLEVBQUUsQ0FBQTtRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLHNCQUFVLEVBQUUsQ0FBQTtJQUM1QixDQUFDO0lBT0Q7Ozs7T0FJRztJQUNXLHVCQUFTLEdBQXZCLFVBQXdCLFVBQWtCLEVBQUUsR0FBVyxFQUFFLFNBQWdCO1FBQWhCLDBCQUFBLEVBQUEsZ0JBQWdCOzs7Ozs7d0JBQ3hFLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUE7d0JBQ3hDLE1BQU0sR0FBRyxnQkFBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTt3QkFDOUIsSUFBSSxDQUFDLE1BQU0sRUFBRTs0QkFDWixzQkFBTTt5QkFDTjs2QkFDRyxTQUFTLEVBQVQsd0JBQVM7d0JBQ1osbUJBQW1CO3dCQUNuQixxQkFBTSxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQ0FDbkMsT0FBTyxFQUFFLElBQUk7Z0NBQ2IsT0FBTyxFQUFFLEtBQUs7Z0NBQ2QsVUFBVSxFQUFFLEdBQUc7NkJBQ2YsQ0FBQyxFQUFBOzt3QkFMRixtQkFBbUI7d0JBQ25CLFNBSUUsQ0FBQTs7O3dCQUVILElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTs0QkFDakMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTs0QkFDdEIsSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFBOzRCQUNyQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVUsRUFBRTtnQ0FDL0IsSUFBSTtvQ0FDRyxJQUFJLEdBQUcsSUFBSSxlQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO29DQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7b0NBQ1YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7b0NBQzdCLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLENBQUMsQ0FBQTtpQ0FDaEQ7Z0NBQUMsT0FBTyxLQUFLLEVBQUU7b0NBQ2YsS0FBSyxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtpQ0FDdEU7NkJBQ0Q7aUNBQU07Z0NBQ04sS0FBSyxDQUNKLHdFQUF3RSxFQUN4RSxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sSUFBSSxDQUNYLENBQUE7NkJBQ0Q7eUJBQ0Q7Ozs7O0tBQ0Q7SUFDRDs7O09BR0c7SUFDVyw4QkFBZ0IsR0FBOUIsVUFBK0IsR0FBVyxFQUFFLFNBQWdCO1FBQWhCLDBCQUFBLEVBQUEsZ0JBQWdCOzs7Ozs7O3dCQUMzRCxJQUFJLENBQUMsa0JBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7NEJBQzVCLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLENBQUMsQ0FBQTs0QkFDNUMsc0JBQU07eUJBQ047d0JBQ2EscUJBQU0sa0JBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUE7O3dCQUEvQixPQUFPLEdBQUcsU0FBcUI7NkJBQy9CLENBQUEsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUEsRUFBekIsd0JBQXlCO3dCQUM1QixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLEtBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQXRCLENBQXNCLENBQUMsQ0FBQTs7Ozt3QkFDckMsWUFBQSxpQkFBQSxPQUFPLENBQUE7Ozs7d0JBQVosQ0FBQzt3QkFDTCxHQUFHLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUE7d0JBQzdCLHFCQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsRUFBQTs7d0JBQXZDLFNBQXVDLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBR3pDO0lBQ0Q7O09BRUc7SUFDVyxrQ0FBb0IsR0FBbEM7Ozs7Ozt3QkFDTyxHQUFHLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTt3QkFDekQscUJBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFBOzt3QkFBaEMsU0FBZ0MsQ0FBQTs7Ozs7S0FDaEM7SUFDRDs7T0FFRztJQUNXLHlCQUFXLEdBQXpCOzs7Ozs7O3dCQUNPLE1BQU0sR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQTt3QkFDdkQsSUFBSSxDQUFDLGtCQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUMzQixzQkFBTTt5QkFDTjt3QkFDRCxLQUFLLENBQUMsNEJBQTRCLEVBQUUsTUFBTSxDQUFDLENBQUE7d0JBQ3RCLHFCQUFNLGtCQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFBOzt3QkFBeEMsR0FBRyxHQUFZLFNBQXlCOzZCQUMxQyxDQUFBLEdBQUcsQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQSxFQUF2Qyx5QkFBdUM7d0JBQ3BDLElBQUksd0JBQVEsR0FBRyxDQUFDLFlBQVksRUFBSyxHQUFHLENBQUMsZUFBZSxDQUFFLENBQUE7d0JBQ3RELFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLEtBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQXRCLENBQXNCLENBQUMsQ0FBQTt3QkFDeEUsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFBOzs7O3dCQUNsQixlQUFBLGlCQUFBLFVBQVUsQ0FBQTs7Ozt3QkFBakIsR0FBRzt3QkFDUCxHQUFHLEdBQUcscUJBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTs2QkFDdkIsR0FBRyxFQUFILHdCQUFHO3dCQUNOLHFCQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBQTs7d0JBQXJDLFNBQXFDLENBQUE7Ozt3QkFFckMsT0FBTyxDQUFDLEdBQUcsQ0FDViwwREFBMEQsRUFDMUQsR0FBRyxDQUNILENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBSUo7SUFDYSwrQkFBaUIsR0FBL0I7Ozs7NEJBQ0MscUJBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFBOzt3QkFBM0QsU0FBMkQsQ0FBQTt3QkFDM0QscUJBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFBOzt3QkFBNUQsU0FBNEQsQ0FBQTs7Ozs7S0FDNUQ7SUFDRDs7Ozs7T0FLRztJQUNVLHFCQUFPLEdBQXBCOzs7OzRCQUNDLHFCQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFBOzt3QkFBNUQsU0FBNEQsQ0FBQTt3QkFDNUQscUJBQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUE7O3dCQUFqQyxTQUFpQyxDQUFBO3dCQUNqQyxxQkFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUE7O3dCQUF4QixTQUF3QixDQUFBO3dCQUN4QixxQkFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBQTs7d0JBQTlCLFNBQThCLENBQUE7Ozs7O0tBQzlCO0lBRUQ7Ozs7Ozs7T0FPRztJQUNXLG1CQUFLLEdBQW5CLFVBQW9CLE1BQWMsRUFBRSxPQUFZOzs7Ozs7d0JBQy9DLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxjQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7NkJBRTVDLENBQUEsQ0FBQyxjQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUEsRUFBdkQsd0JBQXVEO3dCQUMxRCxxQkFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBQTs7d0JBQTNDLFNBQTJDLENBQUE7Ozt3QkFFM0MsTUFBTSxHQUFHLGNBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDOzRCQUMvQixDQUFDLENBQUMsTUFBTTs0QkFDUixDQUFDLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUE7d0JBRW5DLElBQUksa0JBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7NEJBQzFCLElBQUk7Z0NBQ0csQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQ0FDbkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFBO2dDQUNyQixNQUFNLEdBQUcsZ0JBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7Z0NBQzNCLElBQUksR0FBRyxJQUFJLGVBQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7Z0NBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQ0FDVixLQUFLLENBQUMsb0NBQW9DLEVBQUUsTUFBTSxDQUFDLENBQUE7NkJBQ25EOzRCQUFDLE9BQU8sS0FBSyxFQUFFO2dDQUNmLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUE7NkJBQ3pCO3lCQUNEOzs7Ozs7S0FFRjtJQUNEOztPQUVHO0lBQ1UsaUJBQUcsR0FBaEI7Ozs7OzRCQUNDLHFCQUFNLElBQUksQ0FBQyxPQUFPLEVBQUU7d0JBQ3BCLDBDQUEwQztzQkFEdEI7O3dCQUFwQixTQUFvQixDQUFBO3dCQUNwQiwwQ0FBMEM7d0JBQzFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFOzRCQUN4QixJQUFJLENBQUMsT0FBTztpQ0FDVixPQUFPLENBQUMsZ0JBQWdCLENBQUM7aUNBQ3pCLE1BQU0sQ0FBQyxVQUFDLENBQVMsRUFBRSxPQUFZO2dDQUMvQixLQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQTs0QkFDdkIsQ0FBQyxDQUFDLENBQUE7eUJBQ0g7d0JBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO3dCQUVoQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFOzRCQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFBO3lCQUN6Qjs7Ozs7S0FDRDtJQUNGLFVBQUM7QUFBRCxDQUFDLEFBeExELElBd0xDO0FBeExZLGtCQUFHO0FBMExoQixrQkFBZSxJQUFJLEdBQUcsRUFBRSxDQUFBIn0=
\No newline at end of file