1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var tslib_1 = require("tslib");
|
4 | var glob = require("fast-glob");
|
5 | var fs = require("fs");
|
6 | var jgb_plugin_babel_1 = require("jgb-plugin-babel");
|
7 | var jgb_plugin_css_1 = require("jgb-plugin-css");
|
8 | var jgb_plugin_html_1 = require("jgb-plugin-html");
|
9 | var jgb_plugin_json_1 = require("jgb-plugin-json");
|
10 | var lib_1 = require("jgb-shared/lib");
|
11 | var utils_1 = require("jgb-shared/lib/utils");
|
12 | var Path = require("path");
|
13 | var EXT_REGEX = /\.(\w)+$/;
|
14 | exports.default = lib_1.declare(function (compiler, pluginConfig) {
|
15 | if (pluginConfig === void 0) { pluginConfig = {}; }
|
16 | attachCompilerEvent(compiler);
|
17 | jgb_plugin_babel_1.default(compiler, {});
|
18 | jgb_plugin_json_1.default(compiler, {});
|
19 | jgb_plugin_html_1.default(compiler, {
|
20 | extensions: ['.axml'],
|
21 | outExt: '.axml'
|
22 | });
|
23 | jgb_plugin_css_1.default(compiler, {
|
24 | extensions: ['.acss'],
|
25 | outExt: '.acss'
|
26 | });
|
27 | });
|
28 | function attachCompilerEvent(compiler) {
|
29 | compiler.on('collect-app-json', collectAppJson);
|
30 | compiler.on('collect-page-json', collectPageJson);
|
31 | }
|
32 | function collectPageJson(_a) {
|
33 | var dependences = _a.dependences, pageJson = _a.pageJson, ctx = _a.ctx;
|
34 | return tslib_1.__awaiter(this, void 0, void 0, function () {
|
35 | var extensions, supportExtensions, components, usingComponent, _b, _c, _d, key, value, componentPath, error_1, e_1_1, _e, _f, dep, e_2_1;
|
36 | var e_1, _g, e_2, _h;
|
37 | return tslib_1.__generator(this, function (_j) {
|
38 | switch (_j.label) {
|
39 | case 0:
|
40 | if (needTransformJson(ctx)) {
|
41 | pageJson = formatAsAliappPageJson(pageJson);
|
42 | ctx.contents = JSON.stringify(pageJson);
|
43 | ctx.ast = pageJson;
|
44 | }
|
45 | // 是否使用组件
|
46 | if (!pageJson.usingComponents ||
|
47 | typeof pageJson.usingComponents !== 'object') {
|
48 | return [2 /*return*/];
|
49 | }
|
50 | extensions = ctx.options.parser.extensions;
|
51 | supportExtensions = extensions.keys();
|
52 | components = [];
|
53 | usingComponent = usingNpmComponents.bind(ctx);
|
54 | _j.label = 1;
|
55 | case 1:
|
56 | _j.trys.push([1, 9, 10, 11]);
|
57 | _b = tslib_1.__values(Object.entries(pageJson.usingComponents)), _c = _b.next();
|
58 | _j.label = 2;
|
59 | case 2:
|
60 | if (!!_c.done) return [3 /*break*/, 8];
|
61 | _d = tslib_1.__read(_c.value, 2), key = _d[0], value = _d[1];
|
62 | return [4 /*yield*/, findComponent(value, ctx)];
|
63 | case 3:
|
64 | componentPath = _j.sent();
|
65 | _j.label = 4;
|
66 | case 4:
|
67 | _j.trys.push([4, 6, , 7]);
|
68 | return [4 /*yield*/, usingComponent(key, componentPath, pageJson, dependences, components)];
|
69 | case 5:
|
70 | _j.sent();
|
71 | return [3 /*break*/, 7];
|
72 | case 6:
|
73 | error_1 = _j.sent();
|
74 | return [3 /*break*/, 7];
|
75 | case 7:
|
76 | _c = _b.next();
|
77 | return [3 /*break*/, 2];
|
78 | case 8: return [3 /*break*/, 11];
|
79 | case 9:
|
80 | e_1_1 = _j.sent();
|
81 | e_1 = { error: e_1_1 };
|
82 | return [3 /*break*/, 11];
|
83 | case 10:
|
84 | try {
|
85 | if (_c && !_c.done && (_g = _b.return)) _g.call(_b);
|
86 | }
|
87 | finally { if (e_1) throw e_1.error; }
|
88 | return [7 /*endfinally*/];
|
89 | case 11:
|
90 | if (!(components.length > 0)) return [3 /*break*/, 19];
|
91 | _j.label = 12;
|
92 | case 12:
|
93 | _j.trys.push([12, 17, 18, 19]);
|
94 | return [4 /*yield*/, ctx.expandFiles(new Set(components), supportExtensions)];
|
95 | case 13:
|
96 | _e = tslib_1.__values.apply(void 0, [_j.sent()]), _f = _e.next();
|
97 | _j.label = 14;
|
98 | case 14:
|
99 | if (!!_f.done) return [3 /*break*/, 16];
|
100 | dep = _f.value;
|
101 | dependences.add(dep);
|
102 | _j.label = 15;
|
103 | case 15:
|
104 | _f = _e.next();
|
105 | return [3 /*break*/, 14];
|
106 | case 16: return [3 /*break*/, 19];
|
107 | case 17:
|
108 | e_2_1 = _j.sent();
|
109 | e_2 = { error: e_2_1 };
|
110 | return [3 /*break*/, 19];
|
111 | case 18:
|
112 | try {
|
113 | if (_f && !_f.done && (_h = _e.return)) _h.call(_e);
|
114 | }
|
115 | finally { if (e_2) throw e_2.error; }
|
116 | return [7 /*endfinally*/];
|
117 | case 19: return [2 /*return*/];
|
118 | }
|
119 | });
|
120 | });
|
121 | }
|
122 | /**
|
123 | * 找到组件路径,并返回相对编译后的路径
|
124 | * @param componentPath
|
125 | */
|
126 | function findComponent(componentPath, ctx) {
|
127 | return tslib_1.__awaiter(this, void 0, void 0, function () {
|
128 | var realPath, error_2, module, pkg, _a, realComponentPath;
|
129 | return tslib_1.__generator(this, function (_b) {
|
130 | switch (_b.label) {
|
131 | case 0:
|
132 | _b.trys.push([0, 2, , 3]);
|
133 | return [4 /*yield*/, ctx.resolver.loadResolveAlias(componentPath)];
|
134 | case 1:
|
135 | realPath = _b.sent();
|
136 | if (realPath) {
|
137 | componentPath = realPath;
|
138 | }
|
139 | return [3 /*break*/, 3];
|
140 | case 2:
|
141 | error_2 = _b.sent();
|
142 | return [3 /*break*/, 3];
|
143 | case 3:
|
144 | if (componentPath.startsWith('.') || componentPath.startsWith('/')) {
|
145 | return [2 /*return*/, componentPath];
|
146 | }
|
147 | return [4 /*yield*/, ctx.resolver.resolveModule(componentPath, null)];
|
148 | case 4:
|
149 | module = _b.sent();
|
150 | if (!module) {
|
151 | return [2 /*return*/, componentPath];
|
152 | }
|
153 | if (!('moduleDir' in module && module.moduleDir)) return [3 /*break*/, 6];
|
154 | return [4 /*yield*/, ctx.resolver.findPackage(module.moduleDir)];
|
155 | case 5:
|
156 | _a = _b.sent();
|
157 | return [3 /*break*/, 7];
|
158 | case 6:
|
159 | _a = {};
|
160 | _b.label = 7;
|
161 | case 7:
|
162 | pkg = _a;
|
163 | if (module.filePath &&
|
164 | (fs.existsSync(module.filePath) || fs.existsSync(module.filePath + '.json'))) {
|
165 | return [2 /*return*/, module.filePath];
|
166 | }
|
167 | // 根据pkg.miniprogram查找
|
168 | if (pkg.miniprogram) {
|
169 | realComponentPath = Path.join(module.moduleDir, pkg.miniprogram, module.subPath);
|
170 | if (fs.existsSync(realComponentPath + '.json')) {
|
171 | return [2 /*return*/, realComponentPath];
|
172 | }
|
173 | }
|
174 | return [2 /*return*/];
|
175 | }
|
176 | });
|
177 | });
|
178 | }
|
179 | exports.findComponent = findComponent;
|
180 | function usingNpmComponents(key, value, pageJson, dependences, components) {
|
181 | return tslib_1.__awaiter(this, void 0, void 0, function () {
|
182 | var _a, distPath, relativeRequirePath, realName, absolutePath, relativeRequire, componentPath, pkgJson, pkg, dir, npmProjectDir_1, allMatches;
|
183 | return tslib_1.__generator(this, function (_b) {
|
184 | switch (_b.label) {
|
185 | case 0: return [4 /*yield*/, this.resolveAliasName(value)];
|
186 | case 1:
|
187 | _a = _b.sent(), distPath = _a.distPath, relativeRequirePath = _a.relativeRequirePath, realName = _a.realName, absolutePath = _a.absolutePath;
|
188 | if (!(distPath && relativeRequirePath)) return [3 /*break*/, 5];
|
189 | relativeRequire = relativeRequirePath.replace(EXT_REGEX, '');
|
190 | pageJson.usingComponents[key] = relativeRequire;
|
191 | if (realName) {
|
192 | componentPath = utils_1.pathToUnixType(absolutePath.replace(EXT_REGEX, ''));
|
193 | components.push(componentPath);
|
194 | }
|
195 | if (!absolutePath.includes('node_modules')) return [3 /*break*/, 5];
|
196 | return [4 /*yield*/, findPackage(this, Path.dirname(absolutePath))];
|
197 | case 2:
|
198 | pkgJson = _b.sent();
|
199 | if (!pkgJson) {
|
200 | return [2 /*return*/];
|
201 | }
|
202 | pkg = pkgJson.pkg, dir = pkgJson.dir;
|
203 | if (!pkg.miniprogram) return [3 /*break*/, 4];
|
204 | npmProjectDir_1 = Path.join(dir, pkg.miniprogram);
|
205 | return [4 /*yield*/, glob.async(['**/**'], {
|
206 | cwd: npmProjectDir_1
|
207 | })];
|
208 | case 3:
|
209 | allMatches = _b.sent();
|
210 | if (allMatches) {
|
211 | allMatches.forEach(function (file) {
|
212 | dependences.add(Path.join(npmProjectDir_1, file));
|
213 | });
|
214 | return [2 /*return*/, true];
|
215 | }
|
216 | return [3 /*break*/, 5];
|
217 | case 4:
|
218 | // only resolve
|
219 | components.push(absolutePath.replace(EXT_REGEX, ''));
|
220 | return [2 /*return*/, true];
|
221 | case 5: return [2 /*return*/];
|
222 | }
|
223 | });
|
224 | });
|
225 | }
|
226 | exports.usingNpmComponents = usingNpmComponents;
|
227 | function findPackage(ctx, dir) {
|
228 | return tslib_1.__awaiter(this, void 0, void 0, function () {
|
229 | var pkg, err_1;
|
230 | return tslib_1.__generator(this, function (_a) {
|
231 | switch (_a.label) {
|
232 | case 0:
|
233 | _a.trys.push([0, 2, , 3]);
|
234 | return [4 /*yield*/, ctx.resolver.findPackage(dir)];
|
235 | case 1:
|
236 | pkg = _a.sent();
|
237 | return [2 /*return*/, {
|
238 | pkg: pkg,
|
239 | dir: pkg.pkgdir
|
240 | }];
|
241 | case 2:
|
242 | err_1 = _a.sent();
|
243 | return [3 /*break*/, 3];
|
244 | case 3: return [2 /*return*/];
|
245 | }
|
246 | });
|
247 | });
|
248 | }
|
249 | function collectAppJson(_a) {
|
250 | var dependences = _a.dependences, appJson = _a.appJson, ctx = _a.ctx;
|
251 | return tslib_1.__awaiter(this, void 0, void 0, function () {
|
252 | var extensions, supportExtensions, assetPaths, _b, _c, dep, e_3_1;
|
253 | var e_3, _d;
|
254 | return tslib_1.__generator(this, function (_e) {
|
255 | switch (_e.label) {
|
256 | case 0:
|
257 | if (needTransformJson(ctx)) {
|
258 | appJson = formatAsAliappJson(appJson);
|
259 | ctx.contents = JSON.stringify(appJson);
|
260 | ctx.ast = appJson;
|
261 | }
|
262 | extensions = ctx.options.parser.extensions;
|
263 | supportExtensions = extensions.keys();
|
264 | assetPaths = [];
|
265 | // pages asset
|
266 | if (Array.isArray(appJson.pages)) {
|
267 | assetPaths.push.apply(assetPaths, tslib_1.__spread(appJson.pages));
|
268 | }
|
269 | if (!Array.isArray(assetPaths)) return [3 /*break*/, 8];
|
270 | _e.label = 1;
|
271 | case 1:
|
272 | _e.trys.push([1, 6, 7, 8]);
|
273 | return [4 /*yield*/, ctx.expandFiles(new Set(assetPaths), supportExtensions)];
|
274 | case 2:
|
275 | _b = tslib_1.__values.apply(void 0, [_e.sent()]), _c = _b.next();
|
276 | _e.label = 3;
|
277 | case 3:
|
278 | if (!!_c.done) return [3 /*break*/, 5];
|
279 | dep = _c.value;
|
280 | dependences.add(dep);
|
281 | _e.label = 4;
|
282 | case 4:
|
283 | _c = _b.next();
|
284 | return [3 /*break*/, 3];
|
285 | case 5: return [3 /*break*/, 8];
|
286 | case 6:
|
287 | e_3_1 = _e.sent();
|
288 | e_3 = { error: e_3_1 };
|
289 | return [3 /*break*/, 8];
|
290 | case 7:
|
291 | try {
|
292 | if (_c && !_c.done && (_d = _b.return)) _d.call(_b);
|
293 | }
|
294 | finally { if (e_3) throw e_3.error; }
|
295 | return [7 /*endfinally*/];
|
296 | case 8:
|
297 | // tabBar asset
|
298 | if (appJson.tabBar && Array.isArray(appJson.tabBar.items)) {
|
299 | appJson.tabBar.items.forEach(function (config) {
|
300 | // tslint:disable-next-line:no-unused-expression
|
301 | config.icon && dependences.add(config.icon);
|
302 | // tslint:disable-next-line:no-unused-expression
|
303 | config.activeIcon && dependences.add(config.activeIcon);
|
304 | });
|
305 | }
|
306 | return [2 /*return*/];
|
307 | }
|
308 | });
|
309 | });
|
310 | }
|
311 | var windowNameMapping = {
|
312 | navigationBarTitleText: 'defaultTitle',
|
313 | enablePullDownRefresh: 'pullRefresh',
|
314 | navigationBarBackgroundColor: 'titleBarColor',
|
315 | component: 'component',
|
316 | usingComponents: 'usingComponents'
|
317 | };
|
318 | /** aliapp中page.json生效的关键字 */
|
319 | var PageEnableKey = [
|
320 | 'defaultTitle',
|
321 | 'pullRefresh',
|
322 | 'allowsBounceVertical',
|
323 | 'titleBarColor',
|
324 | 'component',
|
325 | 'usingComponents'
|
326 | ];
|
327 | /** aliapp中 app.json中 tabBar生效的关键字 */
|
328 | var TabBarEnableKey = [
|
329 | 'textColor',
|
330 | 'selectedColor',
|
331 | 'backgroundColor',
|
332 | 'items'
|
333 | ];
|
334 | var TabBarItemEnableKey = ['pagePath', 'name', 'icon', 'activeIcon'];
|
335 | var tabBarNameMapping = {
|
336 | color: 'textColor',
|
337 | selectedColor: 'selectedColor',
|
338 | backgroundColor: 'backgroundColor',
|
339 | list: 'items'
|
340 | };
|
341 | var tabBarItemNameMapping = {
|
342 | pagePath: 'pagePath',
|
343 | text: 'name',
|
344 | iconPath: 'icon',
|
345 | selectedIconPath: 'activeIcon'
|
346 | };
|
347 | /** 是否需要转换json */
|
348 | function needTransformJson(ctx) {
|
349 | return ctx.options.target !== ctx.options.source;
|
350 | }
|
351 | /**
|
352 | * 微信page|component.json转支付宝微信page|component.json
|
353 | * @param json
|
354 | */
|
355 | function formatAsAliappPageJson(json) {
|
356 | var windowJson = {};
|
357 | Object.keys(json).forEach(function (key) {
|
358 | // 当遇到支付宝小程序中page.json关键字时直接赋值
|
359 | if (PageEnableKey.includes(key)) {
|
360 | windowJson[key] = json[key];
|
361 | return;
|
362 | }
|
363 | var value = windowNameMapping[key];
|
364 | if (value) {
|
365 | windowJson[value] = json[key];
|
366 | }
|
367 | });
|
368 | return windowJson;
|
369 | }
|
370 | exports.formatAsAliappPageJson = formatAsAliappPageJson;
|
371 | /**
|
372 | * 微信app.json转支付宝app.json
|
373 | * @param json
|
374 | */
|
375 | function formatAsAliappJson(json) {
|
376 | var _a;
|
377 | var aliappJson = {};
|
378 | aliappJson.pages = json.pages;
|
379 | aliappJson.window = {};
|
380 | aliappJson.tabBar = {};
|
381 | if (json.subPackages && json.subPackages.length) {
|
382 | var allSubPages_1 = [];
|
383 | json.subPackages.forEach(function (sub) {
|
384 | var pages = sub.pages.map(function (page) {
|
385 | return utils_1.pathToUnixType(Path.join(sub.root, page));
|
386 | });
|
387 | allSubPages_1.push.apply(allSubPages_1, tslib_1.__spread(pages));
|
388 | });
|
389 | (_a = aliappJson.pages).push.apply(_a, tslib_1.__spread(allSubPages_1));
|
390 | }
|
391 | if (json.window) {
|
392 | var windowJSON = formatAsAliappPageJson(json.window);
|
393 | aliappJson.window = windowJSON;
|
394 | }
|
395 | if (json.tabBar) {
|
396 | var tabBar = formatAsAliappTabBarJson(json.tabBar);
|
397 | aliappJson.tabBar = tabBar;
|
398 | }
|
399 | return aliappJson;
|
400 | }
|
401 | exports.formatAsAliappJson = formatAsAliappJson;
|
402 | function formatAsAliappTabBarJson(tabBar) {
|
403 | var returnValue = {};
|
404 | Object.keys(tabBar).forEach(function (key) {
|
405 | if (TabBarEnableKey.includes(key)) {
|
406 | returnValue[key] = tabBar[key];
|
407 | return;
|
408 | }
|
409 | var value = tabBarNameMapping[key];
|
410 | if (value) {
|
411 | if (key === 'list') {
|
412 | returnValue[value] = formatAsAliappTabBarItemsJson(tabBar[key]);
|
413 | return;
|
414 | }
|
415 | returnValue[value] = tabBar[key];
|
416 | }
|
417 | });
|
418 | return returnValue;
|
419 | }
|
420 | exports.formatAsAliappTabBarJson = formatAsAliappTabBarJson;
|
421 | function formatAsAliappTabBarItemsJson(json) {
|
422 | return json.map(function (item) {
|
423 | var innerItem = {};
|
424 | Object.keys(item).forEach(function (itemKey) {
|
425 | if (TabBarItemEnableKey.includes(itemKey)) {
|
426 | innerItem[itemKey] = item[itemKey];
|
427 | return;
|
428 | }
|
429 | var replacedItemKey = tabBarItemNameMapping[itemKey];
|
430 | if (replacedItemKey) {
|
431 | innerItem[replacedItemKey] = item[itemKey];
|
432 | }
|
433 | });
|
434 | return innerItem;
|
435 | });
|
436 | }
|
437 | exports.formatAsAliappTabBarItemsJson = formatAsAliappTabBarItemsJson;
|
438 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0NBQWtDO0FBQ2xDLHVCQUF5QjtBQUN6QixxREFBMkM7QUFDM0MsaURBQXVDO0FBQ3ZDLG1EQUF5QztBQUN6QyxtREFBeUM7QUFFekMsc0NBQXVEO0FBRXZELDhDQUFzRDtBQUN0RCwyQkFBNkI7QUFtRjdCLElBQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUU3QixrQkFBZSxhQUFPLENBQUMsVUFBQyxRQUFRLEVBQUUsWUFBZ0M7SUFBaEMsNkJBQUEsRUFBQSxpQkFBZ0M7SUFDaEUsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFOUIsMEJBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUIseUJBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekIseUJBQVUsQ0FBQyxRQUFRLEVBQUU7UUFDbkIsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ3JCLE1BQU0sRUFBRSxPQUFPO0tBQ2hCLENBQUMsQ0FBQztJQUVILHdCQUFTLENBQUMsUUFBUSxFQUFFO1FBQ2xCLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQztRQUNyQixNQUFNLEVBQUUsT0FBTztLQUNoQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsbUJBQW1CLENBQUMsUUFBbUI7SUFDOUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNoRCxRQUFRLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFlLGVBQWUsQ0FBQyxFQVE5QjtRQVBDLDRCQUFXLEVBQ1gsc0JBQVEsRUFDUixZQUFHOzs7Ozs7O29CQU1ILElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQzFCLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxRQUFlLENBQUMsQ0FBQzt3QkFDbkQsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUN4QyxHQUFHLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQztxQkFDcEI7b0JBRUQsU0FBUztvQkFDVCxJQUNFLENBQUMsUUFBUSxDQUFDLGVBQWU7d0JBQ3pCLE9BQU8sUUFBUSxDQUFDLGVBQWUsS0FBSyxRQUFRLEVBQzVDO3dCQUNBLHNCQUFPO3FCQUNSO29CQUNLLFVBQVUsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUE4QixDQUFDO29CQUMvRCxpQkFBaUIsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3RDLFVBQVUsR0FBYSxFQUFFLENBQUM7b0JBRTFCLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Ozs7b0JBRXpCLEtBQUEsaUJBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUE7Ozs7b0JBQXhELEtBQUEsMkJBQVksRUFBWCxHQUFHLFFBQUEsRUFBRSxLQUFLLFFBQUE7b0JBQ0UscUJBQU0sYUFBYSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBQTs7b0JBQS9DLGFBQWEsR0FBRyxTQUErQjs7OztvQkFFbkQscUJBQU0sY0FBYyxDQUNsQixHQUFHLEVBQ0gsYUFBYSxFQUNiLFFBQVEsRUFDUixXQUFXLEVBQ1gsVUFBVSxDQUNYLEVBQUE7O29CQU5ELFNBTUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7eUJBS0YsQ0FBQSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQSxFQUFyQix5QkFBcUI7Ozs7b0JBQ0wscUJBQU0sR0FBRyxDQUFDLFdBQVcsQ0FDckMsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQ25CLGlCQUFpQixDQUNsQixFQUFBOztvQkFIaUIsS0FBQSxnQ0FBQSxTQUdqQixFQUFBOzs7O29CQUhVLEdBQUc7b0JBSVosV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FHMUI7QUFFRDs7O0dBR0c7QUFDSCxTQUFzQixhQUFhLENBQUMsYUFBcUIsRUFBRSxHQUFjOzs7Ozs7O29CQUdwRCxxQkFBTSxHQUFHLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxFQUFBOztvQkFBN0QsUUFBUSxHQUFHLFNBQWtEO29CQUNuRSxJQUFJLFFBQVEsRUFBRTt3QkFDWixhQUFhLEdBQUcsUUFBUSxDQUFDO3FCQUMxQjs7Ozs7O29CQUdILElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUNsRSxzQkFBTyxhQUFhLEVBQUM7cUJBQ3RCO29CQUVjLHFCQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsRUFBQTs7b0JBQTlELE1BQU0sR0FBRyxTQUFxRDtvQkFDcEUsSUFBSSxDQUFDLE1BQU0sRUFBRTt3QkFDWCxzQkFBTyxhQUFhLEVBQUM7cUJBQ3RCO3lCQUdDLENBQUEsV0FBVyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFBLEVBQXpDLHdCQUF5QztvQkFDckMscUJBQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFBOztvQkFBaEQsS0FBQSxTQUFnRCxDQUFBOzs7b0JBQ2hELEtBQUEsRUFBRSxDQUFBOzs7b0JBSEYsR0FBRyxLQUdEO29CQUVSLElBQ0UsTUFBTSxDQUFDLFFBQVE7d0JBQ2YsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFDNUU7d0JBQ0Esc0JBQU8sTUFBTSxDQUFDLFFBQVEsRUFBQztxQkFDeEI7b0JBRUQsc0JBQXNCO29CQUN0QixJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUU7d0JBQ2IsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDakMsTUFBTSxDQUFDLFNBQVMsRUFDaEIsR0FBRyxDQUFDLFdBQVcsRUFDZixNQUFNLENBQUMsT0FBTyxDQUNmLENBQUM7d0JBRUYsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxFQUFFOzRCQUM5QyxzQkFBTyxpQkFBaUIsRUFBQzt5QkFDMUI7cUJBQ0Y7Ozs7O0NBQ0Y7QUExQ0Qsc0NBMENDO0FBRUQsU0FBc0Isa0JBQWtCLENBRXRDLEdBQVcsRUFDWCxLQUFhLEVBQ2IsUUFBbUIsRUFDbkIsV0FBd0IsRUFDeEIsVUFBb0I7Ozs7O3dCQWlCaEIscUJBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFBOztvQkFMaEMsS0FLRixTQUFrQyxFQUpwQyxRQUFRLGNBQUEsRUFDUixtQkFBbUIseUJBQUEsRUFDbkIsUUFBUSxjQUFBLEVBQ1IsWUFBWSxrQkFBQTt5QkFHVixDQUFBLFFBQVEsSUFBSSxtQkFBbUIsQ0FBQSxFQUEvQix3QkFBK0I7b0JBQzNCLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNuRSxRQUFRLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQztvQkFDaEQsSUFBSSxRQUFRLEVBQUU7d0JBRU4sYUFBYSxHQUFHLHNCQUFjLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDMUUsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztxQkFDaEM7eUJBRUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBckMsd0JBQXFDO29CQUV2QixxQkFBTSxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBQTs7b0JBQTdELE9BQU8sR0FBRyxTQUFtRDtvQkFDbkUsSUFBSSxDQUFDLE9BQU8sRUFBRTt3QkFDWixzQkFBTztxQkFDUjtvQkFDTyxHQUFHLEdBQVUsT0FBTyxJQUFqQixFQUFFLEdBQUcsR0FBSyxPQUFPLElBQVosQ0FBYTt5QkFFekIsR0FBRyxDQUFDLFdBQVcsRUFBZix3QkFBZTtvQkFDWCxrQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUVuQyxxQkFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUU7NEJBQzdDLEdBQUcsRUFBRSxlQUFhO3lCQUNuQixDQUFDLEVBQUE7O29CQUZJLFVBQVUsR0FBRyxTQUVqQjtvQkFDRixJQUFJLFVBQVUsRUFBRTt3QkFDZCxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQUMsSUFBWTs0QkFDOUIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNsRCxDQUFDLENBQUMsQ0FBQzt3QkFDSCxzQkFBTyxJQUFJLEVBQUM7cUJBQ2I7OztvQkFFRCxlQUFlO29CQUNmLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDckQsc0JBQU8sSUFBSSxFQUFDOzs7OztDQUluQjtBQTdERCxnREE2REM7QUFFRCxTQUFlLFdBQVcsQ0FBQyxHQUFjLEVBQUUsR0FBVzs7Ozs7OztvQkFHdEMscUJBQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUE7O29CQUF6QyxHQUFHLEdBQUcsU0FBbUM7b0JBQy9DLHNCQUFPOzRCQUNMLEdBQUcsS0FBQTs0QkFDSCxHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU07eUJBQ2hCLEVBQUM7Ozs7Ozs7O0NBSUw7QUFFRCxTQUFlLGNBQWMsQ0FBQyxFQVE3QjtRQVBDLDRCQUFXLEVBQ1gsb0JBQU8sRUFDUCxZQUFHOzs7Ozs7O29CQU1ILElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQzFCLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxPQUFjLENBQUMsQ0FBQzt3QkFDN0MsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUN2QyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQztxQkFDbkI7b0JBRUssVUFBVSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQThCLENBQUM7b0JBQy9ELGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDdEMsVUFBVSxHQUFhLEVBQUUsQ0FBQztvQkFFaEMsY0FBYztvQkFDZCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUNoQyxVQUFVLENBQUMsSUFBSSxPQUFmLFVBQVUsbUJBQVMsT0FBTyxDQUFDLEtBQUssR0FBRTtxQkFDbkM7eUJBR0csS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBekIsd0JBQXlCOzs7O29CQUNULHFCQUFNLEdBQUcsQ0FBQyxXQUFXLENBQ3JDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUNuQixpQkFBaUIsQ0FDbEIsRUFBQTs7b0JBSGlCLEtBQUEsZ0NBQUEsU0FHakIsRUFBQTs7OztvQkFIVSxHQUFHO29CQUlaLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUl6QixlQUFlO29CQUNmLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ3pELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFBLE1BQU07NEJBQ2pDLGdEQUFnRDs0QkFDaEQsTUFBTSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDNUMsZ0RBQWdEOzRCQUNoRCxNQUFNLENBQUMsVUFBVSxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUMxRCxDQUFDLENBQUMsQ0FBQztxQkFDSjs7Ozs7Q0FDRjtBQVVELElBQU0saUJBQWlCLEdBQTRDO0lBQ2pFLHNCQUFzQixFQUFFLGNBQWM7SUFDdEMscUJBQXFCLEVBQUUsYUFBYTtJQUNwQyw0QkFBNEIsRUFBRSxlQUFlO0lBQzdDLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLGVBQWUsRUFBRSxpQkFBaUI7Q0FDbkMsQ0FBQztBQUVGLDZCQUE2QjtBQUU3QixJQUFNLGFBQWEsR0FBRztJQUNwQixjQUFjO0lBQ2QsYUFBYTtJQUNiLHNCQUFzQjtJQUN0QixlQUFlO0lBQ2YsV0FBVztJQUNYLGlCQUFpQjtDQUNsQixDQUFDO0FBRUYscUNBQXFDO0FBQ3JDLElBQU0sZUFBZSxHQUFHO0lBQ3RCLFdBQVc7SUFDWCxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLE9BQU87Q0FDUixDQUFDO0FBRUYsSUFBTSxtQkFBbUIsR0FBRyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBRXZFLElBQU0saUJBQWlCLEdBQTBDO0lBQy9ELEtBQUssRUFBRSxXQUFXO0lBQ2xCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsSUFBSSxFQUFFLE9BQU87Q0FDZCxDQUFDO0FBRUYsSUFBTSxxQkFBcUIsR0FBOEM7SUFDdkUsUUFBUSxFQUFFLFVBQVU7SUFDcEIsSUFBSSxFQUFFLE1BQU07SUFDWixRQUFRLEVBQUUsTUFBTTtJQUNoQixnQkFBZ0IsRUFBRSxZQUFZO0NBQy9CLENBQUM7QUFFRixpQkFBaUI7QUFDakIsU0FBUyxpQkFBaUIsQ0FBQyxHQUFjO0lBQ3ZDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDbkQsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLElBQVM7SUFDOUMsSUFBTSxVQUFVLEdBQUcsRUFBUyxDQUFDO0lBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsR0FBb0I7UUFDN0MsOEJBQThCO1FBQzlCLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUE0QixDQUFDLEVBQUU7WUFDeEQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QixPQUFPO1NBQ1I7UUFDRCxJQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQWdDLENBQUM7UUFDcEUsSUFBSSxLQUFLLEVBQUU7WUFDVCxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBZEQsd0RBY0M7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxJQUFTOztJQUMxQyxJQUFNLFVBQVUsR0FBZ0IsRUFBRSxDQUFDO0lBRW5DLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUM5QixVQUFVLENBQUMsTUFBTSxHQUFHLEVBQVMsQ0FBQztJQUM5QixVQUFVLENBQUMsTUFBTSxHQUFHLEVBQVMsQ0FBQztJQUM5QixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7UUFDL0MsSUFBTSxhQUFXLEdBQWEsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQUMsR0FBUTtZQUNoQyxJQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFDLElBQVk7Z0JBQ3ZDLE9BQUEsc0JBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFBekMsQ0FBeUMsQ0FDMUMsQ0FBQztZQUNGLGFBQVcsQ0FBQyxJQUFJLE9BQWhCLGFBQVcsbUJBQVMsS0FBSyxHQUFFO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsQ0FBQSxLQUFBLFVBQVUsQ0FBQyxLQUFLLENBQUEsQ0FBQyxJQUFJLDRCQUFJLGFBQVcsR0FBRTtLQUN2QztJQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNmLElBQU0sVUFBVSxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RCxVQUFVLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztLQUNoQztJQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNmLElBQU0sTUFBTSxHQUFHLHdCQUF3QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxVQUFVLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztLQUM1QjtJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUEzQkQsZ0RBMkJDO0FBRUQsU0FBZ0Isd0JBQXdCLENBQUMsTUFBVztJQUNsRCxJQUFNLFdBQVcsR0FBRyxFQUFTLENBQUM7SUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxHQUFvQjtRQUMvQyxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDakMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixPQUFPO1NBQ1I7UUFDRCxJQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQXdCLENBQUM7UUFDNUQsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLEdBQUcsS0FBSyxNQUFNLEVBQUU7Z0JBQ2xCLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDaEUsT0FBTzthQUNSO1lBQ0QsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQWxCRCw0REFrQkM7QUFFRCxTQUFnQiw2QkFBNkIsQ0FBQyxJQUFXO0lBQ3ZELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFBLElBQUk7UUFDbEIsSUFBTSxTQUFTLEdBQStCLEVBQUUsQ0FBQztRQUNqRCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFDLE9BQTRCO1lBQ3JELElBQUksbUJBQW1CLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN6QyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBUSxDQUFDO2dCQUMxQyxPQUFPO2FBQ1I7WUFDRCxJQUFNLGVBQWUsR0FBRyxxQkFBcUIsQ0FDM0MsT0FBTyxDQUM0QixDQUFDO1lBQ3RDLElBQUksZUFBZSxFQUFFO2dCQUNuQixTQUFTLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzVDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFqQkQsc0VBaUJDIn0= |
\ | No newline at end of file |