1 | ;
|
2 | var task_resolve_1 = require("./task.resolve");
|
3 | var cli_parse_1 = require("./cli.parse");
|
4 | var task_resolve_2 = require("./task.resolve");
|
5 | var task_utils_1 = require("./task.utils");
|
6 | var task_errors_1 = require("./task.errors");
|
7 | var _ = require("../lodash.custom");
|
8 | var qs = require("qs");
|
9 | var flagRegex = /(.+?)@(.+)?$/;
|
10 | var inlineFnCount = 0;
|
11 | function preprocessTask(taskName, trigger, parents) {
|
12 | var output = (function () {
|
13 | if (typeof taskName === "function") {
|
14 | return handleFunctionInput(taskName, trigger.input, parents);
|
15 | }
|
16 | if (typeof taskName === "string") {
|
17 | return handleStringInput(taskName, trigger, parents);
|
18 | }
|
19 | if (task_utils_1.isPlainObject(taskName)) {
|
20 | return handleObjectInput(taskName, trigger.input, parents);
|
21 | }
|
22 | if (Array.isArray(taskName)) {
|
23 | return handleArrayInput(taskName, trigger.input, parents);
|
24 | }
|
25 | })();
|
26 | /**
|
27 | * Mark this item as 'skipped' if the task name matches
|
28 | * one given in the --skip flag via CLI
|
29 | *
|
30 | * Note: this is separate to individual task config
|
31 | *
|
32 | * eg:
|
33 | * crossbow run deploy --skip build-js
|
34 | *
|
35 | * -> All tasks under deploy still run, but build-js will be skipped
|
36 | */
|
37 | if (trigger.config.skip.length) {
|
38 | if (trigger.config.skip.indexOf(output.baseTaskName) > -1) {
|
39 | output.skipped = true;
|
40 | }
|
41 | }
|
42 | return output;
|
43 | }
|
44 | exports.preprocessTask = preprocessTask;
|
45 | var objectCount = 0;
|
46 | function handleObjectInput(taskLiteral, input, parents) {
|
47 | /**
|
48 | * Any value on the 'tasks' property
|
49 | */
|
50 | if (taskLiteral.tasks) {
|
51 | var name_1 = "AnonObject_" + objectCount++;
|
52 | var out = task_resolve_2.createTask(_.assign({
|
53 | baseTaskName: name_1,
|
54 | taskName: name_1,
|
55 | rawInput: JSON.stringify(taskLiteral),
|
56 | valid: true,
|
57 | parents: parents,
|
58 | origin: task_resolve_2.TaskOriginTypes.InlineObject,
|
59 | type: task_resolve_2.TaskTypes.TaskGroup
|
60 | }, taskLiteral));
|
61 | return out;
|
62 | }
|
63 | if (typeof taskLiteral.input === "string") {
|
64 | return stubAdaptor(taskLiteral.input, taskLiteral, parents);
|
65 | }
|
66 | if (typeof taskLiteral.adaptor === "string" && typeof taskLiteral.command === "string") {
|
67 | taskLiteral.adaptor = taskLiteral.adaptor.replace(/^@/, "");
|
68 | return stubAdaptor("@" + taskLiteral.adaptor + " " + taskLiteral.command, taskLiteral, parents);
|
69 | }
|
70 | return task_resolve_2.createTask({
|
71 | rawInput: task_utils_1.stringifyObj(taskLiteral),
|
72 | taskName: "",
|
73 | type: task_resolve_2.TaskTypes.Adaptor,
|
74 | origin: task_resolve_2.TaskOriginTypes.Adaptor,
|
75 | adaptor: "",
|
76 | errors: [{
|
77 | type: task_errors_1.TaskErrorTypes.InvalidTaskInput,
|
78 | input: taskLiteral
|
79 | }]
|
80 | });
|
81 | }
|
82 | exports.handleObjectInput = handleObjectInput;
|
83 | function handleArrayInput(taskItems, input, parents) {
|
84 | var name = "AnonGroup_" + taskItems.join(",").slice(0, 10) + "...";
|
85 | return task_resolve_2.createTask({
|
86 | runMode: task_resolve_2.TaskRunModes.parallel,
|
87 | baseTaskName: name,
|
88 | taskName: name,
|
89 | rawInput: taskItems.toString(),
|
90 | valid: true,
|
91 | parents: parents,
|
92 | origin: task_resolve_2.TaskOriginTypes.InlineArray,
|
93 | type: task_resolve_2.TaskTypes.TaskGroup,
|
94 | tasks: taskItems
|
95 | });
|
96 | }
|
97 | exports.handleArrayInput = handleArrayInput;
|
98 | function stubAdaptor(inputString, taskLiteral, parents) {
|
99 | var taskLiteralAdaptor = task_resolve_2.createAdaptorTask(inputString, parents);
|
100 | return _.assign({}, taskLiteralAdaptor, taskLiteral);
|
101 | }
|
102 | /**
|
103 | * String can be given that may be task themselves, like NPM tasks
|
104 | * or shell commands, but they can also be an alias for other tasks
|
105 | *
|
106 | * examples:
|
107 | *
|
108 | * - @npm webpack --config webpack.dev.js
|
109 | * - build (which may be an alias for many other tasks)
|
110 | */
|
111 | function handleStringInput(taskName, trigger, parents) {
|
112 | var input = trigger.input;
|
113 | /**
|
114 | * Never modify the current task if it begins
|
115 | * with a `@` - instead just return early with
|
116 | * a adaptors task
|
117 | * eg: `@npm webpack`
|
118 | */
|
119 | if (taskName.match(/^@/)) {
|
120 | return task_resolve_2.createAdaptorTask(taskName, parents);
|
121 | }
|
122 | /**
|
123 | * Split any end cbflags from the main task name
|
124 | * @type {SplitTaskAndFlags}
|
125 | */
|
126 | var split = getSplitFlags(taskName, input);
|
127 | /**
|
128 | * Split the incoming taskname on colons
|
129 | * eg: sass:site:dev
|
130 | * -> ['sass', 'site', 'dev']
|
131 | * @type {Array}
|
132 | */
|
133 | var splitTask = split.taskName.split(":");
|
134 | /**
|
135 | * Take the first (or the only) item as the base task name
|
136 | * eg: uglify:*
|
137 | * -> 'uglify'
|
138 | * @type {string}
|
139 | */
|
140 | var baseTaskName = splitTask[0];
|
141 | var subTasks = splitTask.slice(1);
|
142 | var isParentName = /^\(.+?\)$/.test(baseTaskName);
|
143 | var inputMatchesParentName = (function () {
|
144 | if (input.tasks["(" + splitTask[0] + ")"]) {
|
145 | return true;
|
146 | }
|
147 | if (splitTask[0].match(/^\(.+?\)$/) && input.tasks[splitTask[0]]) {
|
148 | return true;
|
149 | }
|
150 | })();
|
151 | var normalisedTaskName = (function () {
|
152 | if (isParentName)
|
153 | return baseTaskName.slice(1, -1);
|
154 | return baseTaskName;
|
155 | })();
|
156 | // Before we create the base task, check if this is an alias
|
157 | // to another top-level task
|
158 | var topLevel = (function () {
|
159 | var base = task_resolve_1.getTopLevelValue(normalisedTaskName, input);
|
160 | if (inputMatchesParentName && subTasks.length) {
|
161 | return _.get(base, [subTasks], {});
|
162 | }
|
163 | return base;
|
164 | })();
|
165 | var topLevelOptions = (function () {
|
166 | if (inputMatchesParentName && subTasks.length) {
|
167 | return _.get(input.options, [normalisedTaskName].concat(subTasks), {});
|
168 | }
|
169 | return _.get(input.options, [normalisedTaskName], {});
|
170 | })();
|
171 | /**
|
172 | * Create the base task
|
173 | */
|
174 | var incomingTask = (function () {
|
175 | // if it's not an alias
|
176 | if (!topLevel && trigger.config.binExecutables.length) {
|
177 | // if the normalised task name matches an executable
|
178 | if (trigger.config.binExecutables.indexOf(normalisedTaskName) !== -1) {
|
179 | return task_resolve_2.createTask({
|
180 | baseTaskName: taskName,
|
181 | valid: true,
|
182 | adaptor: 'sh',
|
183 | taskName: taskName,
|
184 | rawInput: taskName,
|
185 | parents: parents,
|
186 | command: taskName,
|
187 | runMode: task_resolve_2.TaskRunModes.series,
|
188 | origin: task_resolve_2.TaskOriginTypes.Adaptor,
|
189 | type: task_resolve_2.TaskTypes.Adaptor
|
190 | });
|
191 | }
|
192 | }
|
193 | var base = task_resolve_2.createTask({
|
194 | cbflags: split.cbflags,
|
195 | query: split.query,
|
196 | flags: split.flags,
|
197 | baseTaskName: normalisedTaskName,
|
198 | subTasks: subTasks,
|
199 | taskName: normalisedTaskName,
|
200 | rawInput: taskName,
|
201 | options: topLevelOptions
|
202 | });
|
203 | if (task_utils_1.isPlainObject(topLevel) && topLevel.tasks) {
|
204 | /**
|
205 | * Create the base task
|
206 | */
|
207 | return _.merge({}, base, topLevel, {
|
208 | origin: task_resolve_2.TaskOriginTypes.InlineChildObject,
|
209 | type: inputMatchesParentName ? task_resolve_2.TaskTypes.ParentGroup : task_resolve_2.TaskTypes.TaskGroup
|
210 | });
|
211 | }
|
212 | return base;
|
213 | })();
|
214 | if (inputMatchesParentName) {
|
215 | incomingTask.type = task_resolve_2.TaskTypes.ParentGroup;
|
216 | }
|
217 | /**
|
218 | * Now pass it off to allow any flags to applied
|
219 | */
|
220 | return processFlags(incomingTask);
|
221 | }
|
222 | /**
|
223 | * Function can be given inline so this methods handles that
|
224 | */
|
225 | function handleFunctionInput(taskName, input, parents) {
|
226 | var fnName = taskName["name"];
|
227 | var identifier = "_inline_fn_" + inlineFnCount++ + "_" + fnName;
|
228 | return task_resolve_2.createTask({
|
229 | runMode: task_resolve_2.TaskRunModes.series,
|
230 | baseTaskName: identifier,
|
231 | taskName: identifier,
|
232 | rawInput: identifier,
|
233 | inlineFunctions: [taskName],
|
234 | valid: true,
|
235 | parents: parents,
|
236 | origin: task_resolve_2.TaskOriginTypes.InlineFunction,
|
237 | type: task_resolve_2.TaskTypes.InlineFunction
|
238 | });
|
239 | }
|
240 | /**
|
241 | *
|
242 | */
|
243 | function getSplitFlags(taskName, input) {
|
244 | /**
|
245 | * Split up the task name from any flags/queries/cbflags etc
|
246 | * @type {{baseName: string, flags: {}}}
|
247 | */
|
248 | var baseNameAndFlags = getBaseNameAndFlags(taskName);
|
249 | /**
|
250 | * Split tasks based on whether or not they have flags
|
251 | * eg: crossbow run '@npm run webpack@p'
|
252 | * -> taskName: '@npm run webpack'
|
253 | * -> cbflags: ['p']
|
254 | * @type {RegExpMatchArray}
|
255 | */
|
256 | var splitCBFlags = baseNameAndFlags.baseName.match(flagRegex);
|
257 | /**
|
258 | * If splitFlags is falsey, there was no flag so return
|
259 | * an empty array and the full task name
|
260 | */
|
261 | if (!splitCBFlags) {
|
262 | var splitQuery_1 = baseNameAndFlags.baseName.split("?");
|
263 | var query_1 = getQuery(splitQuery_1);
|
264 | /**
|
265 | * Next, look at the top-level input,
|
266 | * is this taskname going to match, and if so, does it contain any flags?
|
267 | */
|
268 | var cbflags_1 = Object.keys(input.tasks).reduce(function (all, key) {
|
269 | var firstSectionOfTaskName = taskName.split(' ')[0];
|
270 | var match = key.match(new RegExp("^" + firstSectionOfTaskName + "@(.+)"));
|
271 | if (match) {
|
272 | return all.concat(match[1].split(""));
|
273 | }
|
274 | return all;
|
275 | }, []);
|
276 | return { taskName: splitQuery_1[0], query: query_1, cbflags: cbflags_1, flags: baseNameAndFlags.flags };
|
277 | }
|
278 | /**
|
279 | * At this point, there was at LEAST an @ at the end of the task name
|
280 | * @type {string}
|
281 | */
|
282 | var base = splitCBFlags[1];
|
283 | var splitQuery = base.split("?");
|
284 | var query = getQuery(splitQuery);
|
285 | var cbflags = (function () {
|
286 | /**
|
287 | * If the 3rd item in the regex match is undefined, it means
|
288 | * the @ was used at the end of the task name, but a value was not given.
|
289 | * In that case we return an empty string to allow the error collection
|
290 | * to kick in later
|
291 | * @type {string[]}
|
292 | */
|
293 | if (splitCBFlags[2] === undefined) {
|
294 | return [""];
|
295 | }
|
296 | /**
|
297 | * Default case is where there are chars after the @, so we split them up
|
298 | * eg: crossbow run '@npm run webpack@pas'
|
299 | * -> flags: ['p', 'a', 's']
|
300 | */
|
301 | return splitCBFlags[2].split("");
|
302 | })();
|
303 | return {
|
304 | taskName: splitQuery[0],
|
305 | query: query,
|
306 | cbflags: cbflags,
|
307 | flags: baseNameAndFlags.flags
|
308 | };
|
309 | }
|
310 | function getQuery(splitQuery) {
|
311 | if (splitQuery.length > 1) {
|
312 | return qs.parse(splitQuery[1]);
|
313 | }
|
314 | return {};
|
315 | }
|
316 | /**
|
317 | * Apply any transformations to options based on
|
318 | * CB flags
|
319 | * // todo refactor this
|
320 | * @param task
|
321 | * @returns {any}
|
322 | */
|
323 | function processFlags(task) {
|
324 | var runMode = (function () {
|
325 | if (task.runMode === task_resolve_2.TaskRunModes.parallel)
|
326 | return task_resolve_2.TaskRunModes.parallel;
|
327 | if (task.cbflags.indexOf("p") > -1) {
|
328 | return task_resolve_2.TaskRunModes.parallel;
|
329 | }
|
330 | return task_resolve_2.TaskRunModes.series;
|
331 | })();
|
332 | return _.assign({}, task, {
|
333 | runMode: runMode
|
334 | });
|
335 | }
|
336 | /**
|
337 | * Split basename + opts
|
338 | * @param taskName
|
339 | * @returns {{baseName: any, flags: {}}}
|
340 | */
|
341 | function getBaseNameAndFlags(taskName) {
|
342 | var splitFlags = taskName.trim().split(/^(.+?) /);
|
343 | /**
|
344 | * Basename is everything upto the first space
|
345 | * @type {string}
|
346 | */
|
347 | var baseName = (function () {
|
348 | if (splitFlags.length === 1) {
|
349 | return splitFlags[0];
|
350 | }
|
351 | return splitFlags[1];
|
352 | })();
|
353 | /**
|
354 | * Flags is an object containing anything after the first space,
|
355 | * parsed as CLI input
|
356 | * @type {Flags|{}}
|
357 | */
|
358 | var flags = (function () {
|
359 | if (splitFlags.length === 3) {
|
360 | return cli_parse_1.default(splitFlags[1] + " " + splitFlags[2]).flags;
|
361 | }
|
362 | return {};
|
363 | })();
|
364 | return { baseName: baseName, flags: flags };
|
365 | }
|
366 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay5wcmVwcm9jZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rhc2sucHJlcHJvY2Vzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQXNEO0FBQ3RELHlDQUFnQztBQUVoQywrQ0FHd0I7QUFDeEIsMkNBQXlEO0FBRXpELDZDQUE2QztBQUs3QyxJQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUN0QyxJQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekIsSUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDO0FBRWpDLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztBQUV0Qix3QkFBK0IsUUFBMEIsRUFBRSxPQUF1QixFQUFFLE9BQWlCO0lBRWpHLElBQUksTUFBTSxHQUFHLENBQUM7UUFDVixFQUFFLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsMEJBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixNQUFNLENBQUMsZ0JBQWdCLENBQU0sUUFBUSxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNMLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFTDs7Ozs7Ozs7OztPQVVHO0lBQ0gsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3QixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RCxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQW5DRCx3Q0FtQ0M7QUFXRCxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDcEIsMkJBQWtDLFdBQXdCLEVBQUUsS0FBSyxFQUFFLE9BQU87SUFFdEU7O09BRUc7SUFDSCxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVwQixJQUFNLE1BQUksR0FBRyxhQUFhLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFFM0MsSUFBTSxHQUFHLEdBQUcseUJBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQzVCLFlBQVksRUFBRSxNQUFJO1lBQ2xCLFFBQVEsRUFBRSxNQUFJO1lBQ2QsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1lBQ3JDLEtBQUssRUFBRSxJQUFJO1lBQ1gsT0FBTyxFQUFFLE9BQU87WUFDaEIsTUFBTSxFQUFFLDhCQUFlLENBQUMsWUFBWTtZQUNwQyxJQUFJLEVBQUUsd0JBQVMsQ0FBQyxTQUFTO1NBQzVCLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUVqQixNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVELEVBQUUsQ0FBQyxDQUFDLE9BQU8sV0FBVyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELEVBQUUsQ0FBQyxDQUFDLE9BQU8sV0FBVyxDQUFDLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxXQUFXLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDckYsV0FBVyxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFJLFdBQVcsQ0FBQyxPQUFPLFNBQUksV0FBVyxDQUFDLE9BQVMsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVELE1BQU0sQ0FBQyx5QkFBVSxDQUFDO1FBQ2QsUUFBUSxFQUFFLHlCQUFZLENBQUMsV0FBVyxDQUFDO1FBQ25DLFFBQVEsRUFBRSxFQUFFO1FBQ1osSUFBSSxFQUFFLHdCQUFTLENBQUMsT0FBTztRQUN2QixNQUFNLEVBQUUsOEJBQWUsQ0FBQyxPQUFPO1FBQy9CLE9BQU8sRUFBRSxFQUFFO1FBQ1gsTUFBTSxFQUFFLENBQXdCO2dCQUM1QixJQUFJLEVBQUUsNEJBQWMsQ0FBQyxnQkFBZ0I7Z0JBQ3JDLEtBQUssRUFBRSxXQUFXO2FBQ3JCLENBQUM7S0FDTCxDQUFDLENBQUM7QUFDUCxDQUFDO0FBMUNELDhDQTBDQztBQUVELDBCQUFpQyxTQUFnQixFQUFFLEtBQW9CLEVBQUUsT0FBaUI7SUFDdEYsSUFBTSxJQUFJLEdBQUcsWUFBWSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDckUsTUFBTSxDQUFDLHlCQUFVLENBQUM7UUFDZCxPQUFPLEVBQUUsMkJBQVksQ0FBQyxRQUFRO1FBQzlCLFlBQVksRUFBRSxJQUFJO1FBQ2xCLFFBQVEsRUFBRSxJQUFJO1FBQ2QsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUU7UUFDOUIsS0FBSyxFQUFFLElBQUk7UUFDWCxPQUFPLEVBQUUsT0FBTztRQUNoQixNQUFNLEVBQUUsOEJBQWUsQ0FBQyxXQUFXO1FBQ25DLElBQUksRUFBRSx3QkFBUyxDQUFDLFNBQVM7UUFDekIsS0FBSyxFQUFFLFNBQVM7S0FDbkIsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQWJELDRDQWFDO0FBRUQscUJBQXFCLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTztJQUNsRCxJQUFNLGtCQUFrQixHQUFHLGdDQUFpQixDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsMkJBQTJCLFFBQWdCLEVBQUUsT0FBdUIsRUFBRSxPQUFpQjtJQUU1RSxJQUFBLHFCQUFLLENBQVk7SUFFeEI7Ozs7O09BS0c7SUFDSCxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixNQUFNLENBQUMsZ0NBQWlCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLEtBQUssR0FBRyxhQUFhLENBQVMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRW5EOzs7OztPQUtHO0lBQ0gsSUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFNUM7Ozs7O09BS0c7SUFDSCxJQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsSUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxJQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BELElBQU0sc0JBQXNCLEdBQUcsQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNoQixDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ2hCLENBQUM7SUFDTCxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRUwsSUFBTSxrQkFBa0IsR0FBRyxDQUFDO1FBQ3hCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDeEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVMLDREQUE0RDtJQUM1RCw0QkFBNEI7SUFDNUIsSUFBTSxRQUFRLEdBQUcsQ0FBQztRQUNkLElBQU0sSUFBSSxHQUFHLCtCQUFnQixDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pELEVBQUUsQ0FBQyxDQUFDLHNCQUFzQixJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFTCxJQUFNLGVBQWUsR0FBRyxDQUFDO1FBQ3JCLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQixJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsa0JBQWtCLFNBQUssUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRUw7O09BRUc7SUFDSCxJQUFNLFlBQVksR0FBRyxDQUFDO1FBRWxCLHVCQUF1QjtRQUN2QixFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBRXBELG9EQUFvRDtZQUNwRCxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLE1BQU0sQ0FBQyx5QkFBVSxDQUFDO29CQUNkLFlBQVksRUFBRSxRQUFRO29CQUN0QixLQUFLLEVBQUUsSUFBSTtvQkFDWCxPQUFPLEVBQUUsSUFBSTtvQkFDYixRQUFRLEVBQUUsUUFBUTtvQkFDbEIsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLE9BQU8sRUFBRSxPQUFPO29CQUNoQixPQUFPLEVBQUUsUUFBUTtvQkFDakIsT0FBTyxFQUFFLDJCQUFZLENBQUMsTUFBTTtvQkFDNUIsTUFBTSxFQUFFLDhCQUFlLENBQUMsT0FBTztvQkFDL0IsSUFBSSxFQUFFLHdCQUFTLENBQUMsT0FBTztpQkFDMUIsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFNLElBQUksR0FBRyx5QkFBVSxDQUFDO1lBQ3BCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ2xCLFlBQVksRUFBRSxrQkFBa0I7WUFDaEMsUUFBUSxVQUFBO1lBQ1IsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixRQUFRLEVBQVUsUUFBUTtZQUMxQixPQUFPLEVBQUUsZUFBZTtTQUMzQixDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsQ0FBQywwQkFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzVDOztlQUVHO1lBQ0gsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7Z0JBQy9CLE1BQU0sRUFBRSw4QkFBZSxDQUFDLGlCQUFpQjtnQkFDekMsSUFBSSxFQUFFLHNCQUFzQixHQUFHLHdCQUFTLENBQUMsV0FBVyxHQUFHLHdCQUFTLENBQUMsU0FBUzthQUM3RSxDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDLENBQUMsRUFBRSxDQUFDO0lBRUwsRUFBRSxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLFlBQVksQ0FBQyxJQUFJLEdBQUcsd0JBQVMsQ0FBQyxXQUFXLENBQUM7SUFDOUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCw2QkFBNkIsUUFBa0IsRUFBRSxLQUFvQixFQUFFLE9BQWlCO0lBQ3BGLElBQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxJQUFNLFVBQVUsR0FBRyxnQkFBYyxhQUFhLEVBQUUsTUFBRyxHQUFHLE1BQU0sQ0FBQztJQUM3RCxNQUFNLENBQUMseUJBQVUsQ0FBQztRQUNkLE9BQU8sRUFBRSwyQkFBWSxDQUFDLE1BQU07UUFDNUIsWUFBWSxFQUFFLFVBQVU7UUFDeEIsUUFBUSxFQUFFLFVBQVU7UUFDcEIsUUFBUSxFQUFFLFVBQVU7UUFDcEIsZUFBZSxFQUFFLENBQWEsUUFBUSxDQUFDO1FBQ3ZDLEtBQUssRUFBRSxJQUFJO1FBQ1gsT0FBTyxFQUFFLE9BQU87UUFDaEIsTUFBTSxFQUFFLDhCQUFlLENBQUMsY0FBYztRQUN0QyxJQUFJLEVBQUUsd0JBQVMsQ0FBQyxjQUFjO0tBQ2pDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFTRDs7R0FFRztBQUNILHVCQUF1QixRQUFnQixFQUFFLEtBQW9CO0lBR3pEOzs7T0FHRztJQUNILElBQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFdkQ7Ozs7OztPQU1HO0lBQ0gsSUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUVoRTs7O09BR0c7SUFDSCxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDaEIsSUFBTSxZQUFVLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4RCxJQUFNLE9BQUssR0FBRyxRQUFRLENBQUMsWUFBVSxDQUFDLENBQUM7UUFFbkM7OztXQUdHO1FBQ0gsSUFBTSxTQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxFQUFFLEdBQUc7WUFDOUQsSUFBTSxzQkFBc0IsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RELElBQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBSSxzQkFBc0IsVUFBTyxDQUFDLENBQUMsQ0FBQztZQUN2RSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNSLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNmLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVQLE1BQU0sQ0FBQyxFQUFDLFFBQVEsRUFBRSxZQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxTQUFBLEVBQUUsT0FBTyxFQUFFLFNBQU8sRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxFQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVuQyxJQUFNLE9BQU8sR0FBRyxDQUFDO1FBQ2I7Ozs7OztXQU1HO1FBQ0gsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsQ0FBQztRQUNEOzs7O1dBSUc7UUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRUwsTUFBTSxDQUFDO1FBQ0gsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdkIsS0FBSyxPQUFBO1FBQ0wsT0FBTyxTQUFBO1FBQ1AsS0FBSyxFQUFFLGdCQUFnQixDQUFDLEtBQUs7S0FDaEMsQ0FBQztBQUNOLENBQUM7QUFFRCxrQkFBa0IsVUFBb0I7SUFDbEMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxNQUFNLENBQUMsRUFBRSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILHNCQUFzQixJQUFVO0lBRTVCLElBQU0sT0FBTyxHQUFHLENBQUM7UUFDYixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLDJCQUFZLENBQUMsUUFBUSxDQUFDO1lBQUMsTUFBTSxDQUFDLDJCQUFZLENBQUMsUUFBUSxDQUFDO1FBQ3pFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUMsMkJBQVksQ0FBQyxRQUFRLENBQUM7UUFDakMsQ0FBQztRQUNELE1BQU0sQ0FBQywyQkFBWSxDQUFDLE1BQU0sQ0FBQztJQUMvQixDQUFDLENBQUMsRUFBRSxDQUFDO0lBRUwsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRTtRQUN0QixPQUFPLFNBQUE7S0FDVixDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILDZCQUE2QixRQUFnQjtJQUN6QyxJQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXBEOzs7T0FHRztJQUNILElBQU0sUUFBUSxHQUFHLENBQUM7UUFDZCxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDLENBQUMsRUFBRSxDQUFDO0lBRUw7Ozs7T0FJRztJQUNILElBQU0sS0FBSyxHQUFHLENBQUM7UUFDWCxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsTUFBTSxDQUFDLG1CQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDNUQsQ0FBQztRQUNELE1BQU0sQ0FBUSxFQUFFLENBQUM7SUFDckIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVMLE1BQU0sQ0FBQyxFQUFDLFFBQVEsVUFBQSxFQUFFLEtBQUssT0FBQSxFQUFDLENBQUM7QUFDN0IsQ0FBQyJ9 |
\ | No newline at end of file |