presetter 3.1.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/preset.js CHANGED
@@ -1,325 +1,191 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
5
17
  });
6
- exports.assertPresetterRC = assertPresetterRC;
7
- exports.bootstrapContent = bootstrapContent;
8
- exports.bootstrapPreset = bootstrapPreset;
9
- exports.getContext = getContext;
10
- exports.getDestinationMap = getDestinationMap;
11
- exports.getPresetAssets = getPresetAssets;
12
- exports.getPresetterRC = getPresetterRC;
13
- exports.getScripts = getScripts;
14
- exports.setupPreset = setupPreset;
15
- exports.unsetPreset = unsetPreset;
16
- exports.updatePresetterRC = updatePresetterRC;
17
-
18
- var _console = require("console");
19
-
20
- var _fsExtra = require("fs-extra");
21
-
22
- var _lodash = require("lodash");
23
-
24
- var _path = require("path");
25
-
26
- var _readPkg = _interopRequireDefault(require("read-pkg"));
27
-
28
- var _resolvePkg = _interopRequireDefault(require("resolve-pkg"));
29
-
30
- var _writePkg = _interopRequireDefault(require("write-pkg"));
31
-
32
- var _content = require("./content");
33
-
34
- var _io = require("./io");
35
-
36
- var _package = require("./package");
37
-
38
- var _template = require("./template");
39
-
40
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
41
-
42
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
43
-
44
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
45
-
46
- /** presetter configuration filename */
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.getDestinationMap = exports.getContext = exports.unsetPreset = exports.bootstrapContent = exports.bootstrapPreset = exports.setupPreset = exports.getScripts = exports.getPresetAssets = exports.assertPresetterRC = exports.updatePresetterRC = exports.getPresetterRC = void 0;
30
+ const console_1 = require("console");
31
+ const fs_extra_1 = require("fs-extra");
32
+ const lodash_1 = require("lodash");
33
+ const path_1 = require("path");
34
+ const read_pkg_1 = __importDefault(require("read-pkg"));
35
+ const resolve_pkg_1 = __importDefault(require("resolve-pkg"));
36
+ const write_pkg_1 = __importDefault(require("write-pkg"));
37
+ const content_1 = require("./content");
38
+ const io_1 = require("./io");
39
+ const package_1 = require("./package");
40
+ const template_1 = require("./template");
47
41
  const PRESETTERRC = '.presetterrc';
48
42
  const JSON_INDENT = 2;
49
- /**
50
- * get the .presetterrc configuration file content
51
- * @param root the base directory in which the configuration file should be located
52
- * @returns content of the configuration file
53
- */
54
-
55
43
  async function getPresetterRC(root) {
56
- const potentialConfigFiles = ['', '.json'].map(ext => (0, _path.resolve)(root, `${PRESETTERRC}${ext}`));
57
-
58
- for (const path of potentialConfigFiles) {
59
- if (await (0, _fsExtra.pathExists)(path)) {
60
- // return the first customisation file found
61
- const custom = await (0, _io.loadFile)(path, 'json');
62
- assertPresetterRC(custom);
63
- return custom;
44
+ const potentialConfigFiles = ['', '.json'].map((ext) => (0, path_1.resolve)(root, `${PRESETTERRC}${ext}`));
45
+ for (const path of potentialConfigFiles) {
46
+ if (await (0, fs_extra_1.pathExists)(path)) {
47
+ const custom = await (0, io_1.loadFile)(path, 'json');
48
+ assertPresetterRC(custom);
49
+ return custom;
50
+ }
64
51
  }
65
- }
66
-
67
- throw new Error('Missing preset defined in .presetterrc');
52
+ throw new Error('Missing preset defined in .presetterrc');
68
53
  }
69
- /**
70
- * update .presetterrc configuration file content
71
- * @param root the base directory in which the configuration file should be located
72
- * @param config content to be merged with the existing configuration file
73
- */
74
-
75
-
54
+ exports.getPresetterRC = getPresetterRC;
76
55
  async function updatePresetterRC(root, config) {
77
- const existingPresetterRC = await getPresetterRC(root).catch(() => ({}));
78
- await (0, _fsExtra.writeJSON)((0, _path.resolve)(root, `${PRESETTERRC}.json`), (0, _template.merge)(existingPresetterRC, config), {
79
- spaces: JSON_INDENT
80
- });
56
+ const existingPresetterRC = await getPresetterRC(root).catch(() => ({}));
57
+ await (0, fs_extra_1.writeJSON)((0, path_1.resolve)(root, `${PRESETTERRC}.json`), (0, template_1.merge)(existingPresetterRC, config), { spaces: JSON_INDENT });
81
58
  }
82
- /**
83
- * check that the configuration is valid
84
- * @param value content from a configuration file
85
- */
86
-
87
-
59
+ exports.updatePresetterRC = updatePresetterRC;
88
60
  function assertPresetterRC(value) {
89
- if (!(0, _template.isJSON)(value) || typeof value['preset'] !== 'string' && !Array.isArray(value['preset'])) {
90
- throw new Error(`invalid presetter configuration file`);
91
- }
61
+ if (!(0, template_1.isJSON)(value) ||
62
+ (typeof value['preset'] !== 'string' && !Array.isArray(value['preset']))) {
63
+ throw new Error(`invalid presetter configuration file`);
64
+ }
92
65
  }
93
- /**
94
- * get the preset package name from package.json
95
- * @param context context about the target project and any customisation in .presetterrc
96
- * @returns name of the preset package
97
- */
98
-
99
-
66
+ exports.assertPresetterRC = assertPresetterRC;
100
67
  async function getPresetAssets(context) {
101
- // get the preset name
102
- const {
103
- preset
104
- } = context.custom;
105
- const presets = Array.isArray(preset) ? preset : [preset];
106
- const assets = [];
107
-
108
- for (const preset of presets) {
109
- try {
110
- var _asset$extends$map, _asset$extends;
111
-
112
- // get the preset
113
- const module = (0, _resolvePkg.default)(preset, {
114
- cwd: context.target.root
115
- });
116
- const {
117
- default: presetPresetAsset
118
- } = await Promise.resolve(`${module}`).then(s => _interopRequireWildcard(require(s)));
119
- const asset = await presetPresetAsset(context); // add extended assets first
120
-
121
- const extensions = (_asset$extends$map = (_asset$extends = asset.extends) === null || _asset$extends === void 0 ? void 0 : _asset$extends.map(async extension => getPresetAssets({ ...context,
122
- custom: { ...context.custom,
123
- preset: extension
68
+ var _a, _b;
69
+ const { preset } = context.custom;
70
+ const presets = Array.isArray(preset) ? preset : [preset];
71
+ const assets = [];
72
+ for (const preset of presets) {
73
+ try {
74
+ const module = (0, resolve_pkg_1.default)(preset, {
75
+ cwd: context.target.root,
76
+ });
77
+ const { default: presetPresetAsset } = (await Promise.resolve().then(() => __importStar(require(module))));
78
+ const asset = await presetPresetAsset(context);
79
+ const extensions = (_b = (_a = asset.extends) === null || _a === void 0 ? void 0 : _a.map(async (extension) => getPresetAssets(Object.assign(Object.assign({}, context), { custom: Object.assign(Object.assign({}, context.custom), { preset: extension }) })))) !== null && _b !== void 0 ? _b : [];
80
+ assets.push(...(await Promise.all(extensions)).flat());
81
+ assets.push(asset);
82
+ }
83
+ catch (_c) {
84
+ throw new Error(`cannot resolve preset ${preset}`);
124
85
  }
125
- }))) !== null && _asset$extends$map !== void 0 ? _asset$extends$map : [];
126
- assets.push(...(await Promise.all(extensions)).flat()); // then asset from this preset so that this preset can override the extended ones
127
-
128
- assets.push(asset);
129
- } catch {
130
- throw new Error(`cannot resolve preset ${preset}`);
131
86
  }
132
- }
133
-
134
- return assets;
87
+ return assets;
135
88
  }
136
- /**
137
- * merge all scripts templates
138
- * @param context context about the target project and any customisation in .presetterrc
139
- * @returns scripts template
140
- */
141
-
142
-
89
+ exports.getPresetAssets = getPresetAssets;
143
90
  async function getScripts(context) {
144
- const {
145
- custom
146
- } = context; // get assets from all configured presets
147
-
148
- const assets = await getPresetAssets(context); // compute the final variable to be used in the scripts template
149
-
150
- const variable = (0, _content.getVariable)(assets, context); // load templated scripts from presets
151
-
152
- const scripts = await Promise.all(assets.map(asset => asset.scripts).filter(path => typeof path === 'string').map(async path => await (0, _io.loadFile)(path, 'yaml'))); // merge all template scripts from presets
153
-
154
- const scriptsFromPreset = scripts.reduce((merged, scripts) => (0, _template.merge)(merged, scripts), {}); // merge customised scripts with the preset scripts
155
-
156
- const scriptsWithCustomConfig = (0, _template.merge)(scriptsFromPreset, custom.scripts); // replace the template variables
157
-
158
- return (0, _template.template)(scriptsWithCustomConfig, variable);
91
+ const { custom } = context;
92
+ const assets = await getPresetAssets(context);
93
+ const variable = (0, content_1.getVariable)(assets, context);
94
+ const scripts = await Promise.all([
95
+ ...assets.map(({ scripts }) => scripts),
96
+ ...assets.map(({ supplementaryScripts }) => supplementaryScripts),
97
+ ]
98
+ .filter((path) => typeof path === 'string')
99
+ .map(async (path) => (await (0, io_1.loadFile)(path, 'yaml'))));
100
+ const scriptsFromPreset = scripts.reduce((merged, scripts) => (0, template_1.merge)(merged, scripts), {});
101
+ const scriptsWithCustomConfig = (0, template_1.merge)(scriptsFromPreset, custom.scripts);
102
+ return (0, template_1.template)(scriptsWithCustomConfig, variable);
159
103
  }
160
- /**
161
- * adopt a preset to the project
162
- * @param uris list of name or git url of the preset
163
- */
164
-
165
-
104
+ exports.getScripts = getScripts;
166
105
  async function setupPreset(...uris) {
167
- // NOTE: comparing packages before and after installation is the only reliable way
168
- // to extract the name of the preset in case it's given as a git url or file path etc.
169
- const {
170
- path
171
- } = await (0, _package.getPackage)();
172
- const root = (0, _path.dirname)(path);
173
- const packageBefore = (await (0, _readPkg.default)({
174
- cwd: root
175
- })).devDependencies; // install presetter & the preset
176
-
177
- (0, _console.info)(`Installing ${uris.join(' ')}... it may take a few moment...`);
178
- await (0, _package.reifyDependencies)({
179
- root,
180
- add: ['presetter', ...uris],
181
- saveAs: 'dev',
182
- lockFile: true
183
- }); // extract the name of the installed preset
184
-
185
- const packageAfter = (await (0, _readPkg.default)({
186
- cwd: root
187
- })).devDependencies;
188
- const newPackages = getNewPackages({ ...packageBefore
189
- }, { ...packageAfter
190
- });
191
- const preset = newPackages.filter(name => name !== 'presetter');
192
- (0, _console.info)('Updating .presetterrc.json & package.json'); // update .presetterrc.json
193
-
194
- await updatePresetterRC(root, {
195
- preset
196
- }); // bootstrap configuration files with the new .presetterrc.json
197
-
198
- const context = await getContext();
199
- await bootstrapContent(context); // insert post install script if not preset
200
-
201
- await (0, _writePkg.default)(root, (0, _lodash.defaultsDeep)(context.target.package, {
202
- scripts: {
203
- prepare: 'presetter bootstrap'
204
- }
205
- }));
206
- (0, _console.info)('Done. Enjoy coding!');
106
+ const { path } = await (0, package_1.getPackage)();
107
+ const root = (0, path_1.dirname)(path);
108
+ const packageBefore = (await (0, read_pkg_1.default)({ cwd: root })).devDependencies;
109
+ (0, console_1.info)(`Installing ${uris.join(' ')}... it may take a few moment...`);
110
+ await (0, package_1.reifyDependencies)({
111
+ root,
112
+ add: ['presetter', ...uris],
113
+ saveAs: 'dev',
114
+ lockFile: true,
115
+ });
116
+ const packageAfter = (await (0, read_pkg_1.default)({ cwd: root })).devDependencies;
117
+ const newPackages = getNewPackages(Object.assign({}, packageBefore), Object.assign({}, packageAfter));
118
+ const preset = newPackages.filter((name) => name !== 'presetter');
119
+ (0, console_1.info)('Updating .presetterrc.json & package.json');
120
+ await updatePresetterRC(root, { preset });
121
+ const context = await getContext();
122
+ await bootstrapContent(context);
123
+ await (0, write_pkg_1.default)(root, (0, lodash_1.defaultsDeep)(context.target.package, {
124
+ scripts: { prepare: 'presetter bootstrap' },
125
+ }));
126
+ (0, console_1.info)('Done. Enjoy coding!');
207
127
  }
208
- /**
209
- * bootstrap the preset to the current project root
210
- * @param options options on how to bootstrap the preset
211
- * @param options.force do all steps despite potential step saving
212
- */
213
-
214
-
128
+ exports.setupPreset = setupPreset;
215
129
  async function bootstrapPreset(options) {
216
- const {
217
- force = false
218
- } = { ...options
219
- };
220
- const context = await getContext(); // install all related packages first
221
-
222
- if (force || !(0, _package.arePeerPackagesAutoInstalled)()) {
223
- await (0, _package.reifyDependencies)({
224
- root: context.target.root
225
- });
226
- } // generate configurations
227
-
228
-
229
- await bootstrapContent(context);
130
+ const { force = false } = Object.assign({}, options);
131
+ const context = await getContext();
132
+ if (force || !(0, package_1.arePeerPackagesAutoInstalled)()) {
133
+ await (0, package_1.reifyDependencies)({ root: context.target.root });
134
+ }
135
+ await bootstrapContent(context);
230
136
  }
231
- /**
232
- * generate files from templates and link them to the target project root
233
- * @param context context about the target project and any customisation in .presetterrc
234
- */
235
-
236
-
137
+ exports.bootstrapPreset = bootstrapPreset;
237
138
  async function bootstrapContent(context) {
238
- var _context$custom$ignor;
239
-
240
- const assets = await getPresetAssets(context);
241
- const content = await (0, _content.generateContent)(assets, context);
242
- const resolvedContext = await (0, _content.resolveContext)(assets, context);
243
- const userIgnores = (_context$custom$ignor = context.custom.ignores) !== null && _context$custom$ignor !== void 0 ? _context$custom$ignor : [];
244
- const presetIgnores = (await Promise.all(assets.map(({
245
- supplementaryIgnores
246
- }) => supplementaryIgnores instanceof Function ? supplementaryIgnores(resolvedContext) : supplementaryIgnores))).filter(rules => !!rules).flat();
247
- const filteredContent = (0, _template.filter)(content, ...presetIgnores, ...userIgnores);
248
- const destinationMap = await getDestinationMap(filteredContent, resolvedContext);
249
- await (0, _io.writeFiles)(context.target.root, filteredContent, destinationMap);
250
- await (0, _io.linkFiles)(context.target.root, destinationMap);
139
+ var _a;
140
+ const assets = await getPresetAssets(context);
141
+ const content = await (0, content_1.generateContent)(assets, context);
142
+ const resolvedContext = await (0, content_1.resolveContext)(assets, context);
143
+ const userIgnores = (_a = context.custom.ignores) !== null && _a !== void 0 ? _a : [];
144
+ const presetIgnores = (await Promise.all(assets.map(({ supplementaryIgnores }) => supplementaryIgnores instanceof Function
145
+ ? supplementaryIgnores(resolvedContext)
146
+ : supplementaryIgnores)))
147
+ .filter((rules) => !!rules)
148
+ .flat();
149
+ const filteredContent = (0, template_1.filter)(content, ...presetIgnores, ...userIgnores);
150
+ const destinationMap = await getDestinationMap(filteredContent, resolvedContext);
151
+ await (0, io_1.writeFiles)(context.target.root, filteredContent, destinationMap);
152
+ await (0, io_1.linkFiles)(context.target.root, destinationMap);
251
153
  }
252
- /**
253
- * uninstall the preset from the current project root
254
- */
255
-
256
-
154
+ exports.bootstrapContent = bootstrapContent;
257
155
  async function unsetPreset() {
258
- const context = await getContext();
259
- const assets = await getPresetAssets(context);
260
- const content = await (0, _content.generateContent)(assets, context);
261
- const resolvedContext = await (0, _content.resolveContext)(assets, context);
262
- const configurationLink = await getDestinationMap(content, resolvedContext);
263
- await (0, _io.unlinkFiles)(context.target.root, configurationLink);
156
+ const context = await getContext();
157
+ const assets = await getPresetAssets(context);
158
+ const content = await (0, content_1.generateContent)(assets, context);
159
+ const resolvedContext = await (0, content_1.resolveContext)(assets, context);
160
+ const configurationLink = await getDestinationMap(content, resolvedContext);
161
+ await (0, io_1.unlinkFiles)(context.target.root, configurationLink);
264
162
  }
265
- /**
266
- * get context about the target project and any customisation in .presetterrc
267
- * @returns context about the target project and any customisation in .presetterrc
268
- */
269
-
270
-
163
+ exports.unsetPreset = unsetPreset;
271
164
  async function getContext() {
272
- const {
273
- json,
274
- path
275
- } = await (0, _package.getPackage)();
276
- const root = (0, _path.dirname)(path);
277
- const target = {
278
- name: json.name,
279
- root,
280
- package: json
281
- };
282
- const custom = await getPresetterRC(root);
283
- return {
284
- target,
285
- custom
286
- };
165
+ const { json, path } = await (0, package_1.getPackage)();
166
+ const root = (0, path_1.dirname)(path);
167
+ const target = { name: json.name, root, package: json };
168
+ const custom = await getPresetterRC(root);
169
+ return {
170
+ target,
171
+ custom,
172
+ };
287
173
  }
288
- /**
289
- * compute the output paths of all configuration files to be generated
290
- * @param template resolved template map
291
- * @param context resolved context about the target project and customisation
292
- * @returns mapping of configuration symlinks to its real path
293
- */
294
-
295
-
174
+ exports.getContext = getContext;
296
175
  async function getDestinationMap(template, context) {
297
- const {
298
- custom: {
299
- noSymlinks
300
- },
301
- target: {
302
- root
303
- }
304
- } = context; // make sure we use the path of presetter under the target project, not the one via npx
305
-
306
- const presetterDir = (0, _resolvePkg.default)('presetter', {
307
- cwd: root
308
- });
309
- const outDir = (0, _path.resolve)(presetterDir, 'generated', context.target.name);
310
- const relativePaths = [...Object.keys(template)];
311
- return Object.fromEntries([...relativePaths.map(relativePath => [relativePath, (0, _path.resolve)( // output on the project root if it's specified as not a symlink
312
- noSymlinks.includes(relativePath) ? context.target.root : outDir, relativePath)])]);
176
+ const { custom: { noSymlinks }, target: { root }, } = context;
177
+ const presetterDir = (0, resolve_pkg_1.default)('presetter', { cwd: root });
178
+ const outDir = (0, path_1.resolve)(presetterDir, 'generated', context.target.name);
179
+ const relativePaths = [...Object.keys(template)];
180
+ return Object.fromEntries([
181
+ ...relativePaths.map((relativePath) => [
182
+ relativePath,
183
+ (0, path_1.resolve)(noSymlinks.includes(relativePath) ? context.target.root : outDir, relativePath),
184
+ ]),
185
+ ]);
313
186
  }
314
- /**
315
- * get a list of new packages installed by comparing the before and after state of devDependencies in package.json
316
- * @param before before state of devDependencies in package.json
317
- * @param after after state of devDependencies in package.json
318
- * @returns list of new package names
319
- */
320
-
321
-
187
+ exports.getDestinationMap = getDestinationMap;
322
188
  function getNewPackages(before, after) {
323
- return Object.keys(after).filter(name => !before[name]);
189
+ return Object.keys(after).filter((name) => !before[name]);
324
190
  }
325
- //# sourceMappingURL=preset.js.map
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc291cmNlL3ByZXNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWVBLHFDQUErQjtBQUMvQix1Q0FBaUQ7QUFDakQsbUNBQXNDO0FBQ3RDLCtCQUF3QztBQUN4Qyx3REFBbUM7QUFDbkMsOERBQXlDO0FBQ3pDLDBEQUFxQztBQUVyQyx1Q0FBeUU7QUFDekUsNkJBQW9FO0FBQ3BFLHVDQUltQjtBQUNuQix5Q0FBNkQ7QUFhN0QsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDO0FBRW5DLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztBQU9mLEtBQUssVUFBVSxjQUFjLENBQUMsSUFBWTtJQUMvQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ3JELElBQUEsY0FBTyxFQUFDLElBQUksRUFBRSxHQUFHLFdBQVcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUN0QyxDQUFDO0lBRUYsS0FBSyxNQUFNLElBQUksSUFBSSxvQkFBb0IsRUFBRTtRQUN2QyxJQUFJLE1BQU0sSUFBQSxxQkFBVSxFQUFDLElBQUksQ0FBQyxFQUFFO1lBRTFCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxhQUFRLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTFCLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7S0FDRjtJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBaEJELHdDQWdCQztBQU9NLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsSUFBWSxFQUNaLE1BQXVCO0lBRXZCLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMs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