@effect-app/cli 1.23.4 → 1.23.5

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @effect-app/cli
2
2
 
3
+ ## 1.23.5
4
+
5
+ ### Patch Changes
6
+
7
+ - de35a0f: add monitors for packagejson
8
+ - 8e1543e: add wrapping of child commands
9
+
3
10
  ## 1.23.4
4
11
 
5
12
  ### Patch Changes
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@
4
4
  import { Args, Command, Options, Prompt } from "@effect/cli";
5
5
  import { Command as NodeCommand, FileSystem, Path } from "@effect/platform";
6
6
  import { NodeContext, NodeRuntime } from "@effect/platform-node";
7
- import { Effect, identity, Stream } from "effect";
7
+ import { Effect, identity, Option, Stream } from "effect";
8
8
  import { ExtractExportMappingsService } from "./extract.js";
9
9
  import { packages } from "./shared.js";
10
10
  Effect
@@ -86,7 +86,7 @@ Effect
86
86
  * @returns An Effect that succeeds when linking is complete
87
87
  */
88
88
  const linkPackages = Effect.fnUntraced(function* (effectAppLibsPath) {
89
- yield* Effect.log("Linking local effect-app packages...");
89
+ yield* Effect.logInfo("Linking local effect-app packages...");
90
90
  const packageJsonPath = "./package.json";
91
91
  const packageJsonContent = yield* fs.readFileString(packageJsonPath);
92
92
  const pj = JSON.parse(packageJsonContent);
@@ -101,9 +101,9 @@ Effect
101
101
  };
102
102
  pj.resolutions = resolutions;
103
103
  yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2));
104
- yield* Effect.log("Updated package.json with local file resolutions");
104
+ yield* Effect.logInfo("Updated package.json with local file resolutions");
105
105
  yield* runNodeCommand("pnpm i");
106
- yield* Effect.log("Successfully linked local packages");
106
+ yield* Effect.logInfo("Successfully linked local packages");
107
107
  });
108
108
  /**
109
109
  * Unlinks local effect-app packages by removing file resolutions from package.json.
@@ -113,7 +113,7 @@ Effect
113
113
  * @returns An Effect that succeeds when unlinking is complete
114
114
  */
115
115
  const unlinkPackages = Effect.fnUntraced(function* () {
116
- yield* Effect.log("Unlinking local effect-app packages...");
116
+ yield* Effect.logInfo("Unlinking local effect-app packages...");
117
117
  const packageJsonPath = "./package.json";
118
118
  const packageJsonContent = yield* fs.readFileString(packageJsonPath);
119
119
  const pj = JSON.parse(packageJsonContent);
@@ -125,9 +125,9 @@ Effect
125
125
  }, {});
126
126
  pj.resolutions = filteredResolutions;
127
127
  yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2));
128
- yield* Effect.log("Removed effect-app file resolutions from package.json");
128
+ yield* Effect.logInfo("Removed effect-app file resolutions from package.json");
129
129
  yield* runNodeCommand("pnpm i");
130
- yield* Effect.log("Successfully unlinked local packages");
130
+ yield* Effect.logInfo("Successfully unlinked local packages");
131
131
  })();
132
132
  /**
133
133
  * Monitors controller files for changes and runs eslint on related controllers.ts/routes.ts files.
@@ -137,12 +137,9 @@ Effect
137
137
  * @param debug - Whether to enable debug logging
138
138
  * @returns An Effect that sets up controller file monitoring
139
139
  */
140
- const monitorChildIndexes = Effect.fn("effa-cli.index-multi.monitorChildIndexes")(function* (watchPath, debug) {
141
- const fileSystem = yield* FileSystem.FileSystem;
142
- if (debug) {
143
- yield* Effect.logInfo(`Starting controller monitoring for: ${watchPath}`);
144
- }
145
- const watchStream = fileSystem.watch(watchPath, { recursive: true });
140
+ const monitorChildIndexes = Effect.fn("effa-cli.index-multi.monitorChildIndexes")(function* (watchPath) {
141
+ yield* Effect.logInfo(`Starting controller monitoring for: ${watchPath}`);
142
+ const watchStream = fs.watch(watchPath, { recursive: true });
146
143
  yield* watchStream
147
144
  .pipe(Stream.runForEach(Effect.fn("effa-cli.monitorChildIndexes.handleEvent")(function* (event) {
148
145
  const pathParts = event.path.split("/");
@@ -157,14 +154,12 @@ Effect
157
154
  .map((f) => [...pathParts.slice(0, pathParts.length - i), f].join("/"));
158
155
  const existingFiles = [];
159
156
  for (const file of candidateFiles) {
160
- const exists = yield* fileSystem.exists(file);
157
+ const exists = yield* fs.exists(file);
161
158
  if (exists)
162
159
  existingFiles.push(file);
163
160
  }
164
161
  if (existingFiles.length > 0) {
165
- if (debug) {
166
- yield* Effect.logInfo(`Controller change detected: ${event.path}, fixing files: ${existingFiles.join(", ")}`);
167
- }
162
+ yield* Effect.logInfo(`Controller change detected: ${event.path}, fixing files: ${existingFiles.join(", ")}`);
168
163
  const eslintArgs = existingFiles.map((f) => `"../${f}"`).join(" ");
169
164
  yield* runNodeCommand(`cd api && pnpm eslint --fix ${eslintArgs}`);
170
165
  break;
@@ -183,19 +178,14 @@ Effect
183
178
  * @param debug - Whether to enable debug logging
184
179
  * @returns An Effect that sets up root index monitoring
185
180
  */
186
- const monitorRootIndexes = Effect.fn("effa-cli.index-multi.monitorRootIndexes")(function* (watchPath, indexFile, debug) {
187
- const fileSystem = yield* FileSystem.FileSystem;
188
- if (debug) {
189
- yield* Effect.logInfo(`Starting root index monitoring for: ${watchPath} -> ${indexFile}`);
190
- }
191
- const watchStream = fileSystem.watch(watchPath);
181
+ const monitorRootIndexes = Effect.fn("effa-cli.index-multi.monitorRootIndexes")(function* (watchPath, indexFile) {
182
+ yield* Effect.logInfo(`Starting root index monitoring for: ${watchPath} -> ${indexFile}`);
183
+ const watchStream = fs.watch(watchPath);
192
184
  yield* watchStream
193
185
  .pipe(Stream.runForEach(Effect.fn("effa-cli.index-multi.monitorRootIndexes.handleEvent")(function* (event) {
194
186
  if (event.path.endsWith(indexFile))
195
187
  return;
196
- if (debug) {
197
- yield* Effect.logInfo(`Root change detected: ${event.path}, fixing: ${indexFile}`);
198
- }
188
+ yield* Effect.logInfo(`Root change detected: ${event.path}, fixing: ${indexFile}`);
199
189
  yield* runNodeCommand(`pnpm eslint --fix "${indexFile}"`);
200
190
  })))
201
191
  .pipe(Effect.andThen(Effect.addFinalizer(() => Effect.logInfo(`Stopped monitoring root indexes in: ${watchPath} -> ${indexFile}`))), Effect.forkScoped);
@@ -208,22 +198,17 @@ Effect
208
198
  * @param debug - Whether to enable debug logging
209
199
  * @returns An Effect that sets up all index monitoring for the path
210
200
  */
211
- const monitorIndexes = Effect.fn("effa-cli.index-multi.monitorIndexes")(function* (watchPath, debug) {
212
- const fileSystem = yield* FileSystem.FileSystem;
213
- if (debug) {
214
- yield* Effect.logInfo(`Setting up index monitoring for path: ${watchPath}`);
215
- }
201
+ const monitorIndexes = Effect.fn("effa-cli.index-multi.monitorIndexes")(function* (watchPath) {
202
+ yield* Effect.logInfo(`Setting up index monitoring for path: ${watchPath}`);
216
203
  const indexFile = watchPath + "/index.ts";
217
- const monitors = [monitorChildIndexes(watchPath, debug)];
218
- if (yield* fileSystem.exists(indexFile)) {
219
- monitors.push(monitorRootIndexes(watchPath, indexFile, debug));
204
+ const monitors = [monitorChildIndexes(watchPath)];
205
+ if (yield* fs.exists(indexFile)) {
206
+ monitors.push(monitorRootIndexes(watchPath, indexFile));
220
207
  }
221
208
  else {
222
209
  yield* Effect.logInfo(`Index file ${indexFile} does not exist`);
223
210
  }
224
- if (debug) {
225
- yield* Effect.logInfo(`Starting ${monitors.length} monitor(s) for ${watchPath}`);
226
- }
211
+ yield* Effect.logInfo(`Starting ${monitors.length} monitor(s) for ${watchPath}`);
227
212
  yield* Effect.all(monitors, { concurrency: monitors.length });
228
213
  });
229
214
  /**
@@ -232,19 +217,16 @@ Effect
232
217
  *
233
218
  * @returns An Effect that sets up file watching streams
234
219
  */
235
- const watcher = Effect.fn("watch")(function* (debug) {
236
- yield* Effect.log("Watch API resources and models for changes");
220
+ const watcher = Effect.fn("watch")(function* () {
221
+ yield* Effect.logInfo("Watch API resources and models for changes");
237
222
  const dirs = ["../api/src/resources", "../api/src/models"];
238
223
  const viteConfigFile = "./vite.config.ts";
239
- const fileSystem = yield* FileSystem.FileSystem;
240
- const viteConfigExists = yield* fileSystem.exists(viteConfigFile);
241
- if (debug) {
242
- yield* Effect.logInfo("watcher debug mode is enabled");
243
- }
224
+ const viteConfigExists = yield* fs.exists(viteConfigFile);
225
+ yield* Effect.logInfo("watcher debug mode is enabled");
244
226
  // validate directories and filter out non-existing ones
245
227
  const existingDirs = [];
246
228
  for (const dir of dirs) {
247
- const dirExists = yield* fileSystem.exists(dir);
229
+ const dirExists = yield* fs.exists(dir);
248
230
  if (dirExists) {
249
231
  existingDirs.push(dir);
250
232
  }
@@ -252,40 +234,29 @@ Effect
252
234
  yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`);
253
235
  }
254
236
  }
255
- if (existingDirs.length === 0) {
256
- return yield* Effect.logWarning("No directories to watch - exiting");
257
- }
258
237
  // start watching all existing directories concurrently
259
238
  const watchStreams = existingDirs.map((dir) => Effect.gen(function* () {
260
- if (debug) {
261
- yield* Effect.logInfo(`Starting to watch directory: ${dir}`);
262
- }
239
+ yield* Effect.logInfo(`Starting to watch directory: ${dir}`);
263
240
  const files = [];
264
- const watchStream = fileSystem.watch(dir, { recursive: true });
241
+ const watchStream = fs.watch(dir, { recursive: true });
265
242
  yield* watchStream
266
243
  .pipe(Stream.runForEach(Effect.fn("effa-cli.watch.handleEvent")(function* (event) {
267
- if (debug) {
268
- yield* Effect.logInfo(`File ${event._tag.toLowerCase()}: ${event.path}`);
269
- }
244
+ yield* Effect.logInfo(`File ${event._tag.toLowerCase()}: ${event.path}`);
270
245
  // touch tsconfig.json on any file change
271
246
  yield* touch("./tsconfig.json");
272
- if (debug) {
273
- yield* Effect.logInfo("Updated tsconfig.json");
274
- }
247
+ yield* Effect.logInfo("Updated tsconfig.json");
275
248
  // touch vite config only on file updates (not creates/deletes)
276
249
  if (viteConfigExists
277
250
  && event._tag === "Update"
278
251
  && !files.includes(event.path)) {
279
252
  yield* touch(viteConfigFile);
280
- if (debug) {
281
- yield* Effect.logInfo("Updated vite.config.ts");
282
- }
253
+ yield* Effect.logInfo("Updated vite.config.ts");
283
254
  files.push(event.path);
284
255
  }
285
256
  })))
286
257
  .pipe(Effect.andThen(Effect.addFinalizer(() => Effect.logInfo(`Stopped watching directory: ${dir}`))), Effect.forkScoped);
287
258
  // also start monitoring indexes in the watched directory
288
- yield* monitorIndexes(dir, debug);
259
+ yield* monitorIndexes(dir);
289
260
  }));
290
261
  // run all watch streams concurrently
291
262
  yield* Effect.all(watchStreams, { concurrency: existingDirs.length });
@@ -301,11 +272,11 @@ Effect
301
272
  * @returns An Effect that succeeds when the package.json is updated
302
273
  */
303
274
  const packagejsonUpdater = Effect.fn("effa-cli.packagejsonUpdater")(function* (startDir, p, levels = 0) {
304
- yield* Effect.log(`Generating exports for ${p}`);
275
+ yield* Effect.logInfo(`Generating exports for ${p}`);
305
276
  const exportMappings = yield* extractExportMappings(path.resolve(startDir, p));
306
277
  // if exportMappings is empty skip export generation
307
278
  if (exportMappings === "") {
308
- yield* Effect.log(`No src directory found for ${p}, skipping export generation`);
279
+ yield* Effect.logInfo(`No src directory found for ${p}, skipping export generation`);
309
280
  return;
310
281
  }
311
282
  const sortedExportEntries = JSON.parse(`{ ${exportMappings} }`);
@@ -336,12 +307,66 @@ Effect
336
307
  };
337
308
  const pkgJson = JSON.parse(yield* fs.readFileString(p + "/package.json", "utf-8"));
338
309
  pkgJson.exports = packageExports;
339
- yield* Effect.log(`Writing updated package.json for ${p}`);
310
+ yield* Effect.logInfo(`Writing updated package.json for ${p}`);
340
311
  return yield* fs.writeFileString(p + "/package.json", JSON.stringify(pkgJson, null, 2));
341
312
  });
313
+ /**
314
+ * Monitors a directory for TypeScript file changes and automatically updates package.json exports.
315
+ * Generates initial package.json exports, then watches the src directory for changes to regenerate exports.
316
+ *
317
+ * @param watchPath - The directory path containing the package.json and src to monitor
318
+ * @param levels - Optional depth limit for export filtering (0 = no limit)
319
+ * @returns An Effect that sets up package.json monitoring
320
+ */
321
+ const monitorPackageJson = Effect.fn("effa-cli.monitorPackageJson")(function* (startDir, watchPath, levels = 0) {
322
+ yield* packagejsonUpdater(startDir, watchPath, levels);
323
+ const srcPath = watchPath === "." ? "./src" : `${watchPath}/src`;
324
+ if (!(yield* fs.exists(srcPath))) {
325
+ yield* Effect.logWarning(`Source directory ${srcPath} does not exist - skipping monitoring`);
326
+ return;
327
+ }
328
+ const watchStream = fs.watch(srcPath, { recursive: true });
329
+ yield* watchStream.pipe(Stream.runForEach(Effect.fn("effa-cli.monitorPackageJson.handleEvent")(function* (_) {
330
+ yield* packagejsonUpdater(startDir, watchPath, levels);
331
+ })), Effect.andThen(Effect.addFinalizer(() => Effect.logInfo(`Stopped monitoring package.json for: ${watchPath}`))), Effect.forkScoped);
332
+ });
342
333
  /*
343
334
  * CLI
344
335
  */
336
+ const WrapAsOption = Options.text("wrap").pipe(Options.withAlias("w"), Options.optional, Options.withDescription("Wrap child bash command: the lifetime of the CLI command will be tied to the child process"));
337
+ // has prio over WrapAsOption
338
+ const WrapAsArg = Args
339
+ .text({
340
+ name: "wrap"
341
+ })
342
+ .pipe(Args.atLeast(1), Args.optional, Args.withDescription("Wrap child bash command: the lifetime of the CLI command will be tied to the child process"));
343
+ /**
344
+ * Creates a command that automatically includes wrap functionality for executing child bash commands.
345
+ * Combines both option-based (--wrap) and argument-based wrap parameters, giving priority to arguments.
346
+ * If a wrap command is provided, it will be executed **after** the main command handler.
347
+ *
348
+ * @param name - The command name
349
+ * @param config - The command configuration (options, args, etc.)
350
+ * @param handler - The main command handler function
351
+ * @param completionMessage - Optional message to log when the command completes
352
+ * @returns A Command with integrated wrap functionality
353
+ */
354
+ const makeCommandWithWrap = (name, config, handler, completionMessage) => Command.make(name, { ...config, wo: WrapAsOption, wa: WrapAsArg }, Effect.fn("effa-cli.withWrapHandler")(function* (_) {
355
+ const { wa, wo, ...cfg } = _;
356
+ if (completionMessage) {
357
+ yield* Effect.addFinalizer(() => Effect.logInfo(completionMessage));
358
+ }
359
+ const wrapOption = Option.orElse(wa, () => wo);
360
+ yield* handler(cfg);
361
+ if (Option.isSome(wrapOption)) {
362
+ const val = Array.isArray(wrapOption.value)
363
+ ? wrapOption.value.join(" ")
364
+ : wrapOption.value;
365
+ yield* Effect.logInfo(`Spawning child command: ${val}`);
366
+ yield* runNodeCommand(val);
367
+ }
368
+ return;
369
+ }, (_) => Effect.scoped(_)));
345
370
  const EffectAppLibsPath = Args
346
371
  .directory({
347
372
  exists: "yes",
@@ -360,7 +385,7 @@ Effect
360
385
  .pipe(Command.withDescription("Remove effect-app file resolutions and restore npm registry packages"));
361
386
  const ue = Command
362
387
  .make("ue", {}, Effect.fn("effa-cli.ue")(function* ({}) {
363
- yield* Effect.log("Update effect-app and/or effect packages");
388
+ yield* Effect.logInfo("Update effect-app and/or effect packages");
364
389
  const prompted = yield* Prompt.select({
365
390
  choices: [
366
391
  {
@@ -391,20 +416,16 @@ Effect
391
416
  }
392
417
  }))
393
418
  .pipe(Command.withDescription("Update effect-app and/or effect packages"));
394
- const DebugOption = Options.boolean("debug").pipe(Options.withAlias("d"), Options.withDescription("Enable debug logging"));
395
- const watch = Command
396
- .make("watch", { debug: DebugOption }, Effect.fn("effa-cli.watch")(function* ({ debug }) {
397
- return yield* watcher(debug);
398
- }))
419
+ const watch = makeCommandWithWrap("watch", {}, Effect.fn("effa-cli.watch")(function* ({}) {
420
+ return yield* watcher();
421
+ }), "Stopped watching API resources and models")
399
422
  .pipe(Command.withDescription("Watch API resources and models for changes and update tsconfig.json and vite.config.ts accordingly"));
400
- const indexMulti = Command
401
- .make("index-multi", { debug: DebugOption }, Effect.fn("effa-cli.index-multi")(function* ({ debug }) {
402
- yield* Effect.log("Starting multi-index monitoring");
423
+ const indexMulti = makeCommandWithWrap("index-multi", {}, Effect.fn("effa-cli.index-multi")(function* ({}) {
424
+ yield* Effect.logInfo("Starting multi-index monitoring");
403
425
  const dirs = ["./api/src"];
404
- const fileSystem = yield* FileSystem.FileSystem;
405
426
  const existingDirs = [];
406
427
  for (const dir of dirs) {
407
- const dirExists = yield* fileSystem.exists(dir);
428
+ const dirExists = yield* fs.exists(dir);
408
429
  if (dirExists) {
409
430
  existingDirs.push(dir);
410
431
  }
@@ -412,22 +433,17 @@ Effect
412
433
  yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`);
413
434
  }
414
435
  }
415
- if (existingDirs.length === 0) {
416
- return yield* Effect.logWarning("No directories to monitor - exiting");
417
- }
418
- const monitors = existingDirs.map((dir) => monitorIndexes(dir, debug));
436
+ const monitors = existingDirs.map((dir) => monitorIndexes(dir));
419
437
  yield* Effect.all(monitors, { concurrency: monitors.length });
420
- }))
438
+ }), "Stopped multi-index monitoring")
421
439
  .pipe(Command.withDescription("Monitor multiple directories for index and controller file changes"));
422
- const packagejson = Command
423
- .make("packagejson", {}, Effect.fn("effa-cli.packagejson")(function* ({}) {
440
+ const packagejson = makeCommandWithWrap("packagejson", {}, Effect.fn("effa-cli.packagejson")(function* ({}) {
424
441
  // https://nodejs.org/api/path.html#pathresolvepaths
425
442
  const startDir = path.resolve();
426
- return yield* packagejsonUpdater(startDir, ".");
427
- }))
443
+ return yield* monitorPackageJson(startDir, ".");
444
+ }), "Stopped monitoring root package.json exports")
428
445
  .pipe(Command.withDescription("Generate and update root-level package.json exports mappings for TypeScript modules"));
429
- const packagejsonPackages = Command
430
- .make("packagejson-packages", {}, Effect.fn("effa-cli.packagejson-packages")(function* ({}) {
446
+ const packagejsonPackages = makeCommandWithWrap("packagejson-packages", {}, Effect.fn("effa-cli.packagejson-packages")(function* ({}) {
431
447
  // https://nodejs.org/api/path.html#pathresolvepaths
432
448
  const startDir = path.resolve();
433
449
  const packagesDir = path.join(startDir, "packages");
@@ -450,18 +466,15 @@ Effect
450
466
  validPackages.push(packagePath);
451
467
  }
452
468
  }
453
- if (validPackages.length === 0) {
454
- return yield* Effect.logWarning("No valid packages found to update");
455
- }
456
- yield* Effect.log(`Found ${validPackages.length} packages to update`);
469
+ yield* Effect.logInfo(`Found ${validPackages.length} packages to update`);
457
470
  // update each package sequentially
458
- yield* Effect.all(validPackages.map((packagePath) => Effect.gen(function* () {
471
+ yield* Effect.all(validPackages.map(Effect.fnUntraced(function* (packagePath) {
459
472
  const relativePackagePath = path.relative(startDir, packagePath);
460
- yield* Effect.log(`Updating ${relativePackagePath}`);
461
- return yield* packagejsonUpdater(startDir, relativePackagePath);
473
+ yield* Effect.logInfo(`Updating ${relativePackagePath}`);
474
+ return yield* monitorPackageJson(startDir, relativePackagePath);
462
475
  })));
463
- yield* Effect.log("All packages updated successfully");
464
- }))
476
+ yield* Effect.logInfo("All packages updated successfully");
477
+ }), "Stopped monitoring package.json exports for all packages")
465
478
  .pipe(Command.withDescription("Generate and update package.json exports mappings for all packages in monorepo"));
466
479
  // configure CLI
467
480
  const cli = Command.run(Command
@@ -481,4 +494,4 @@ Effect
481
494
  return yield* cli(process.argv);
482
495
  })()
483
496
  .pipe(Effect.scoped, Effect.provide(NodeContext.layer), NodeRuntime.runMain);
484
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0RBQWtEO0FBQ2xELHFDQUFxQztBQUNyQyw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDM0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDakQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFdEMsTUFBTTtLQUNILEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDdkIsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQTtJQUN2QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFBO0lBQzdCLE1BQU0scUJBQXFCLEdBQUcsS0FBSyxDQUFDLENBQUMsNEJBQTRCLENBQUE7SUFFakUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQTtJQUU5RTs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFXLEVBQUUsR0FBWSxFQUFFLEVBQUUsQ0FDbkQsV0FBVztTQUNSLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQztTQUNyQixJQUFJLENBQ0gsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFDN0IsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFDbEQsV0FBVyxDQUFDLFFBQVEsQ0FDckIsQ0FBQTtJQUVMOzs7Ozs7O09BT0c7SUFDSCxzREFBc0Q7SUFDdEQsZ0JBQWdCO0lBQ2hCLHdCQUF3QjtJQUN4QixhQUFhO0lBQ2IsdUNBQXVDO0lBQ3ZDLHVDQUF1QztJQUN2Qyw0REFBNEQ7SUFDNUQsMkJBQTJCO0lBQzNCLFFBQVE7SUFFUjs7Ozs7O09BTUc7SUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQVk7UUFDckQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUV2QixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUNyQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ3JDLEdBQUcsQ0FBQyxNQUFNLEtBQUssVUFBVTtZQUN2QixDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzlCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ3hCLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGOzs7T0FHRztJQUNILE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN4RixNQUFNLE9BQU8sR0FBRyxDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQTtRQUMvQyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzdCLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyw4QkFBOEIsTUFBTSxHQUFHLENBQUMsQ0FBQTtZQUM5RCxLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsaUNBQWlDLE1BQU0sR0FBRyxDQUFDLENBQUE7UUFDbkUsQ0FBQztJQUNILENBQUMsQ0FBQyxFQUFFLENBQUE7SUFFSjs7OztPQUlHO0lBQ0gsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLGtDQUFrQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ2xGLE1BQU0sYUFBYSxHQUFHLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO1FBQy9ELEtBQUssTUFBTSxNQUFNLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbkMsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLDhCQUE4QixNQUFNLEdBQUcsQ0FBQyxDQUFBO1lBQzlELEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxpQ0FBaUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtRQUNuRSxDQUFDO0lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUVKOzs7Ozs7O09BT0c7SUFDSCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFDLGlCQUF5QjtRQUN4RSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7UUFFekQsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUE7UUFDeEMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQ3BFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUV6QyxNQUFNLFdBQVcsR0FBRztZQUNsQixHQUFHLEVBQUUsQ0FBQyxXQUFXO1lBQ2pCLGtDQUFrQyxFQUFFLE9BQU8sR0FBRyxpQkFBaUIsR0FBRyxnQ0FBZ0M7WUFDbEcsWUFBWSxFQUFFLE9BQU8sR0FBRyxpQkFBaUIsR0FBRyxzQkFBc0I7WUFDbEUsbUJBQW1CLEVBQUUsT0FBTyxHQUFHLGlCQUFpQixHQUFHLGlCQUFpQjtZQUNwRSxpQkFBaUIsRUFBRSxPQUFPLEdBQUcsaUJBQWlCLEdBQUcsZUFBZTtZQUNoRSw0QkFBNEIsRUFBRSxPQUFPLEdBQUcsaUJBQWlCLEdBQUcsMEJBQTBCO1lBQ3RGLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsaUJBQWlCLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1NBQ3JHLENBQUE7UUFFRCxFQUFFLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUU1QixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN2RSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGtEQUFrRCxDQUFDLENBQUE7UUFFckUsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRS9CLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLENBQUMsQ0FBQTtJQUN6RCxDQUFDLENBQUMsQ0FBQTtJQUVGOzs7Ozs7T0FNRztJQUNILE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQ2hELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtRQUUzRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQTtRQUN4QyxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDcEUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBRXpDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsV0FBcUMsQ0FBQyxDQUFDLE1BQU0sQ0FDekYsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNkLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssWUFBWSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sR0FBRyxDQUFBO1lBQzFGLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDVixPQUFPLEdBQUcsQ0FBQTtRQUNaLENBQUMsRUFDRCxFQUE0QixDQUM3QixDQUFBO1FBRUQsRUFBRSxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQTtRQUVwQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN2RSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHVEQUF1RCxDQUFDLENBQUE7UUFFMUUsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQy9CLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtJQUMzRCxDQUFDLENBQUMsRUFBRSxDQUFBO0lBRUo7Ozs7Ozs7T0FPRztJQUNILE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQywwQ0FBMEMsQ0FBQyxDQUMvRSxRQUFRLENBQUMsRUFBQyxTQUFpQixFQUFFLEtBQWM7UUFDekMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQTtRQUUvQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx1Q0FBdUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUMzRSxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUVwRSxLQUFLLENBQUMsQ0FBQyxXQUFXO2FBQ2YsSUFBSSxDQUNILE1BQU0sQ0FBQyxVQUFVLENBQ2YsTUFBTSxDQUFDLEVBQUUsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEtBQUs7WUFDbkUsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDdkMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDaEQsTUFBTSxZQUFZLEdBQUcsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUV0RSxJQUFJLENBQUMsWUFBWTtnQkFBRSxPQUFNO1lBRXpCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNULE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtZQUU1QyxPQUFPLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sY0FBYyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDO3FCQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO2dCQUV6RSxNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUE7Z0JBQ2xDLEtBQUssTUFBTSxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7b0JBQ2xDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQzdDLElBQUksTUFBTTt3QkFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUN0QyxDQUFDO2dCQUVELElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDN0IsSUFBSSxLQUFLLEVBQUUsQ0FBQzt3QkFDVixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNuQiwrQkFBK0IsS0FBSyxDQUFDLElBQUksbUJBQW1CLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDdkYsQ0FBQTtvQkFDSCxDQUFDO29CQUVELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7b0JBQ2xFLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQywrQkFBK0IsVUFBVSxFQUFFLENBQUMsQ0FBQTtvQkFDbEUsTUFBSztnQkFDUCxDQUFDO2dCQUNELENBQUMsRUFBRSxDQUFBO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUNILENBQ0Y7YUFDQSxJQUFJLENBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FDWixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsd0NBQXdDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FDL0YsRUFDRCxNQUFNLENBQUMsVUFBVSxDQUNsQixDQUFBO0lBQ0wsQ0FBQyxDQUNGLENBQUE7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUM3RSxRQUFRLENBQUMsRUFBQyxTQUFpQixFQUFFLFNBQWlCLEVBQUUsS0FBYztRQUM1RCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFBO1FBRS9DLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxTQUFTLE9BQU8sU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUMzRixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUUvQyxLQUFLLENBQUMsQ0FBQyxXQUFXO2FBQ2YsSUFBSSxDQUNILE1BQU0sQ0FBQyxVQUFVLENBQ2YsTUFBTSxDQUFDLEVBQUUsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEtBQUs7WUFDOUUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7Z0JBQUUsT0FBTTtZQUUxQyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMseUJBQXlCLEtBQUssQ0FBQyxJQUFJLGFBQWEsU0FBUyxFQUFFLENBQUMsQ0FBQTtZQUNwRixDQUFDO1lBRUQsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLHNCQUFzQixTQUFTLEdBQUcsQ0FBQyxDQUFBO1FBQzNELENBQUMsQ0FBQyxDQUNILENBQ0Y7YUFDQSxJQUFJLENBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FDWixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUN2QixNQUFNLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxTQUFTLE9BQU8sU0FBUyxFQUFFLENBQUMsQ0FDbkYsQ0FDRixFQUNELE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUE7SUFDTCxDQUFDLENBQ0YsQ0FBQTtJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLHFDQUFxQyxDQUFDLENBQ3JFLFFBQVEsQ0FBQyxFQUFDLFNBQWlCLEVBQUUsS0FBYztRQUN6QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFBO1FBRS9DLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHlDQUF5QyxTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBQzdFLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxTQUFTLEdBQUcsV0FBVyxDQUFBO1FBRXpDLE1BQU0sUUFBUSxHQUFHLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFFeEQsSUFBSSxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDaEUsQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsU0FBUyxpQkFBaUIsQ0FBQyxDQUFBO1FBQ2pFLENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLFFBQVEsQ0FBQyxNQUFNLG1CQUFtQixTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBQ2xGLENBQUM7UUFFRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUMvRCxDQUFDLENBQ0YsQ0FBQTtJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBQyxLQUFjO1FBQ3pELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQUMsQ0FBQTtRQUUvRCxNQUFNLElBQUksR0FBRyxDQUFDLHNCQUFzQixFQUFFLG1CQUFtQixDQUFDLENBQUE7UUFDMUQsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUE7UUFDekMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQTtRQUUvQyxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUE7UUFFakUsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsK0JBQStCLENBQUMsQ0FBQTtRQUN4RCxDQUFDO1FBRUQsd0RBQXdEO1FBQ3hELE1BQU0sWUFBWSxHQUFhLEVBQUUsQ0FBQTtRQUNqQyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDL0MsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsR0FBRyw0QkFBNEIsQ0FBQyxDQUFBO1lBQ3hFLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7UUFFRCx1REFBdUQ7UUFDdkQsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQzVDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ2xCLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsR0FBRyxFQUFFLENBQUMsQ0FBQTtZQUM5RCxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFBO1lBQzFCLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7WUFFOUQsS0FBSyxDQUFDLENBQUMsV0FBVztpQkFDZixJQUFJLENBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FDZixNQUFNLENBQUMsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsS0FBSztnQkFDckQsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDVixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtnQkFDMUUsQ0FBQztnQkFFRCx5Q0FBeUM7Z0JBQ3pDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO2dCQUMvQixJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNWLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtnQkFDaEQsQ0FBQztnQkFFRCwrREFBK0Q7Z0JBQy9ELElBQ0UsZ0JBQWdCO3VCQUNiLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUTt1QkFDdkIsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFDOUIsQ0FBQztvQkFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7b0JBQzVCLElBQUksS0FBSyxFQUFFLENBQUM7d0JBQ1YsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO29CQUNqRCxDQUFDO29CQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUN4QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FDRjtpQkFDQSxJQUFJLENBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FDWixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsK0JBQStCLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FDaEYsRUFDRCxNQUFNLENBQUMsVUFBVSxDQUNsQixDQUFBO1lBRUgseURBQXlEO1lBQ3pELEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDbkMsQ0FBQyxDQUFDLENBQ0gsQ0FBQTtRQUVELHFDQUFxQztRQUNyQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUN2RSxDQUFDLENBQUMsQ0FBQTtJQUVGOzs7Ozs7Ozs7T0FTRztJQUNILE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUNqRSxRQUFRLENBQUMsRUFBQyxRQUFnQixFQUFFLENBQVMsRUFBRSxNQUFNLEdBQUcsQ0FBQztRQUMvQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRWhELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFOUUsb0RBQW9EO1FBQ3BELElBQUksY0FBYyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsOEJBQThCLENBQUMsQ0FBQTtZQUNoRixPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDcEMsS0FBSyxjQUFjLElBQUksQ0FJeEIsQ0FBQTtRQUVELE1BQU0scUJBQXFCLEdBQUcsTUFBTTtZQUNsQyxDQUFDLENBQUMsTUFBTTtpQkFDTCxJQUFJLENBQUMsbUJBQW1CLENBQUM7Z0JBQzFCLHFGQUFxRjtpQkFDcEYsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQzdELE1BQU0sQ0FDTCxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFDN0QsRUFBNkIsQ0FDOUI7WUFDSCxDQUFDLENBQUMsbUJBQW1CLENBQUE7UUFFdkIsTUFBTSxjQUFjLEdBQUc7WUFDckIsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUM7bUJBQ3RDO29CQUNELEdBQUcsRUFBRTt3QkFDSCxPQUFPLEVBQUUsbUJBQW1CO3dCQUM1QixTQUFTLEVBQUUsaUJBQWlCO3FCQUM3QjtpQkFDRixDQUFDO1lBQ0osR0FBRyxNQUFNO2lCQUNOLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztpQkFDM0IsTUFBTSxDQUNMLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDZCxHQUFHLElBQUk7Z0JBQ1AsaUVBQWlFO2dCQUNqRSwrREFBK0Q7Z0JBQy9ELDZEQUE2RDtnQkFDN0QsR0FBRyxHQUFHLEtBQUssU0FBUyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUscUJBQXFCLENBQUMsR0FBRyxDQUFDLEVBQUU7YUFDN0YsQ0FBQyxFQUNGLEVBQTZCLENBQzlCO1NBQ0osQ0FBQTtRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDbEYsT0FBTyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUE7UUFFaEMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUUxRCxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQzlCLENBQUMsR0FBRyxlQUFlLEVBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FDakMsQ0FBQTtJQUNILENBQUMsQ0FDRixDQUFBO0lBRUQ7O09BRUc7SUFFSCxNQUFNLGlCQUFpQixHQUFHLElBQUk7U0FDM0IsU0FBUyxDQUFDO1FBQ1QsTUFBTSxFQUFFLEtBQUs7UUFDYixJQUFJLEVBQUUsc0JBQXNCO0tBQzdCLENBQUM7U0FDRCxJQUFJLENBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxFQUN6QyxJQUFJLENBQUMsZUFBZSxDQUFDLHVDQUF1QyxDQUFDLENBQzlELENBQUE7SUFFSCxNQUFNLElBQUksR0FBRyxPQUFPO1NBQ2pCLElBQUksQ0FDSCxNQUFNLEVBQ04sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxFQUN4QyxNQUFNLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEVBQUUsaUJBQWlCLEVBQUU7UUFDeEQsT0FBTyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUMvQyxDQUFDLENBQUMsQ0FDSDtTQUNBLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLHVEQUF1RCxDQUFDLENBQUMsQ0FBQTtJQUV6RixNQUFNLE1BQU0sR0FBRyxPQUFPO1NBQ25CLElBQUksQ0FDSCxRQUFRLEVBQ1IsRUFBRSxFQUNGLE1BQU0sQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBQyxFQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFBO0lBQzlCLENBQUMsQ0FBQyxDQUNIO1NBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsc0VBQXNFLENBQUMsQ0FBQyxDQUFBO0lBRXhHLE1BQU0sRUFBRSxHQUFHLE9BQU87U0FDZixJQUFJLENBQ0gsSUFBSSxFQUNKLEVBQUUsRUFDRixNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEVBQUU7UUFDbkMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFBO1FBRTdELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDcEMsT0FBTyxFQUFFO2dCQUNQO29CQUNFLEtBQUssRUFBRSxZQUFZO29CQUNuQixXQUFXLEVBQUUsaUNBQWlDO29CQUM5QyxLQUFLLEVBQUUsWUFBWTtpQkFDcEI7Z0JBQ0Q7b0JBQ0UsS0FBSyxFQUFFLFFBQVE7b0JBQ2YsV0FBVyxFQUFFLDZCQUE2QjtvQkFDMUMsS0FBSyxFQUFFLFFBQVE7aUJBQ2hCO2dCQUNEO29CQUNFLEtBQUssRUFBRSxNQUFNO29CQUNiLFdBQVcsRUFBRSw0Q0FBNEM7b0JBQ3pELEtBQUssRUFBRSxNQUFNO2lCQUNkO2FBQ0Y7WUFDRCxPQUFPLEVBQUUsa0JBQWtCO1NBQzVCLENBQUMsQ0FBQTtRQUVGLFFBQVEsUUFBUSxFQUFFLENBQUM7WUFDakIsS0FBSyxZQUFZO2dCQUNmLE9BQU8sS0FBSyxDQUFDLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUN4QyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUN6QyxDQUFBO1lBRUgsS0FBSyxRQUFRO2dCQUNYLE9BQU8sS0FBSyxDQUFDLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUNyQyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUN6QyxDQUFBO1lBQ0gsS0FBSyxNQUFNO2dCQUNULE9BQU8sS0FBSyxDQUFDLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUNyQyxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEVBQ3ZDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQ3pDLENBQUE7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQ0g7U0FDQSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLENBQUE7SUFFNUUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQy9DLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQ3RCLE9BQU8sQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsQ0FDaEQsQ0FBQTtJQUVELE1BQU0sS0FBSyxHQUFHLE9BQU87U0FDbEIsSUFBSSxDQUNILE9BQU8sRUFDUCxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFDdEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEVBQUUsS0FBSyxFQUFFO1FBQzdDLE9BQU8sS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzlCLENBQUMsQ0FBQyxDQUNIO1NBQ0EsSUFBSSxDQUNILE9BQU8sQ0FBQyxlQUFlLENBQ3JCLG9HQUFvRyxDQUNyRyxDQUNGLENBQUE7SUFFSCxNQUFNLFVBQVUsR0FBRyxPQUFPO1NBQ3ZCLElBQUksQ0FDSCxhQUFhLEVBQ2IsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQ3RCLE1BQU0sQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBQyxFQUFFLEtBQUssRUFBRTtRQUNuRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7UUFFcEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUMxQixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFBO1FBRS9DLE1BQU0sWUFBWSxHQUFhLEVBQUUsQ0FBQTtRQUNqQyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDL0MsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsR0FBRyw0QkFBNEIsQ0FBQyxDQUFBO1lBQ3hFLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO1FBQ3hFLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDdEUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFDL0QsQ0FBQyxDQUFDLENBQ0g7U0FDQSxJQUFJLENBQ0gsT0FBTyxDQUFDLGVBQWUsQ0FDckIsb0VBQW9FLENBQ3JFLENBQ0YsQ0FBQTtJQUVILE1BQU0sV0FBVyxHQUFHLE9BQU87U0FDeEIsSUFBSSxDQUNILGFBQWEsRUFDYixFQUFFLEVBQ0YsTUFBTSxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEVBQUU7UUFDNUMsb0RBQW9EO1FBQ3BELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUUvQixPQUFPLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUNqRCxDQUFDLENBQUMsQ0FDSDtTQUNBLElBQUksQ0FDSCxPQUFPLENBQUMsZUFBZSxDQUFDLHFGQUFxRixDQUFDLENBQy9HLENBQUE7SUFFSCxNQUFNLG1CQUFtQixHQUFHLE9BQU87U0FDaEMsSUFBSSxDQUNILHNCQUFzQixFQUN0QixFQUFFLEVBQ0YsTUFBTSxDQUFDLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEVBQUU7UUFDckQsb0RBQW9EO1FBQ3BELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUUvQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUVuRCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3BELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtRQUNoRSxDQUFDO1FBRUQsOEJBQThCO1FBQzlCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFeEQsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFBO1FBRWxDLDJEQUEyRDtRQUMzRCxLQUFLLE1BQU0sV0FBVyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ3ZELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFBO1lBQ2xGLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUVqRSxNQUFNLGFBQWEsR0FBRyxLQUFLO21CQUN0QixXQUFXLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO21CQUM1QyxXQUFXLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUE7WUFFM0MsSUFBSSxpQkFBaUIsSUFBSSxTQUFTLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDckQsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUNqQyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtRQUN0RSxDQUFDO1FBRUQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLGFBQWEsQ0FBQyxNQUFNLHFCQUFxQixDQUFDLENBQUE7UUFFckUsbUNBQW1DO1FBQ25DLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2YsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ2xCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDaEUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLG1CQUFtQixFQUFFLENBQUMsQ0FBQTtZQUNwRCxPQUFPLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO1FBQ2pFLENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQTtRQUVELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtJQUN4RCxDQUFDLENBQUMsQ0FDSDtTQUNBLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLGdGQUFnRixDQUFDLENBQUMsQ0FBQTtJQUVsSCxnQkFBZ0I7SUFDaEIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FDckIsT0FBTztTQUNKLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDWixJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztRQUM1QixFQUFFO1FBQ0YsSUFBSTtRQUNKLE1BQU07UUFDTixLQUFLO1FBQ0wsVUFBVTtRQUNWLFdBQVc7UUFDWCxtQkFBbUI7S0FDcEIsQ0FBQyxDQUFDLEVBQ0w7UUFDRSxJQUFJLEVBQUUsNkJBQTZCO1FBQ25DLE9BQU8sRUFBRSxRQUFRO0tBQ2xCLENBQ0YsQ0FBQTtJQUVELE9BQU8sS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUNqQyxDQUFDLENBQUMsRUFBRTtLQUNILElBQUksQ0FDSCxNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUNqQyxXQUFXLENBQUMsT0FBTyxDQUNwQixDQUFBIn0=
497
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0RBQWtEO0FBQ2xELHFDQUFxQztBQUNyQyw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDM0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUloRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFjLE1BQU0sUUFBUSxDQUFBO0FBQ3JFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRXRDLE1BQU07S0FDSCxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUE7SUFDdkMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQTtJQUM3QixNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxDQUFDLDRCQUE0QixDQUFBO0lBRWpFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUE7SUFFOUU7Ozs7Ozs7T0FPRztJQUNILE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBVyxFQUFFLEdBQVksRUFBRSxFQUFFLENBQ25ELFdBQVc7U0FDUixJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUM7U0FDckIsSUFBSSxDQUNILFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQzdCLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQ2xELFdBQVcsQ0FBQyxRQUFRLENBQ3JCLENBQUE7SUFFTDs7Ozs7OztPQU9HO0lBQ0gsc0RBQXNEO0lBQ3RELGdCQUFnQjtJQUNoQix3QkFBd0I7SUFDeEIsYUFBYTtJQUNiLHVDQUF1QztJQUN2Qyx1Q0FBdUM7SUFDdkMsNERBQTREO0lBQzVELDJCQUEyQjtJQUMzQixRQUFRO0lBRVI7Ozs7OztPQU1HO0lBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFZO1FBQ3JELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFFdkIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDckMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNyQyxHQUFHLENBQUMsTUFBTSxLQUFLLFVBQVU7WUFDdkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM5QixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUN4QixDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRjs7O09BR0c7SUFDSCxNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMscUNBQXFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDeEYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFDL0MsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QixLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsOEJBQThCLE1BQU0sR0FBRyxDQUFDLENBQUE7WUFDOUQsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLGlDQUFpQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBQ25FLENBQUM7SUFDSCxDQUFDLENBQUMsRUFBRSxDQUFBO0lBRUo7Ozs7T0FJRztJQUNILE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUNsRixNQUFNLGFBQWEsR0FBRyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUMvRCxLQUFLLE1BQU0sTUFBTSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ25DLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyw4QkFBOEIsTUFBTSxHQUFHLENBQUMsQ0FBQTtZQUM5RCxLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsaUNBQWlDLE1BQU0sR0FBRyxDQUFDLENBQUE7UUFDbkUsQ0FBQztJQUNILENBQUMsQ0FBQyxFQUFFLENBQUE7SUFFSjs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBQyxpQkFBeUI7UUFDeEUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO1FBRTdELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFBO1FBQ3hDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUNwRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFFekMsTUFBTSxXQUFXLEdBQUc7WUFDbEIsR0FBRyxFQUFFLENBQUMsV0FBVztZQUNqQixrQ0FBa0MsRUFBRSxPQUFPLEdBQUcsaUJBQWlCLEdBQUcsZ0NBQWdDO1lBQ2xHLFlBQVksRUFBRSxPQUFPLEdBQUcsaUJBQWlCLEdBQUcsc0JBQXNCO1lBQ2xFLG1CQUFtQixFQUFFLE9BQU8sR0FBRyxpQkFBaUIsR0FBRyxpQkFBaUI7WUFDcEUsaUJBQWlCLEVBQUUsT0FBTyxHQUFHLGlCQUFpQixHQUFHLGVBQWU7WUFDaEUsNEJBQTRCLEVBQUUsT0FBTyxHQUFHLGlCQUFpQixHQUFHLDBCQUEwQjtZQUN0RixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLGlCQUFpQixpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztTQUNyRyxDQUFBO1FBRUQsRUFBRSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUE7UUFFNUIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrREFBa0QsQ0FBQyxDQUFBO1FBRXpFLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUUvQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG9DQUFvQyxDQUFDLENBQUE7SUFDN0QsQ0FBQyxDQUFDLENBQUE7SUFFRjs7Ozs7O09BTUc7SUFDSCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNoRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLENBQUE7UUFFL0QsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUE7UUFDeEMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQ3BFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUV6QyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFdBQXFDLENBQUMsQ0FBQyxNQUFNLENBQ3pGLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDZCxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLFlBQVksSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFBRSxPQUFPLEdBQUcsQ0FBQTtZQUMxRixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ1YsT0FBTyxHQUFHLENBQUE7UUFDWixDQUFDLEVBQ0QsRUFBNEIsQ0FDN0IsQ0FBQTtRQUVELEVBQUUsQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUE7UUFFcEMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx1REFBdUQsQ0FBQyxDQUFBO1FBRTlFLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMvQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7SUFDL0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUVKOzs7Ozs7O09BT0c7SUFDSCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUMsQ0FDL0UsUUFBUSxDQUFDLEVBQUMsU0FBaUI7UUFDekIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx1Q0FBdUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUV6RSxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBRTVELEtBQUssQ0FBQyxDQUFDLFdBQVc7YUFDZixJQUFJLENBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FDZixNQUFNLENBQUMsRUFBRSxDQUFDLDBDQUEwQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsS0FBSztZQUNuRSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN2QyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUNoRCxNQUFNLFlBQVksR0FBRyxRQUFRLEVBQUUsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBRXRFLElBQUksQ0FBQyxZQUFZO2dCQUFFLE9BQU07WUFFekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ1QsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFBO1lBRTVDLE9BQU8sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUM7cUJBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7Z0JBRXpFLE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQTtnQkFDbEMsS0FBSyxNQUFNLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztvQkFDbEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDckMsSUFBSSxNQUFNO3dCQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ3RDLENBQUM7Z0JBRUQsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUM3QixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNuQiwrQkFBK0IsS0FBSyxDQUFDLElBQUksbUJBQW1CLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDdkYsQ0FBQTtvQkFFRCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUNsRSxLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsK0JBQStCLFVBQVUsRUFBRSxDQUFDLENBQUE7b0JBQ2xFLE1BQUs7Z0JBQ1AsQ0FBQztnQkFDRCxDQUFDLEVBQUUsQ0FBQTtZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUNGO2FBQ0EsSUFBSSxDQUNILE1BQU0sQ0FBQyxPQUFPLENBQ1osTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQy9GLEVBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQTtJQUNMLENBQUMsQ0FDRixDQUFBO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMseUNBQXlDLENBQUMsQ0FDN0UsUUFBUSxDQUFDLEVBQUMsU0FBaUIsRUFBRSxTQUFpQjtRQUM1QyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxTQUFTLE9BQU8sU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUV6RixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRXZDLEtBQUssQ0FBQyxDQUFDLFdBQVc7YUFDZixJQUFJLENBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FDZixNQUFNLENBQUMsRUFBRSxDQUFDLHFEQUFxRCxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsS0FBSztZQUM5RSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztnQkFBRSxPQUFNO1lBRTFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMseUJBQXlCLEtBQUssQ0FBQyxJQUFJLGFBQWEsU0FBUyxFQUFFLENBQUMsQ0FBQTtZQUVsRixLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsc0JBQXNCLFNBQVMsR0FBRyxDQUFDLENBQUE7UUFDM0QsQ0FBQyxDQUFDLENBQ0gsQ0FDRjthQUNBLElBQUksQ0FDSCxNQUFNLENBQUMsT0FBTyxDQUNaLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsdUNBQXVDLFNBQVMsT0FBTyxTQUFTLEVBQUUsQ0FBQyxDQUNuRixDQUNGLEVBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQTtJQUNMLENBQUMsQ0FDRixDQUFBO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMscUNBQXFDLENBQUMsQ0FDckUsUUFBUSxDQUFDLEVBQUMsU0FBaUI7UUFDekIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx5Q0FBeUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUUzRSxNQUFNLFNBQVMsR0FBRyxTQUFTLEdBQUcsV0FBVyxDQUFBO1FBRXpDLE1BQU0sUUFBUSxHQUFHLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtRQUVqRCxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxRQUFRLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO1FBQ3pELENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLFNBQVMsaUJBQWlCLENBQUMsQ0FBQTtRQUNqRSxDQUFDO1FBRUQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLFFBQVEsQ0FBQyxNQUFNLG1CQUFtQixTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBRWhGLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQy9ELENBQUMsQ0FDRixDQUFBO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUMxQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLDRDQUE0QyxDQUFDLENBQUE7UUFFbkUsTUFBTSxJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO1FBQzFELE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFBO1FBRXpDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUV6RCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLENBQUE7UUFFdEQsd0RBQXdEO1FBQ3hELE1BQU0sWUFBWSxHQUFhLEVBQUUsQ0FBQTtRQUNqQyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDdkMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsR0FBRyw0QkFBNEIsQ0FBQyxDQUFBO1lBQ3hFLENBQUM7UUFDSCxDQUFDO1FBRUQsdURBQXVEO1FBQ3ZELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUM1QyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUNsQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO1lBRTVELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQTtZQUMxQixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1lBRXRELEtBQUssQ0FBQyxDQUFDLFdBQVc7aUJBQ2YsSUFBSSxDQUNILE1BQU0sQ0FBQyxVQUFVLENBQ2YsTUFBTSxDQUFDLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEtBQUs7Z0JBQ3JELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO2dCQUV4RSx5Q0FBeUM7Z0JBQ3pDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO2dCQUUvQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUE7Z0JBRTlDLCtEQUErRDtnQkFDL0QsSUFDRSxnQkFBZ0I7dUJBQ2IsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO3VCQUN2QixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUM5QixDQUFDO29CQUNELEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtvQkFFNUIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO29CQUUvQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDeEIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUNILENBQ0Y7aUJBQ0EsSUFBSSxDQUNILE1BQU0sQ0FBQyxPQUFPLENBQ1osTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLCtCQUErQixHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQ2hGLEVBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQTtZQUVILHlEQUF5RDtZQUN6RCxLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDNUIsQ0FBQyxDQUFDLENBQ0gsQ0FBQTtRQUVELHFDQUFxQztRQUNyQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUN2RSxDQUFDLENBQUMsQ0FBQTtJQUVGOzs7Ozs7Ozs7T0FTRztJQUNILE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUNqRSxRQUFRLENBQUMsRUFBQyxRQUFnQixFQUFFLENBQVMsRUFBRSxNQUFNLEdBQUcsQ0FBQztRQUMvQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRXBELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFOUUsb0RBQW9EO1FBQ3BELElBQUksY0FBYyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsOEJBQThCLENBQUMsQ0FBQTtZQUNwRixPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDcEMsS0FBSyxjQUFjLElBQUksQ0FJeEIsQ0FBQTtRQUVELE1BQU0scUJBQXFCLEdBQUcsTUFBTTtZQUNsQyxDQUFDLENBQUMsTUFBTTtpQkFDTCxJQUFJLENBQUMsbUJBQW1CLENBQUM7Z0JBQzFCLHFGQUFxRjtpQkFDcEYsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQzdELE1BQU0sQ0FDTCxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFDN0QsRUFBNkIsQ0FDOUI7WUFDSCxDQUFDLENBQUMsbUJBQW1CLENBQUE7UUFFdkIsTUFBTSxjQUFjLEdBQUc7WUFDckIsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUM7bUJBQ3RDO29CQUNELEdBQUcsRUFBRTt3QkFDSCxPQUFPLEVBQUUsbUJBQW1CO3dCQUM1QixTQUFTLEVBQUUsaUJBQWlCO3FCQUM3QjtpQkFDRixDQUFDO1lBQ0osR0FBRyxNQUFNO2lCQUNOLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztpQkFDM0IsTUFBTSxDQUNMLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDZCxHQUFHLElBQUk7Z0JBQ1AsaUVBQWlFO2dCQUNqRSwrREFBK0Q7Z0JBQy9ELDZEQUE2RDtnQkFDN0QsR0FBRyxHQUFHLEtBQUssU0FBUyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUscUJBQXFCLENBQUMsR0FBRyxDQUFDLEVBQUU7YUFDN0YsQ0FBQyxFQUNGLEVBQTZCLENBQzlCO1NBQ0osQ0FBQTtRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDbEYsT0FBTyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUE7UUFFaEMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUU5RCxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQzlCLENBQUMsR0FBRyxlQUFlLEVBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FDakMsQ0FBQTtJQUNILENBQUMsQ0FDRixDQUFBO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUNqRSxRQUFRLENBQUMsRUFBQyxRQUFnQixFQUFFLFNBQWlCLEVBQUUsTUFBTSxHQUFHLENBQUM7UUFDdkQsS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUV0RCxNQUFNLE9BQU8sR0FBRyxTQUFTLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxNQUFNLENBQUE7UUFFaEUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsT0FBTyx1Q0FBdUMsQ0FBQyxDQUFBO1lBQzVGLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUUxRCxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUNyQixNQUFNLENBQUMsVUFBVSxDQUNmLE1BQU0sQ0FBQyxFQUFFLENBQUMseUNBQXlDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBQyxDQUFDO1lBQzlELEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDeEQsQ0FBQyxDQUFDLENBQ0gsRUFDRCxNQUFNLENBQUMsT0FBTyxDQUNaLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUMvRixFQUNELE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUE7SUFDSCxDQUFDLENBQ0YsQ0FBQTtJQUVEOztPQUVHO0lBRUgsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQzVDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQ3RCLE9BQU8sQ0FBQyxRQUFRLEVBQ2hCLE9BQU8sQ0FBQyxlQUFlLENBQ3JCLDRGQUE0RixDQUM3RixDQUNGLENBQUE7SUFFRCw2QkFBNkI7SUFDN0IsTUFBTSxTQUFTLEdBQUcsSUFBSTtTQUNuQixJQUFJLENBQUM7UUFDSixJQUFJLEVBQUUsTUFBTTtLQUNiLENBQUM7U0FDRCxJQUFJLENBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFDZixJQUFJLENBQUMsUUFBUSxFQUNiLElBQUksQ0FBQyxlQUFlLENBQ2xCLDRGQUE0RixDQUM3RixDQUNGLENBQUE7SUFFSDs7Ozs7Ozs7OztPQVVHO0lBQ0gsTUFBTSxtQkFBbUIsR0FBRyxDQUMxQixJQUFVLEVBQ1YsTUFBYyxFQUNkLE9BQThGLEVBQzlGLGlCQUEwQixFQU0xQixFQUFFLENBQ0YsT0FBTyxDQUFDLElBQUksQ0FDVixJQUFJLEVBQ0osRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFDOUMsTUFBTSxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUM7UUFDL0MsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUc0QixDQUFBO1FBRXZELElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFBO1FBQ3JFLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUU5QyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBVSxDQUFDLENBQUE7UUFFMUIsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO2dCQUN6QyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUM1QixDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQTtZQUVwQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLDJCQUEyQixHQUFHLEVBQUUsQ0FBQyxDQUFBO1lBQ3ZELEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM1QixDQUFDO1FBRUQsT0FBTTtJQUNSLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUM1QixDQUFBO0lBRUgsTUFBTSxpQkFBaUIsR0FBRyxJQUFJO1NBQzNCLFNBQVMsQ0FBQztRQUNULE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLHNCQUFzQjtLQUM3QixDQUFDO1NBQ0QsSUFBSSxDQUNILElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsRUFDekMsSUFBSSxDQUFDLGVBQWUsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUM5RCxDQUFBO0lBRUgsTUFBTSxJQUFJLEdBQUcsT0FBTztTQUNqQixJQUFJLENBQ0gsTUFBTSxFQUNOLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsRUFDeEMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBQyxFQUFFLGlCQUFpQixFQUFFO1FBQ3hELE9BQU8sS0FBSyxDQUFDLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUE7SUFDL0MsQ0FBQyxDQUFDLENBQ0g7U0FDQSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDLENBQUE7SUFFekYsTUFBTSxNQUFNLEdBQUcsT0FBTztTQUNuQixJQUFJLENBQ0gsUUFBUSxFQUNSLEVBQUUsRUFDRixNQUFNLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsRUFBRTtRQUN2QyxPQUFPLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQTtJQUM5QixDQUFDLENBQUMsQ0FDSDtTQUNBLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLHNFQUFzRSxDQUFDLENBQUMsQ0FBQTtJQUV4RyxNQUFNLEVBQUUsR0FBRyxPQUFPO1NBQ2YsSUFBSSxDQUNILElBQUksRUFDSixFQUFFLEVBQ0YsTUFBTSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBQyxFQUFFO1FBQ25DLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsMENBQTBDLENBQUMsQ0FBQTtRQUVqRSxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3BDLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxLQUFLLEVBQUUsWUFBWTtvQkFDbkIsV0FBVyxFQUFFLGlDQUFpQztvQkFDOUMsS0FBSyxFQUFFLFlBQVk7aUJBQ3BCO2dCQUNEO29CQUNFLEtBQUssRUFBRSxRQUFRO29CQUNmLFdBQVcsRUFBRSw2QkFBNkI7b0JBQzFDLEtBQUssRUFBRSxRQUFRO2lCQUNoQjtnQkFDRDtvQkFDRSxLQUFLLEVBQUUsTUFBTTtvQkFDYixXQUFXLEVBQUUsNENBQTRDO29CQUN6RCxLQUFLLEVBQUUsTUFBTTtpQkFDZDthQUNGO1lBQ0QsT0FBTyxFQUFFLGtCQUFrQjtTQUM1QixDQUFDLENBQUE7UUFFRixRQUFRLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLEtBQUssWUFBWTtnQkFDZixPQUFPLEtBQUssQ0FBQyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FDeEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FDekMsQ0FBQTtZQUVILEtBQUssUUFBUTtnQkFDWCxPQUFPLEtBQUssQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FDckMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FDekMsQ0FBQTtZQUNILEtBQUssTUFBTTtnQkFDVCxPQUFPLEtBQUssQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FDckMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxFQUN2QyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUN6QyxDQUFBO1FBQ0wsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUNIO1NBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsMENBQTBDLENBQUMsQ0FBQyxDQUFBO0lBRTVFLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUMvQixPQUFPLEVBQ1AsRUFBRSxFQUNGLE1BQU0sQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBQyxFQUFFO1FBQ3RDLE9BQU8sS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDekIsQ0FBQyxDQUFDLEVBQ0YsMkNBQTJDLENBQzVDO1NBQ0UsSUFBSSxDQUNILE9BQU8sQ0FBQyxlQUFlLENBQ3JCLG9HQUFvRyxDQUNyRyxDQUNGLENBQUE7SUFFSCxNQUFNLFVBQVUsR0FBRyxtQkFBbUIsQ0FDcEMsYUFBYSxFQUNiLEVBQUUsRUFDRixNQUFNLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsRUFBRTtRQUM1QyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7UUFFeEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUUxQixNQUFNLFlBQVksR0FBYSxFQUFFLENBQUE7UUFDakMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3ZDLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN4QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsNEJBQTRCLENBQUMsQ0FBQTtZQUN4RSxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQy9ELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQy9ELENBQUMsQ0FBQyxFQUNGLGdDQUFnQyxDQUNqQztTQUNFLElBQUksQ0FDSCxPQUFPLENBQUMsZUFBZSxDQUNyQixvRUFBb0UsQ0FDckUsQ0FDRixDQUFBO0lBRUgsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLENBQ3JDLGFBQWEsRUFDYixFQUFFLEVBQ0YsTUFBTSxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEVBQUU7UUFDNUMsb0RBQW9EO1FBQ3BELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUUvQixPQUFPLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUNqRCxDQUFDLENBQUMsRUFDRiw4Q0FBOEMsQ0FDL0M7U0FDRSxJQUFJLENBQ0gsT0FBTyxDQUFDLGVBQWUsQ0FBQyxxRkFBcUYsQ0FBQyxDQUMvRyxDQUFBO0lBRUgsTUFBTSxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FDN0Msc0JBQXNCLEVBQ3RCLEVBQUUsRUFDRixNQUFNLENBQUMsRUFBRSxDQUFDLCtCQUErQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsRUFBRTtRQUNyRCxvREFBb0Q7UUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRS9CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBRW5ELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDcEQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO1FBQ2hFLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUV4RCxNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUE7UUFFbEMsMkRBQTJEO1FBQzNELEtBQUssTUFBTSxXQUFXLElBQUksV0FBVyxFQUFFLENBQUM7WUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUE7WUFDbEYsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBRWpFLE1BQU0sYUFBYSxHQUFHLEtBQUs7bUJBQ3RCLFdBQVcsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUM7bUJBQzVDLFdBQVcsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtZQUUzQyxJQUFJLGlCQUFpQixJQUFJLFNBQVMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyRCxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ2pDLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLGFBQWEsQ0FBQyxNQUFNLHFCQUFxQixDQUFDLENBQUE7UUFFekUsbUNBQW1DO1FBQ25DLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2YsYUFBYSxDQUFDLEdBQUcsQ0FDZixNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFDLFdBQVc7WUFDckMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUNoRSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksbUJBQW1CLEVBQUUsQ0FBQyxDQUFBO1lBQ3hELE9BQU8sS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUE7UUFDakUsQ0FBQyxDQUFDLENBQ0gsQ0FDRixDQUFBO1FBRUQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO0lBQzVELENBQUMsQ0FBQyxFQUNGLDBEQUEwRCxDQUMzRDtTQUNFLElBQUksQ0FDSCxPQUFPLENBQUMsZUFBZSxDQUFDLGdGQUFnRixDQUFDLENBQzFHLENBQUE7SUFFSCxnQkFBZ0I7SUFDaEIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FDckIsT0FBTztTQUNKLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDWixJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztRQUM1QixFQUFFO1FBQ0YsSUFBSTtRQUNKLE1BQU07UUFDTixLQUFLO1FBQ0wsVUFBVTtRQUNWLFdBQVc7UUFDWCxtQkFBbUI7S0FDcEIsQ0FBQyxDQUFDLEVBQ0w7UUFDRSxJQUFJLEVBQUUsNkJBQTZCO1FBQ25DLE9BQU8sRUFBRSxRQUFRO0tBQ2xCLENBQ0YsQ0FBQTtJQUVELE9BQU8sS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUNqQyxDQUFDLENBQUMsRUFBRTtLQUNILElBQUksQ0FDSCxNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUNqQyxXQUFXLENBQUMsT0FBTyxDQUNwQixDQUFBIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-app/cli",
3
- "version": "1.23.4",
3
+ "version": "1.23.5",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "bin": {
package/src/index.ts CHANGED
@@ -4,7 +4,10 @@
4
4
  import { Args, Command, Options, Prompt } from "@effect/cli"
5
5
  import { Command as NodeCommand, FileSystem, Path } from "@effect/platform"
6
6
  import { NodeContext, NodeRuntime } from "@effect/platform-node"
7
- import { Effect, identity, Stream } from "effect"
7
+
8
+ import { type CommandExecutor } from "@effect/platform/CommandExecutor"
9
+ import { type PlatformError } from "@effect/platform/Error"
10
+ import { Effect, identity, Option, Stream, type Types } from "effect"
8
11
  import { ExtractExportMappingsService } from "./extract.js"
9
12
  import { packages } from "./shared.js"
10
13
 
@@ -104,7 +107,7 @@ Effect
104
107
  * @returns An Effect that succeeds when linking is complete
105
108
  */
106
109
  const linkPackages = Effect.fnUntraced(function*(effectAppLibsPath: string) {
107
- yield* Effect.log("Linking local effect-app packages...")
110
+ yield* Effect.logInfo("Linking local effect-app packages...")
108
111
 
109
112
  const packageJsonPath = "./package.json"
110
113
  const packageJsonContent = yield* fs.readFileString(packageJsonPath)
@@ -123,11 +126,11 @@ Effect
123
126
  pj.resolutions = resolutions
124
127
 
125
128
  yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2))
126
- yield* Effect.log("Updated package.json with local file resolutions")
129
+ yield* Effect.logInfo("Updated package.json with local file resolutions")
127
130
 
128
131
  yield* runNodeCommand("pnpm i")
129
132
 
130
- yield* Effect.log("Successfully linked local packages")
133
+ yield* Effect.logInfo("Successfully linked local packages")
131
134
  })
132
135
 
133
136
  /**
@@ -138,7 +141,7 @@ Effect
138
141
  * @returns An Effect that succeeds when unlinking is complete
139
142
  */
140
143
  const unlinkPackages = Effect.fnUntraced(function*() {
141
- yield* Effect.log("Unlinking local effect-app packages...")
144
+ yield* Effect.logInfo("Unlinking local effect-app packages...")
142
145
 
143
146
  const packageJsonPath = "./package.json"
144
147
  const packageJsonContent = yield* fs.readFileString(packageJsonPath)
@@ -156,10 +159,10 @@ Effect
156
159
  pj.resolutions = filteredResolutions
157
160
 
158
161
  yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2))
159
- yield* Effect.log("Removed effect-app file resolutions from package.json")
162
+ yield* Effect.logInfo("Removed effect-app file resolutions from package.json")
160
163
 
161
164
  yield* runNodeCommand("pnpm i")
162
- yield* Effect.log("Successfully unlinked local packages")
165
+ yield* Effect.logInfo("Successfully unlinked local packages")
163
166
  })()
164
167
 
165
168
  /**
@@ -171,14 +174,10 @@ Effect
171
174
  * @returns An Effect that sets up controller file monitoring
172
175
  */
173
176
  const monitorChildIndexes = Effect.fn("effa-cli.index-multi.monitorChildIndexes")(
174
- function*(watchPath: string, debug: boolean) {
175
- const fileSystem = yield* FileSystem.FileSystem
176
-
177
- if (debug) {
178
- yield* Effect.logInfo(`Starting controller monitoring for: ${watchPath}`)
179
- }
177
+ function*(watchPath: string) {
178
+ yield* Effect.logInfo(`Starting controller monitoring for: ${watchPath}`)
180
179
 
181
- const watchStream = fileSystem.watch(watchPath, { recursive: true })
180
+ const watchStream = fs.watch(watchPath, { recursive: true })
182
181
 
183
182
  yield* watchStream
184
183
  .pipe(
@@ -199,16 +198,14 @@ Effect
199
198
 
200
199
  const existingFiles: string[] = []
201
200
  for (const file of candidateFiles) {
202
- const exists = yield* fileSystem.exists(file)
201
+ const exists = yield* fs.exists(file)
203
202
  if (exists) existingFiles.push(file)
204
203
  }
205
204
 
206
205
  if (existingFiles.length > 0) {
207
- if (debug) {
208
- yield* Effect.logInfo(
209
- `Controller change detected: ${event.path}, fixing files: ${existingFiles.join(", ")}`
210
- )
211
- }
206
+ yield* Effect.logInfo(
207
+ `Controller change detected: ${event.path}, fixing files: ${existingFiles.join(", ")}`
208
+ )
212
209
 
213
210
  const eslintArgs = existingFiles.map((f) => `"../${f}"`).join(" ")
214
211
  yield* runNodeCommand(`cd api && pnpm eslint --fix ${eslintArgs}`)
@@ -238,14 +235,10 @@ Effect
238
235
  * @returns An Effect that sets up root index monitoring
239
236
  */
240
237
  const monitorRootIndexes = Effect.fn("effa-cli.index-multi.monitorRootIndexes")(
241
- function*(watchPath: string, indexFile: string, debug: boolean) {
242
- const fileSystem = yield* FileSystem.FileSystem
238
+ function*(watchPath: string, indexFile: string) {
239
+ yield* Effect.logInfo(`Starting root index monitoring for: ${watchPath} -> ${indexFile}`)
243
240
 
244
- if (debug) {
245
- yield* Effect.logInfo(`Starting root index monitoring for: ${watchPath} -> ${indexFile}`)
246
- }
247
-
248
- const watchStream = fileSystem.watch(watchPath)
241
+ const watchStream = fs.watch(watchPath)
249
242
 
250
243
  yield* watchStream
251
244
  .pipe(
@@ -253,9 +246,7 @@ Effect
253
246
  Effect.fn("effa-cli.index-multi.monitorRootIndexes.handleEvent")(function*(event) {
254
247
  if (event.path.endsWith(indexFile)) return
255
248
 
256
- if (debug) {
257
- yield* Effect.logInfo(`Root change detected: ${event.path}, fixing: ${indexFile}`)
258
- }
249
+ yield* Effect.logInfo(`Root change detected: ${event.path}, fixing: ${indexFile}`)
259
250
 
260
251
  yield* runNodeCommand(`pnpm eslint --fix "${indexFile}"`)
261
252
  })
@@ -281,26 +272,20 @@ Effect
281
272
  * @returns An Effect that sets up all index monitoring for the path
282
273
  */
283
274
  const monitorIndexes = Effect.fn("effa-cli.index-multi.monitorIndexes")(
284
- function*(watchPath: string, debug: boolean) {
285
- const fileSystem = yield* FileSystem.FileSystem
286
-
287
- if (debug) {
288
- yield* Effect.logInfo(`Setting up index monitoring for path: ${watchPath}`)
289
- }
275
+ function*(watchPath: string) {
276
+ yield* Effect.logInfo(`Setting up index monitoring for path: ${watchPath}`)
290
277
 
291
278
  const indexFile = watchPath + "/index.ts"
292
279
 
293
- const monitors = [monitorChildIndexes(watchPath, debug)]
280
+ const monitors = [monitorChildIndexes(watchPath)]
294
281
 
295
- if (yield* fileSystem.exists(indexFile)) {
296
- monitors.push(monitorRootIndexes(watchPath, indexFile, debug))
282
+ if (yield* fs.exists(indexFile)) {
283
+ monitors.push(monitorRootIndexes(watchPath, indexFile))
297
284
  } else {
298
285
  yield* Effect.logInfo(`Index file ${indexFile} does not exist`)
299
286
  }
300
287
 
301
- if (debug) {
302
- yield* Effect.logInfo(`Starting ${monitors.length} monitor(s) for ${watchPath}`)
303
- }
288
+ yield* Effect.logInfo(`Starting ${monitors.length} monitor(s) for ${watchPath}`)
304
289
 
305
290
  yield* Effect.all(monitors, { concurrency: monitors.length })
306
291
  }
@@ -312,23 +297,20 @@ Effect
312
297
  *
313
298
  * @returns An Effect that sets up file watching streams
314
299
  */
315
- const watcher = Effect.fn("watch")(function*(debug: boolean) {
316
- yield* Effect.log("Watch API resources and models for changes")
300
+ const watcher = Effect.fn("watch")(function*() {
301
+ yield* Effect.logInfo("Watch API resources and models for changes")
317
302
 
318
303
  const dirs = ["../api/src/resources", "../api/src/models"]
319
304
  const viteConfigFile = "./vite.config.ts"
320
- const fileSystem = yield* FileSystem.FileSystem
321
305
 
322
- const viteConfigExists = yield* fileSystem.exists(viteConfigFile)
306
+ const viteConfigExists = yield* fs.exists(viteConfigFile)
323
307
 
324
- if (debug) {
325
- yield* Effect.logInfo("watcher debug mode is enabled")
326
- }
308
+ yield* Effect.logInfo("watcher debug mode is enabled")
327
309
 
328
310
  // validate directories and filter out non-existing ones
329
311
  const existingDirs: string[] = []
330
312
  for (const dir of dirs) {
331
- const dirExists = yield* fileSystem.exists(dir)
313
+ const dirExists = yield* fs.exists(dir)
332
314
  if (dirExists) {
333
315
  existingDirs.push(dir)
334
316
  } else {
@@ -336,33 +318,24 @@ Effect
336
318
  }
337
319
  }
338
320
 
339
- if (existingDirs.length === 0) {
340
- return yield* Effect.logWarning("No directories to watch - exiting")
341
- }
342
-
343
321
  // start watching all existing directories concurrently
344
322
  const watchStreams = existingDirs.map((dir) =>
345
323
  Effect.gen(function*() {
346
- if (debug) {
347
- yield* Effect.logInfo(`Starting to watch directory: ${dir}`)
348
- }
324
+ yield* Effect.logInfo(`Starting to watch directory: ${dir}`)
349
325
 
350
326
  const files: string[] = []
351
- const watchStream = fileSystem.watch(dir, { recursive: true })
327
+ const watchStream = fs.watch(dir, { recursive: true })
352
328
 
353
329
  yield* watchStream
354
330
  .pipe(
355
331
  Stream.runForEach(
356
332
  Effect.fn("effa-cli.watch.handleEvent")(function*(event) {
357
- if (debug) {
358
- yield* Effect.logInfo(`File ${event._tag.toLowerCase()}: ${event.path}`)
359
- }
333
+ yield* Effect.logInfo(`File ${event._tag.toLowerCase()}: ${event.path}`)
360
334
 
361
335
  // touch tsconfig.json on any file change
362
336
  yield* touch("./tsconfig.json")
363
- if (debug) {
364
- yield* Effect.logInfo("Updated tsconfig.json")
365
- }
337
+
338
+ yield* Effect.logInfo("Updated tsconfig.json")
366
339
 
367
340
  // touch vite config only on file updates (not creates/deletes)
368
341
  if (
@@ -371,9 +344,9 @@ Effect
371
344
  && !files.includes(event.path)
372
345
  ) {
373
346
  yield* touch(viteConfigFile)
374
- if (debug) {
375
- yield* Effect.logInfo("Updated vite.config.ts")
376
- }
347
+
348
+ yield* Effect.logInfo("Updated vite.config.ts")
349
+
377
350
  files.push(event.path)
378
351
  }
379
352
  })
@@ -387,7 +360,7 @@ Effect
387
360
  )
388
361
 
389
362
  // also start monitoring indexes in the watched directory
390
- yield* monitorIndexes(dir, debug)
363
+ yield* monitorIndexes(dir)
391
364
  })
392
365
  )
393
366
 
@@ -407,13 +380,13 @@ Effect
407
380
  */
408
381
  const packagejsonUpdater = Effect.fn("effa-cli.packagejsonUpdater")(
409
382
  function*(startDir: string, p: string, levels = 0) {
410
- yield* Effect.log(`Generating exports for ${p}`)
383
+ yield* Effect.logInfo(`Generating exports for ${p}`)
411
384
 
412
385
  const exportMappings = yield* extractExportMappings(path.resolve(startDir, p))
413
386
 
414
387
  // if exportMappings is empty skip export generation
415
388
  if (exportMappings === "") {
416
- yield* Effect.log(`No src directory found for ${p}, skipping export generation`)
389
+ yield* Effect.logInfo(`No src directory found for ${p}, skipping export generation`)
417
390
  return
418
391
  }
419
392
 
@@ -460,7 +433,7 @@ Effect
460
433
  const pkgJson = JSON.parse(yield* fs.readFileString(p + "/package.json", "utf-8"))
461
434
  pkgJson.exports = packageExports
462
435
 
463
- yield* Effect.log(`Writing updated package.json for ${p}`)
436
+ yield* Effect.logInfo(`Writing updated package.json for ${p}`)
464
437
 
465
438
  return yield* fs.writeFileString(
466
439
  p + "/package.json",
@@ -469,10 +442,118 @@ Effect
469
442
  }
470
443
  )
471
444
 
445
+ /**
446
+ * Monitors a directory for TypeScript file changes and automatically updates package.json exports.
447
+ * Generates initial package.json exports, then watches the src directory for changes to regenerate exports.
448
+ *
449
+ * @param watchPath - The directory path containing the package.json and src to monitor
450
+ * @param levels - Optional depth limit for export filtering (0 = no limit)
451
+ * @returns An Effect that sets up package.json monitoring
452
+ */
453
+ const monitorPackageJson = Effect.fn("effa-cli.monitorPackageJson")(
454
+ function*(startDir: string, watchPath: string, levels = 0) {
455
+ yield* packagejsonUpdater(startDir, watchPath, levels)
456
+
457
+ const srcPath = watchPath === "." ? "./src" : `${watchPath}/src`
458
+
459
+ if (!(yield* fs.exists(srcPath))) {
460
+ yield* Effect.logWarning(`Source directory ${srcPath} does not exist - skipping monitoring`)
461
+ return
462
+ }
463
+
464
+ const watchStream = fs.watch(srcPath, { recursive: true })
465
+
466
+ yield* watchStream.pipe(
467
+ Stream.runForEach(
468
+ Effect.fn("effa-cli.monitorPackageJson.handleEvent")(function*(_) {
469
+ yield* packagejsonUpdater(startDir, watchPath, levels)
470
+ })
471
+ ),
472
+ Effect.andThen(
473
+ Effect.addFinalizer(() => Effect.logInfo(`Stopped monitoring package.json for: ${watchPath}`))
474
+ ),
475
+ Effect.forkScoped
476
+ )
477
+ }
478
+ )
479
+
472
480
  /*
473
481
  * CLI
474
482
  */
475
483
 
484
+ const WrapAsOption = Options.text("wrap").pipe(
485
+ Options.withAlias("w"),
486
+ Options.optional,
487
+ Options.withDescription(
488
+ "Wrap child bash command: the lifetime of the CLI command will be tied to the child process"
489
+ )
490
+ )
491
+
492
+ // has prio over WrapAsOption
493
+ const WrapAsArg = Args
494
+ .text({
495
+ name: "wrap"
496
+ })
497
+ .pipe(
498
+ Args.atLeast(1),
499
+ Args.optional,
500
+ Args.withDescription(
501
+ "Wrap child bash command: the lifetime of the CLI command will be tied to the child process"
502
+ )
503
+ )
504
+
505
+ /**
506
+ * Creates a command that automatically includes wrap functionality for executing child bash commands.
507
+ * Combines both option-based (--wrap) and argument-based wrap parameters, giving priority to arguments.
508
+ * If a wrap command is provided, it will be executed **after** the main command handler.
509
+ *
510
+ * @param name - The command name
511
+ * @param config - The command configuration (options, args, etc.)
512
+ * @param handler - The main command handler function
513
+ * @param completionMessage - Optional message to log when the command completes
514
+ * @returns A Command with integrated wrap functionality
515
+ */
516
+ const makeCommandWithWrap = <Name extends string, const Config extends Command.Command.Config, R, E>(
517
+ name: Name,
518
+ config: Config,
519
+ handler: (_: Types.Simplify<Command.Command.ParseConfig<Config>>) => Effect.Effect<void, E, R>,
520
+ completionMessage?: string
521
+ ): Command.Command<
522
+ Name,
523
+ CommandExecutor | R,
524
+ PlatformError | E,
525
+ Types.Simplify<Command.Command.ParseConfig<Config>>
526
+ > =>
527
+ Command.make(
528
+ name,
529
+ { ...config, wo: WrapAsOption, wa: WrapAsArg },
530
+ Effect.fn("effa-cli.withWrapHandler")(function*(_) {
531
+ const { wa, wo, ...cfg } = _ as unknown as {
532
+ wo: Option.Option<string>
533
+ wa: Option.Option<[string, ...string[]]>
534
+ } & Types.Simplify<Command.Command.ParseConfig<Config>>
535
+
536
+ if (completionMessage) {
537
+ yield* Effect.addFinalizer(() => Effect.logInfo(completionMessage))
538
+ }
539
+
540
+ const wrapOption = Option.orElse(wa, () => wo)
541
+
542
+ yield* handler(cfg as any)
543
+
544
+ if (Option.isSome(wrapOption)) {
545
+ const val = Array.isArray(wrapOption.value)
546
+ ? wrapOption.value.join(" ")
547
+ : wrapOption.value
548
+
549
+ yield* Effect.logInfo(`Spawning child command: ${val}`)
550
+ yield* runNodeCommand(val)
551
+ }
552
+
553
+ return
554
+ }, (_) => Effect.scoped(_))
555
+ )
556
+
476
557
  const EffectAppLibsPath = Args
477
558
  .directory({
478
559
  exists: "yes",
@@ -508,7 +589,7 @@ Effect
508
589
  "ue",
509
590
  {},
510
591
  Effect.fn("effa-cli.ue")(function*({}) {
511
- yield* Effect.log("Update effect-app and/or effect packages")
592
+ yield* Effect.logInfo("Update effect-app and/or effect packages")
512
593
 
513
594
  const prompted = yield* Prompt.select({
514
595
  choices: [
@@ -551,130 +632,118 @@ Effect
551
632
  )
552
633
  .pipe(Command.withDescription("Update effect-app and/or effect packages"))
553
634
 
554
- const DebugOption = Options.boolean("debug").pipe(
555
- Options.withAlias("d"),
556
- Options.withDescription("Enable debug logging")
635
+ const watch = makeCommandWithWrap(
636
+ "watch",
637
+ {},
638
+ Effect.fn("effa-cli.watch")(function*({}) {
639
+ return yield* watcher()
640
+ }),
641
+ "Stopped watching API resources and models"
557
642
  )
558
-
559
- const watch = Command
560
- .make(
561
- "watch",
562
- { debug: DebugOption },
563
- Effect.fn("effa-cli.watch")(function*({ debug }) {
564
- return yield* watcher(debug)
565
- })
566
- )
567
643
  .pipe(
568
644
  Command.withDescription(
569
645
  "Watch API resources and models for changes and update tsconfig.json and vite.config.ts accordingly"
570
646
  )
571
647
  )
572
648
 
573
- const indexMulti = Command
574
- .make(
575
- "index-multi",
576
- { debug: DebugOption },
577
- Effect.fn("effa-cli.index-multi")(function*({ debug }) {
578
- yield* Effect.log("Starting multi-index monitoring")
579
-
580
- const dirs = ["./api/src"]
581
- const fileSystem = yield* FileSystem.FileSystem
582
-
583
- const existingDirs: string[] = []
584
- for (const dir of dirs) {
585
- const dirExists = yield* fileSystem.exists(dir)
586
- if (dirExists) {
587
- existingDirs.push(dir)
588
- } else {
589
- yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`)
590
- }
591
- }
592
-
593
- if (existingDirs.length === 0) {
594
- return yield* Effect.logWarning("No directories to monitor - exiting")
649
+ const indexMulti = makeCommandWithWrap(
650
+ "index-multi",
651
+ {},
652
+ Effect.fn("effa-cli.index-multi")(function*({}) {
653
+ yield* Effect.logInfo("Starting multi-index monitoring")
654
+
655
+ const dirs = ["./api/src"]
656
+
657
+ const existingDirs: string[] = []
658
+ for (const dir of dirs) {
659
+ const dirExists = yield* fs.exists(dir)
660
+ if (dirExists) {
661
+ existingDirs.push(dir)
662
+ } else {
663
+ yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`)
595
664
  }
665
+ }
596
666
 
597
- const monitors = existingDirs.map((dir) => monitorIndexes(dir, debug))
598
- yield* Effect.all(monitors, { concurrency: monitors.length })
599
- })
600
- )
667
+ const monitors = existingDirs.map((dir) => monitorIndexes(dir))
668
+ yield* Effect.all(monitors, { concurrency: monitors.length })
669
+ }),
670
+ "Stopped multi-index monitoring"
671
+ )
601
672
  .pipe(
602
673
  Command.withDescription(
603
674
  "Monitor multiple directories for index and controller file changes"
604
675
  )
605
676
  )
606
677
 
607
- const packagejson = Command
608
- .make(
609
- "packagejson",
610
- {},
611
- Effect.fn("effa-cli.packagejson")(function*({}) {
612
- // https://nodejs.org/api/path.html#pathresolvepaths
613
- const startDir = path.resolve()
678
+ const packagejson = makeCommandWithWrap(
679
+ "packagejson",
680
+ {},
681
+ Effect.fn("effa-cli.packagejson")(function*({}) {
682
+ // https://nodejs.org/api/path.html#pathresolvepaths
683
+ const startDir = path.resolve()
614
684
 
615
- return yield* packagejsonUpdater(startDir, ".")
616
- })
617
- )
685
+ return yield* monitorPackageJson(startDir, ".")
686
+ }),
687
+ "Stopped monitoring root package.json exports"
688
+ )
618
689
  .pipe(
619
690
  Command.withDescription("Generate and update root-level package.json exports mappings for TypeScript modules")
620
691
  )
621
692
 
622
- const packagejsonPackages = Command
623
- .make(
624
- "packagejson-packages",
625
- {},
626
- Effect.fn("effa-cli.packagejson-packages")(function*({}) {
627
- // https://nodejs.org/api/path.html#pathresolvepaths
628
- const startDir = path.resolve()
629
-
630
- const packagesDir = path.join(startDir, "packages")
693
+ const packagejsonPackages = makeCommandWithWrap(
694
+ "packagejson-packages",
695
+ {},
696
+ Effect.fn("effa-cli.packagejson-packages")(function*({}) {
697
+ // https://nodejs.org/api/path.html#pathresolvepaths
698
+ const startDir = path.resolve()
631
699
 
632
- const packagesExists = yield* fs.exists(packagesDir)
633
- if (!packagesExists) {
634
- return yield* Effect.logWarning("No packages directory found")
635
- }
700
+ const packagesDir = path.join(startDir, "packages")
636
701
 
637
- // get all package directories
638
- const packageDirs = yield* fs.readDirectory(packagesDir)
702
+ const packagesExists = yield* fs.exists(packagesDir)
703
+ if (!packagesExists) {
704
+ return yield* Effect.logWarning("No packages directory found")
705
+ }
639
706
 
640
- const validPackages: string[] = []
707
+ // get all package directories
708
+ const packageDirs = yield* fs.readDirectory(packagesDir)
641
709
 
642
- // filter packages that have package.json and src directory
643
- for (const packageName of packageDirs) {
644
- const packagePath = path.join(packagesDir, packageName)
645
- const packageJsonExists = yield* fs.exists(path.join(packagePath, "package.json"))
646
- const srcExists = yield* fs.exists(path.join(packagePath, "src"))
710
+ const validPackages: string[] = []
647
711
 
648
- const shouldExclude = false
649
- || packageName.endsWith("eslint-codegen-model")
650
- || packageName.endsWith("vue-components")
712
+ // filter packages that have package.json and src directory
713
+ for (const packageName of packageDirs) {
714
+ const packagePath = path.join(packagesDir, packageName)
715
+ const packageJsonExists = yield* fs.exists(path.join(packagePath, "package.json"))
716
+ const srcExists = yield* fs.exists(path.join(packagePath, "src"))
651
717
 
652
- if (packageJsonExists && srcExists && !shouldExclude) {
653
- validPackages.push(packagePath)
654
- }
655
- }
718
+ const shouldExclude = false
719
+ || packageName.endsWith("eslint-codegen-model")
720
+ || packageName.endsWith("vue-components")
656
721
 
657
- if (validPackages.length === 0) {
658
- return yield* Effect.logWarning("No valid packages found to update")
722
+ if (packageJsonExists && srcExists && !shouldExclude) {
723
+ validPackages.push(packagePath)
659
724
  }
725
+ }
660
726
 
661
- yield* Effect.log(`Found ${validPackages.length} packages to update`)
727
+ yield* Effect.logInfo(`Found ${validPackages.length} packages to update`)
662
728
 
663
- // update each package sequentially
664
- yield* Effect.all(
665
- validPackages.map((packagePath) =>
666
- Effect.gen(function*() {
667
- const relativePackagePath = path.relative(startDir, packagePath)
668
- yield* Effect.log(`Updating ${relativePackagePath}`)
669
- return yield* packagejsonUpdater(startDir, relativePackagePath)
670
- })
671
- )
729
+ // update each package sequentially
730
+ yield* Effect.all(
731
+ validPackages.map(
732
+ Effect.fnUntraced(function*(packagePath) {
733
+ const relativePackagePath = path.relative(startDir, packagePath)
734
+ yield* Effect.logInfo(`Updating ${relativePackagePath}`)
735
+ return yield* monitorPackageJson(startDir, relativePackagePath)
736
+ })
672
737
  )
738
+ )
673
739
 
674
- yield* Effect.log("All packages updated successfully")
675
- })
740
+ yield* Effect.logInfo("All packages updated successfully")
741
+ }),
742
+ "Stopped monitoring package.json exports for all packages"
743
+ )
744
+ .pipe(
745
+ Command.withDescription("Generate and update package.json exports mappings for all packages in monorepo")
676
746
  )
677
- .pipe(Command.withDescription("Generate and update package.json exports mappings for all packages in monorepo"))
678
747
 
679
748
  // configure CLI
680
749
  const cli = Command.run(