diff --git a/bricks/dart_frog_dev_server/CHANGELOG.md b/bricks/dart_frog_dev_server/CHANGELOG.md deleted file mode 100644 index 98bc6ae6d..000000000 --- a/bricks/dart_frog_dev_server/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -# 0.1.0+1 - -- feat: basic implementation for the dart frog dev server diff --git a/bricks/dart_frog_dev_server/LICENSE b/bricks/dart_frog_dev_server/LICENSE deleted file mode 100644 index bba8e50bd..000000000 --- a/bricks/dart_frog_dev_server/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Very Good Ventures - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/bricks/dart_frog_dev_server/README.md b/bricks/dart_frog_dev_server/README.md deleted file mode 100644 index 0addeea4b..000000000 --- a/bricks/dart_frog_dev_server/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# dart_frog_dev_server - -[![Powered by Mason](https://img.shields.io/endpoint?url=https%3A%2F%2Ftinyurl.com%2Fmason-badge)](https://github.com/felangel/mason) - -A dart_frog dev server - -_Generated by [mason][1] 🧱_ - -[1]: https://github.com/felangel/mason diff --git a/bricks/dart_frog_dev_server/hooks/.gitignore b/bricks/dart_frog_dev_server/hooks/.gitignore deleted file mode 100644 index 0f798608c..000000000 --- a/bricks/dart_frog_dev_server/hooks/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.dart_tool -.packages -pubspec.lock -coverage -build diff --git a/bricks/dart_frog_dev_server/hooks/analysis_options.yaml b/bricks/dart_frog_dev_server/hooks/analysis_options.yaml deleted file mode 100644 index 799268d3e..000000000 --- a/bricks/dart_frog_dev_server/hooks/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: package:very_good_analysis/analysis_options.5.1.0.yaml diff --git a/bricks/dart_frog_dev_server/hooks/pubspec.yaml b/bricks/dart_frog_dev_server/hooks/pubspec.yaml deleted file mode 100644 index f8ed003a9..000000000 --- a/bricks/dart_frog_dev_server/hooks/pubspec.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: dart_frog_dev_server_hooks -publish_to: none - -environment: - sdk: ">=3.0.0 <4.0.0" - -dependencies: - dart_frog_gen: ^2.0.0 - mason: ^0.1.0-dev.39 - pubspec_parse: ^1.2.0 - -dev_dependencies: - mocktail: ^1.0.0 - path: ^1.8.2 - test: ^1.19.2 - very_good_analysis: ^5.1.0 diff --git a/bricks/dart_frog_dev_server/hooks/src/exit_overrides.dart b/bricks/dart_frog_dev_server/hooks/src/exit_overrides.dart deleted file mode 100644 index 697843dbb..000000000 --- a/bricks/dart_frog_dev_server/hooks/src/exit_overrides.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'dart:async'; -import 'dart:io' as io; - -const _asyncRunZoned = runZoned; - -abstract class ExitOverrides { - static final _token = Object(); - - static ExitOverrides? get current { - return Zone.current[_token] as ExitOverrides?; - } - - static R runZoned(R Function() body, {void Function(int)? exit}) { - final overrides = _ExitOverridesScope(exit); - return _asyncRunZoned(body, zoneValues: {_token: overrides}); - } - - void Function(int exitCode) get exit => io.exit; -} - -class _ExitOverridesScope extends ExitOverrides { - _ExitOverridesScope(this._exit); - - final ExitOverrides? _previous = ExitOverrides.current; - final void Function(int exitCode)? _exit; - - @override - void Function(int exitCode) get exit { - return _exit ?? _previous?.exit ?? super.exit; - } -} diff --git a/bricks/dart_frog_dev_server/hooks/test/pre_gen_test.dart b/bricks/dart_frog_dev_server/hooks/test/pre_gen_test.dart deleted file mode 100644 index d1eaa58b9..000000000 --- a/bricks/dart_frog_dev_server/hooks/test/pre_gen_test.dart +++ /dev/null @@ -1,396 +0,0 @@ -import 'package:dart_frog_gen/dart_frog_gen.dart'; -import 'package:mason/mason.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:test/test.dart'; - -import '../pre_gen.dart'; -import '../src/exit_overrides.dart'; - -class _FakeHookContext extends Fake implements HookContext { - _FakeHookContext({Logger? logger}) : _logger = logger ?? _MockLogger(); - - final Logger _logger; - - var _vars = {}; - - @override - Map get vars => _vars; - - @override - set vars(Map value) => _vars = value; - - @override - Logger get logger => _logger; -} - -class _MockLogger extends Mock implements Logger {} - -void main() { - group('preGen', () { - late HookContext context; - late Logger logger; - - setUp(() { - logger = _MockLogger(); - context = _FakeHookContext(logger: logger); - }); - - test('run completes', () { - expect( - ExitOverrides.runZoned( - () => run(_FakeHookContext()), - exit: (_) {}, - ), - completes, - ); - }); - - test('exit(1) if buildRouteConfiguration throws', () async { - final exitCalls = []; - final exception = Exception('oops'); - await preGen( - context, - buildConfiguration: (_) => throw exception, - exit: exitCalls.add, - ); - expect(exitCalls, equals([1])); - verify(() => logger.err(exception.toString())).called(1); - }); - - test('complains about route conflicts', () async { - const configuration = RouteConfiguration( - middleware: [], - directories: [], - routes: [], - rogueRoutes: [], - endpoints: { - '/': [ - RouteFile( - name: 'index', - path: 'index.dart', - route: '/', - params: [], - wildcard: false, - ), - ], - '/hello': [ - RouteFile( - name: 'hello', - path: 'hello.dart', - route: '/hello', - params: [], - wildcard: false, - ), - RouteFile( - name: 'hello_index', - path: 'hello/index.dart', - route: '/', - params: [], - wildcard: false, - ), - ], - }, - ); - - final exitCalls = []; - await preGen( - context, - buildConfiguration: (_) => configuration, - exit: exitCalls.add, - ); - - verify( - () => logger.err( - '''Route conflict detected. ${lightCyan.wrap('routes/hello.dart')} and ${lightCyan.wrap('routes/hello/index.dart')} both resolve to ${lightCyan.wrap('/hello')}.''', - ), - ); - expect(exitCalls, isEmpty); - }); - - test('complains about rogue routes', () async { - const configuration = RouteConfiguration( - middleware: [], - directories: [], - routes: [], - rogueRoutes: [ - RouteFile( - name: 'hello', - path: 'hello.dart', - route: '/hello', - params: [], - wildcard: false, - ), - ], - endpoints: {}, - ); - - final exitCalls = []; - await preGen( - context, - buildConfiguration: (_) => configuration, - exit: exitCalls.add, - ); - - verify( - () => logger.err( - '''Rogue route detected.${defaultForeground.wrap(' ')}Rename ${lightCyan.wrap('routes/hello.dart')} to ${lightCyan.wrap('routes/hello/index.dart')}.''', - ), - ); - expect(exitCalls, isEmpty); - }); - - test('retains custom port if specified', () async { - const customPort = '8081'; - context.vars['port'] = customPort; - const configuration = RouteConfiguration( - middleware: [], - directories: [], - routes: [], - rogueRoutes: [], - endpoints: {}, - ); - final exitCalls = []; - await preGen( - context, - buildConfiguration: (_) => configuration, - exit: exitCalls.add, - ); - expect(exitCalls, isEmpty); - verifyNever(() => logger.err(any())); - expect( - context.vars, - equals( - { - 'port': customPort, - 'directories': [], - 'routes': [], - 'middleware': [], - 'globalMiddleware': false, - 'serveStaticFiles': false, - 'invokeCustomEntrypoint': false, - 'invokeCustomInit': false, - }, - ), - ); - }); - - test('retains invokeCustomEntrypoint (true)', () async { - const customPort = '8081'; - context.vars['port'] = customPort; - const configuration = RouteConfiguration( - middleware: [], - directories: [], - routes: [], - rogueRoutes: [], - endpoints: {}, - invokeCustomEntrypoint: true, - ); - final exitCalls = []; - await preGen( - context, - buildConfiguration: (_) => configuration, - exit: exitCalls.add, - ); - expect(exitCalls, isEmpty); - verifyNever(() => logger.err(any())); - expect( - context.vars, - equals( - { - 'port': customPort, - 'directories': [], - 'routes': [], - 'middleware': [], - 'globalMiddleware': false, - 'serveStaticFiles': false, - 'invokeCustomEntrypoint': true, - 'invokeCustomInit': false, - }, - ), - ); - }); - - test('retains invokeCustomInit (true)', () async { - const customPort = '8081'; - context.vars['port'] = customPort; - const configuration = RouteConfiguration( - middleware: [], - directories: [], - routes: [], - rogueRoutes: [], - endpoints: {}, - invokeCustomInit: true, - ); - final exitCalls = []; - await preGen( - context, - buildConfiguration: (_) => configuration, - exit: exitCalls.add, - ); - expect(exitCalls, isEmpty); - verifyNever(() => logger.err(any())); - expect( - context.vars, - equals( - { - 'port': customPort, - 'directories': [], - 'routes': [], - 'middleware': [], - 'globalMiddleware': false, - 'serveStaticFiles': false, - 'invokeCustomEntrypoint': false, - 'invokeCustomInit': true, - }, - ), - ); - }); - - test('updates context.vars when buildRouteConfiguration succeeds', - () async { - const configuration = RouteConfiguration( - globalMiddleware: MiddlewareFile( - name: 'middleware', - path: 'middleware.dart', - ), - middleware: [ - MiddlewareFile( - name: 'hello_middleware', - path: 'hello/middleware.dart', - ), - ], - directories: [ - RouteDirectory( - name: '_', - route: '/', - middleware: [], - files: [ - RouteFile( - name: 'index', - path: 'index.dart', - route: '/', - params: [], - wildcard: false, - ), - RouteFile( - name: 'hello', - path: 'hello.dart', - route: '/hello', - params: [], - wildcard: false, - ), - ], - params: [], - ), - ], - routes: [ - RouteFile( - name: 'index', - path: 'index.dart', - route: '/', - params: [], - wildcard: false, - ), - RouteFile( - name: 'hello', - path: 'hello.dart', - route: '/hello', - params: [], - wildcard: false, - ), - ], - endpoints: { - '/': [ - RouteFile( - name: 'index', - path: 'index.dart', - route: '/', - params: [], - wildcard: false, - ), - ], - '/hello': [ - RouteFile( - name: 'hello', - path: 'hello.dart', - route: '/hello', - params: [], - wildcard: false, - ), - ], - }, - rogueRoutes: [], - serveStaticFiles: true, - ); - final exitCalls = []; - await preGen( - context, - buildConfiguration: (_) => configuration, - exit: exitCalls.add, - ); - expect(exitCalls, isEmpty); - verifyNever(() => logger.err(any())); - expect( - context.vars, - equals( - { - 'port': '8080', - 'directories': [ - { - 'name': '_', - 'route': '/', - 'middleware': >[], - 'files': [ - { - 'name': 'index', - 'path': 'index.dart', - 'route': '/', - 'file_params': [], - 'wildcard': false, - }, - { - 'name': 'hello', - 'path': 'hello.dart', - 'route': '/hello', - 'file_params': [], - 'wildcard': false, - } - ], - 'directory_params': [], - } - ], - 'routes': [ - { - 'name': 'index', - 'path': 'index.dart', - 'route': '/', - 'file_params': const [], - 'wildcard': false, - }, - { - 'name': 'hello', - 'path': 'hello.dart', - 'route': '/hello', - 'file_params': const [], - 'wildcard': false, - } - ], - 'middleware': [ - { - 'name': 'hello_middleware', - 'path': 'hello/middleware.dart', - }, - ], - 'globalMiddleware': { - 'name': 'middleware', - 'path': 'middleware.dart', - }, - 'serveStaticFiles': true, - 'invokeCustomEntrypoint': false, - 'invokeCustomInit': false, - }, - ), - ); - }); - }); -} diff --git a/bricks/dart_frog_dev_server/hooks/test/src/exit_overrides_test.dart b/bricks/dart_frog_dev_server/hooks/test/src/exit_overrides_test.dart deleted file mode 100644 index 6d6541dd5..000000000 --- a/bricks/dart_frog_dev_server/hooks/test/src/exit_overrides_test.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'dart:io'; - -import 'package:test/test.dart'; - -import '../../src/exit_overrides.dart'; - -void main() { - group('ExitOverrides', () { - group('runZoned', () { - test('uses default exit when not specified', () { - ExitOverrides.runZoned(() { - final overrides = ExitOverrides.current; - expect(overrides!.exit, equals(exit)); - }); - }); - - test('uses custom exit when specified', () { - ExitOverrides.runZoned( - () { - final overrides = ExitOverrides.current; - expect(overrides!.exit, isNot(equals(exit))); - }, - exit: (_) {}, - ); - }); - }); - }); -} diff --git a/bricks/dart_frog_prod_server/CHANGELOG.md b/bricks/dart_frog_prod_server/CHANGELOG.md deleted file mode 100644 index 0996349b2..000000000 --- a/bricks/dart_frog_prod_server/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -# 0.1.0+1 - -- feat: basic implementation for the dart frog production server diff --git a/bricks/dart_frog_prod_server/LICENSE b/bricks/dart_frog_prod_server/LICENSE deleted file mode 100644 index bba8e50bd..000000000 --- a/bricks/dart_frog_prod_server/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Very Good Ventures - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/bricks/dart_frog_prod_server/README.md b/bricks/dart_frog_prod_server/README.md deleted file mode 100644 index 0605d443a..000000000 --- a/bricks/dart_frog_prod_server/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# dart_frog_prod_server - -[![Powered by Mason](https://img.shields.io/endpoint?url=https%3A%2F%2Ftinyurl.com%2Fmason-badge)](https://github.com/felangel/mason) - -A `dart_frog` production server. - -_Generated by [mason][1] 🧱_ - -[1]: https://github.com/felangel/mason diff --git a/bricks/dart_frog_prod_server/hooks/.gitignore b/bricks/dart_frog_prod_server/hooks/.gitignore deleted file mode 100644 index 2f4db06c7..000000000 --- a/bricks/dart_frog_prod_server/hooks/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.dart_tool -.packages -pubspec.lock -coverage -build \ No newline at end of file diff --git a/bricks/dart_frog_prod_server/hooks/analysis_options.yaml b/bricks/dart_frog_prod_server/hooks/analysis_options.yaml deleted file mode 100644 index 799268d3e..000000000 --- a/bricks/dart_frog_prod_server/hooks/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: package:very_good_analysis/analysis_options.5.1.0.yaml diff --git a/bricks/dart_frog_prod_server/hooks/post_gen.dart b/bricks/dart_frog_prod_server/hooks/post_gen.dart deleted file mode 100644 index c25fe7d42..000000000 --- a/bricks/dart_frog_prod_server/hooks/post_gen.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'dart:async'; -import 'dart:io' as io; - -import 'package:mason/mason.dart' show HookContext, lightCyan; -import 'package:path/path.dart' as path; - -import 'src/dart_pub_get.dart'; -import 'src/exit_overrides.dart'; - -void _defaultExit(int code) => ExitOverrides.current?.exit ?? io.exit; - -Future run(HookContext context) => postGen(context); - -Future postGen( - HookContext context, { - io.Directory? directory, - ProcessRunner runProcess = io.Process.run, - void Function(int exitCode) exit = _defaultExit, -}) async { - final projectDirectory = directory ?? io.Directory.current; - final buildDirectoryPath = path.join(projectDirectory.path, 'build'); - - await dartPubGet( - context, - workingDirectory: buildDirectoryPath, - runProcess: runProcess, - exit: exit, - ); - - final relativeBuildPath = path.relative(buildDirectoryPath); - context.logger - ..info('') - ..success('Created a production build!') - ..info('') - ..info('Start the production server by running:') - ..info('') - ..info( - '''${lightCyan.wrap('dart ${path.join(relativeBuildPath, 'bin', 'server.dart')}')}''', - ); -} diff --git a/bricks/dart_frog_prod_server/hooks/pubspec.yaml b/bricks/dart_frog_prod_server/hooks/pubspec.yaml deleted file mode 100644 index d20f5fd4f..000000000 --- a/bricks/dart_frog_prod_server/hooks/pubspec.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: dart_frog_prod_server_hooks -publish_to: none - -environment: - sdk: ">=3.0.0 <4.0.0" - -dependencies: - dart_frog_gen: ^2.0.0 - io: ^1.0.3 - mason: ^0.1.0-dev.39 - path: ^1.8.1 - pubspec_lock: ^3.0.2 - -dev_dependencies: - mocktail: ^1.0.0 - test: ^1.19.2 - very_good_analysis: ^5.1.0 diff --git a/bricks/dart_frog_prod_server/hooks/src/dart_pub_get.dart b/bricks/dart_frog_prod_server/hooks/src/dart_pub_get.dart deleted file mode 100644 index 3a9c977eb..000000000 --- a/bricks/dart_frog_prod_server/hooks/src/dart_pub_get.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'dart:io' as io; - -import 'package:mason/mason.dart'; - -typedef ProcessRunner = Future Function( - String executable, - List arguments, { - String workingDirectory, - bool runInShell, -}); - -Future dartPubGet( - HookContext context, { - required String workingDirectory, - required ProcessRunner runProcess, - required void Function(int exitCode) exit, -}) async { - final progress = context.logger.progress('Installing dependencies'); - try { - final result = await runProcess( - 'dart', - ['pub', 'get'], - workingDirectory: workingDirectory, - runInShell: true, - ); - progress.complete(); - - if (result.exitCode != 0) { - context.logger.err('${result.stderr}'); - return exit(result.exitCode); - } - } on io.ProcessException catch (error) { - context.logger.err(error.message); - return exit(error.errorCode); - } -} diff --git a/bricks/dart_frog_prod_server/hooks/src/exit_overrides.dart b/bricks/dart_frog_prod_server/hooks/src/exit_overrides.dart deleted file mode 100644 index 697843dbb..000000000 --- a/bricks/dart_frog_prod_server/hooks/src/exit_overrides.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'dart:async'; -import 'dart:io' as io; - -const _asyncRunZoned = runZoned; - -abstract class ExitOverrides { - static final _token = Object(); - - static ExitOverrides? get current { - return Zone.current[_token] as ExitOverrides?; - } - - static R runZoned(R Function() body, {void Function(int)? exit}) { - final overrides = _ExitOverridesScope(exit); - return _asyncRunZoned(body, zoneValues: {_token: overrides}); - } - - void Function(int exitCode) get exit => io.exit; -} - -class _ExitOverridesScope extends ExitOverrides { - _ExitOverridesScope(this._exit); - - final ExitOverrides? _previous = ExitOverrides.current; - final void Function(int exitCode)? _exit; - - @override - void Function(int exitCode) get exit { - return _exit ?? _previous?.exit ?? super.exit; - } -} diff --git a/bricks/dart_frog_prod_server/hooks/test/post_gen_test.dart b/bricks/dart_frog_prod_server/hooks/test/post_gen_test.dart deleted file mode 100644 index cc4ed1603..000000000 --- a/bricks/dart_frog_prod_server/hooks/test/post_gen_test.dart +++ /dev/null @@ -1,99 +0,0 @@ -import 'dart:io'; - -import 'package:mason/mason.dart' - show ExitCode, HookContext, Logger, Progress, lightCyan; -import 'package:mocktail/mocktail.dart'; -import 'package:path/path.dart' as path; -import 'package:test/test.dart'; - -import '../post_gen.dart'; -import '../src/exit_overrides.dart'; - -class _FakeHookContext extends Fake implements HookContext { - _FakeHookContext({Logger? logger}) : _logger = logger ?? _MockLogger(); - - final Logger _logger; - - var _vars = {}; - - @override - Map get vars => _vars; - - @override - set vars(Map value) => _vars = value; - - @override - Logger get logger => _logger; -} - -class _MockLogger extends Mock implements Logger {} - -class _MockProgress extends Mock implements Progress {} - -void main() { - group('postGen', () { - late HookContext context; - late Logger logger; - - const processId = 42; - final processResult = ProcessResult( - processId, - ExitCode.success.code, - '', - '', - ); - - setUp(() { - logger = _MockLogger(); - context = _FakeHookContext(logger: logger); - - when(() => logger.progress(any())).thenReturn(_MockProgress()); - }); - - test('run completes', () { - expect( - ExitOverrides.runZoned( - () => run(_FakeHookContext(logger: logger)), - exit: (_) {}, - ), - completes, - ); - }); - - test('runs dart pub get and outputs next steps', () async { - var processRunnerCallCount = 0; - final exitCalls = []; - - await postGen( - context, - runProcess: ( - executable, - args, { - String? workingDirectory, - bool? runInShell, - }) async { - processRunnerCallCount++; - expect(executable, equals('dart')); - expect(args, equals(['pub', 'get'])); - expect( - workingDirectory, - equals(path.join(Directory.current.path, 'build')), - ); - expect(runInShell, isTrue); - return processResult; - }, - exit: exitCalls.add, - ); - expect(processRunnerCallCount, equals(1)); - expect(exitCalls, isEmpty); - verify(() => logger.success('Created a production build!')).called(1); - verify( - () => logger.info('Start the production server by running:'), - ).called(1); - verify( - () => logger.info('${lightCyan.wrap('dart build/bin/server.dart')}'), - ).called(1); - verifyNever(() => logger.err(any())); - }); - }); -} diff --git a/bricks/dart_frog_prod_server/hooks/test/pre_gen_test.dart b/bricks/dart_frog_prod_server/hooks/test/pre_gen_test.dart deleted file mode 100644 index 4a6e4329c..000000000 --- a/bricks/dart_frog_prod_server/hooks/test/pre_gen_test.dart +++ /dev/null @@ -1,493 +0,0 @@ -import 'dart:io'; - -import 'package:dart_frog_gen/dart_frog_gen.dart'; -import 'package:mason/mason.dart' - show HookContext, Logger, Progress, defaultForeground, lightCyan; -import 'package:mocktail/mocktail.dart'; -import 'package:path/path.dart' as path; -import 'package:test/test.dart'; - -import '../pre_gen.dart'; -import '../src/exit_overrides.dart'; -import 'pubspeck_locks.dart'; - -class _FakeHookContext extends Fake implements HookContext { - _FakeHookContext({Logger? logger}) : _logger = logger ?? _MockLogger(); - - final Logger _logger; - - var _vars = {}; - - @override - Map get vars => _vars; - - @override - set vars(Map value) => _vars = value; - - @override - Logger get logger => _logger; -} - -class _MockLogger extends Mock implements Logger {} - -class _MockProgress extends Mock implements Progress {} - -void main() { - group('preGen', () { - late HookContext context; - late Logger logger; - - Future successRunProcess( - executable, - args, { - String? workingDirectory, - bool? runInShell, - }) => - Future.value(ProcessResult(0, 0, '', '')); - - setUp(() { - logger = _MockLogger(); - context = _FakeHookContext(logger: logger) - ..vars['dartVersion'] = 'stable'; - - when(() => logger.progress(any())).thenReturn(_MockProgress()); - }); - - test('run completes', () { - expect( - ExitOverrides.runZoned( - () => run(_FakeHookContext(logger: logger)), - exit: (_) {}, - ), - completes, - ); - }); - - test('exit(1) if buildRouteConfiguration throws', () async { - final exitCalls = []; - final exception = Exception('oops'); - await preGen( - context, - buildConfiguration: (_) => throw exception, - exit: exitCalls.add, - runProcess: successRunProcess, - ); - expect(exitCalls, equals([1])); - verify(() => logger.err(exception.toString())).called(1); - }); - - test('exit(1) for route conflicts', () async { - const configuration = RouteConfiguration( - middleware: [], - directories: [], - routes: [], - rogueRoutes: [], - endpoints: { - '/': [ - RouteFile( - name: 'index', - path: 'index.dart', - route: '/', - params: [], - wildcard: false, - ), - ], - '/hello': [ - RouteFile( - name: 'hello', - path: 'hello.dart', - route: '/hello', - params: [], - wildcard: false, - ), - RouteFile( - name: 'hello_index', - path: 'hello/index.dart', - route: '/', - params: [], - wildcard: false, - ), - ], - }, - ); - - final exitCalls = []; - await preGen( - context, - buildConfiguration: (_) => configuration, - exit: exitCalls.add, - runProcess: successRunProcess, - ); - - verify( - () => logger.err( - '''Route conflict detected. ${lightCyan.wrap('routes/hello.dart')} and ${lightCyan.wrap('routes/hello/index.dart')} both resolve to ${lightCyan.wrap('/hello')}.''', - ), - ); - expect(exitCalls, equals([1])); - }); - - test('exit(1) for rogue routes', () async { - const configuration = RouteConfiguration( - middleware: [], - directories: [], - routes: [], - rogueRoutes: [ - RouteFile( - name: 'hello', - path: 'hello.dart', - route: '/hello', - params: [], - wildcard: false, - ), - ], - endpoints: {}, - invokeCustomEntrypoint: true, - ); - - final exitCalls = []; - await preGen( - context, - buildConfiguration: (_) => configuration, - exit: exitCalls.add, - runProcess: successRunProcess, - ); - - verify( - () => logger.err( - '''Rogue route detected.${defaultForeground.wrap(' ')}Rename ${lightCyan.wrap('routes/hello.dart')} to ${lightCyan.wrap('routes/hello/index.dart')}.''', - ), - ); - expect(exitCalls, equals([1])); - }); - - test( - 'works with external dependencies', - () async { - const configuration = RouteConfiguration( - middleware: [], - directories: [], - routes: [], - rogueRoutes: [], - endpoints: {}, - ); - - final directory = Directory.systemTemp.createTempSync(); - File(path.join(directory.path, 'pubspec.yaml')).writeAsStringSync( - ''' -name: example -version: 0.1.0 -environment: - sdk: ^2.17.0 -dependencies: - mason: any - foo: - path: ../../foo -dev_dependencies: - test: any -''', - ); - File(path.join(directory.path, 'pubspec.lock')).writeAsStringSync( - fooPath, - ); - final exitCalls = []; - await preGen( - context, - buildConfiguration: (_) => configuration, - exit: exitCalls.add, - directory: directory, - runProcess: successRunProcess, - copyPath: (_, __) async {}, - ); - - expect(exitCalls, isEmpty); - directory.delete(recursive: true).ignore(); - }, - ); - - test('retains invokeCustomEntrypoint (true)', () async { - const configuration = RouteConfiguration( - middleware: [], - directories: [], - routes: [], - rogueRoutes: [], - endpoints: {}, - invokeCustomEntrypoint: true, - ); - final exitCalls = []; - await preGen( - context, - buildConfiguration: (_) => configuration, - exit: exitCalls.add, - runProcess: successRunProcess, - ); - expect(exitCalls, isEmpty); - verifyNever(() => logger.err(any())); - expect( - context.vars, - equals({ - 'directories': [], - 'routes': [], - 'middleware': [], - 'globalMiddleware': false, - 'serveStaticFiles': false, - 'invokeCustomEntrypoint': true, - 'invokeCustomInit': false, - 'pathDependencies': [], - 'hasExternalDependencies': false, - 'externalPathDependencies': [], - 'dartVersion': 'stable', - 'addDockerfile': true, - }), - ); - }); - - test("don't create the dockerfile if one already exists on the folder.", - () async { - const configuration = RouteConfiguration( - middleware: [], - directories: [], - routes: [], - rogueRoutes: [], - endpoints: {}, - ); - - final directory = Directory.systemTemp.createTempSync(); - File(path.join(directory.path, 'pubspec.yaml')).writeAsStringSync( - ''' -name: example -version: 0.1.0 -environment: - sdk: ^2.17.0 -dependencies: - mason: any - test: any -''', - ); - - File(path.join(directory.path, 'pubspec.lock')).writeAsStringSync( - noPathDependencies, - ); - File(path.join(directory.path, 'Dockerfile')).writeAsStringSync( - '', - ); - - final exitCalls = []; - await preGen( - context, - buildConfiguration: (_) => configuration, - exit: exitCalls.add, - directory: directory, - runProcess: successRunProcess, - ); - - expect( - context.vars, - equals({ - 'directories': [], - 'routes': [], - 'middleware': [], - 'globalMiddleware': false, - 'serveStaticFiles': false, - 'invokeCustomEntrypoint': false, - 'invokeCustomInit': false, - 'hasExternalDependencies': false, - 'externalPathDependencies': [], - 'pathDependencies': [], - 'dartVersion': 'stable', - 'addDockerfile': false, - }), - ); - directory.delete(recursive: true).ignore(); - }); - - test('retains invokeCustomInit (true)', () async { - const configuration = RouteConfiguration( - middleware: [], - directories: [], - routes: [], - rogueRoutes: [], - endpoints: {}, - invokeCustomInit: true, - ); - final exitCalls = []; - await preGen( - context, - buildConfiguration: (_) => configuration, - exit: exitCalls.add, - runProcess: successRunProcess, - ); - expect(exitCalls, isEmpty); - verifyNever(() => logger.err(any())); - expect( - context.vars, - equals({ - 'directories': [], - 'routes': [], - 'middleware': [], - 'globalMiddleware': false, - 'serveStaticFiles': false, - 'invokeCustomEntrypoint': false, - 'invokeCustomInit': true, - 'hasExternalDependencies': false, - 'externalPathDependencies': [], - 'pathDependencies': [], - 'dartVersion': 'stable', - 'addDockerfile': true, - }), - ); - }); - - test( - 'updates context.vars when buildRouteConfiguration succeeds', - () async { - const configuration = RouteConfiguration( - globalMiddleware: MiddlewareFile( - name: 'middleware', - path: 'middleware.dart', - ), - middleware: [ - MiddlewareFile( - name: 'hello_middleware', - path: 'hello/middleware.dart', - ), - ], - directories: [ - RouteDirectory( - name: '_', - route: '/', - middleware: [], - files: [ - RouteFile( - name: 'index', - path: 'index.dart', - route: '/', - params: [], - wildcard: false, - ), - RouteFile( - name: 'hello', - path: 'hello.dart', - route: '/hello', - params: [], - wildcard: false, - ), - ], - params: [], - ), - ], - routes: [ - RouteFile( - name: 'index', - path: 'index.dart', - route: '/', - params: [], - wildcard: false, - ), - RouteFile( - name: 'hello', - path: 'hello.dart', - route: '/hello', - params: [], - wildcard: false, - ), - ], - rogueRoutes: [], - endpoints: { - '/': [ - RouteFile( - name: 'index', - path: 'index.dart', - route: '/', - params: [], - wildcard: false, - ), - ], - '/hello': [ - RouteFile( - name: 'hello', - path: 'hello.dart', - route: '/hello', - params: [], - wildcard: false, - ), - ], - }, - serveStaticFiles: true, - ); - final exitCalls = []; - await preGen( - context, - buildConfiguration: (_) => configuration, - exit: exitCalls.add, - runProcess: successRunProcess, - ); - expect(exitCalls, isEmpty); - verifyNever(() => logger.err(any())); - expect( - context.vars, - equals({ - 'directories': [ - { - 'name': '_', - 'route': '/', - 'middleware': >[], - 'files': [ - { - 'name': 'index', - 'path': 'index.dart', - 'route': '/', - 'file_params': const [], - 'wildcard': false, - }, - { - 'name': 'hello', - 'path': 'hello.dart', - 'route': '/hello', - 'file_params': const [], - 'wildcard': false, - } - ], - 'directory_params': const [], - } - ], - 'routes': [ - { - 'name': 'index', - 'path': 'index.dart', - 'route': '/', - 'file_params': const [], - 'wildcard': false, - }, - { - 'name': 'hello', - 'path': 'hello.dart', - 'route': '/hello', - 'file_params': const [], - 'wildcard': false, - } - ], - 'middleware': [ - { - 'name': 'hello_middleware', - 'path': 'hello/middleware.dart', - }, - ], - 'globalMiddleware': { - 'name': 'middleware', - 'path': 'middleware.dart', - }, - 'serveStaticFiles': true, - 'invokeCustomEntrypoint': false, - 'invokeCustomInit': false, - 'hasExternalDependencies': false, - 'externalPathDependencies': [], - 'pathDependencies': [], - 'dartVersion': 'stable', - 'addDockerfile': true, - }), - ); - }, - ); - }); -} diff --git a/bricks/dart_frog_prod_server/hooks/test/pubspeck_locks.dart b/bricks/dart_frog_prod_server/hooks/test/pubspeck_locks.dart deleted file mode 100644 index f8bdf591a..000000000 --- a/bricks/dart_frog_prod_server/hooks/test/pubspeck_locks.dart +++ /dev/null @@ -1,1316 +0,0 @@ -const fooPath = ''' -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - sha256: "58826e40314219b223f4723dd4205845040161cdc2df3e6a1cdceed5d8165084" - url: "https://pub.dev" - source: hosted - version: "63.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - sha256: f85566ec7b3d25cbea60f7dd4f157c5025f2f19233ca4feeed33b616c78a26a3 - url: "https://pub.dev" - source: hosted - version: "6.1.0" - archive: - dependency: transitive - description: - name: archive - sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a" - url: "https://pub.dev" - source: hosted - version: "3.3.7" - args: - dependency: transitive - description: - name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 - url: "https://pub.dev" - source: hosted - version: "2.4.2" - async: - dependency: transitive - description: - name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.dev" - source: hosted - version: "2.11.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" - source: hosted - version: "2.0.3" - collection: - dependency: transitive - description: - name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a - url: "https://pub.dev" - source: hosted - version: "1.18.0" - convert: - dependency: transitive - description: - name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - coverage: - dependency: transitive - description: - name: coverage - sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" - url: "https://pub.dev" - source: hosted - version: "1.6.3" - crypto: - dependency: transitive - description: - name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab - url: "https://pub.dev" - source: hosted - version: "3.0.3" - file: - dependency: transitive - description: - name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" - url: "https://pub.dev" - source: hosted - version: "7.0.0" - foo: - dependency: "direct main" - description: - path: "../../foo" - relative: true - source: path - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" - url: "https://pub.dev" - source: hosted - version: "3.2.0" - glob: - dependency: transitive - description: - name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - http: - dependency: transitive - description: - name: http - sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" - url: "https://pub.dev" - source: hosted - version: "3.2.1" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.dev" - source: hosted - version: "4.0.2" - io: - dependency: transitive - description: - name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" - url: "https://pub.dev" - source: hosted - version: "1.0.4" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 - url: "https://pub.dev" - source: hosted - version: "4.8.1" - logging: - dependency: transitive - description: - name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - mason: - dependency: "direct main" - description: - name: mason - sha256: fdc9ea905e7c690fe39d2f9946b7aead86fd976f8edf97d2521a65d260bbf509 - url: "https://pub.dev" - source: hosted - version: "0.1.0-dev.50" - mason_logger: - dependency: transitive - description: - name: mason_logger - sha256: c12860ae81f0bdc5d05d7914fe473bfb294047e9dc64e8995b5753c7207e81b9 - url: "https://pub.dev" - source: hosted - version: "0.2.8" - matcher: - dependency: transitive - description: - name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" - url: "https://pub.dev" - source: hosted - version: "0.12.16" - meta: - dependency: transitive - description: - name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - mime: - dependency: transitive - description: - name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e - url: "https://pub.dev" - source: hosted - version: "1.0.4" - mustache_template: - dependency: transitive - description: - name: mustache_template - sha256: a46e26f91445bfb0b60519be280555b06792460b27b19e2b19ad5b9740df5d1c - url: "https://pub.dev" - source: hosted - version: "2.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - package_config: - dependency: transitive - description: - name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - path: - dependency: transitive - description: - name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" - url: "https://pub.dev" - source: hosted - version: "1.8.3" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" - url: "https://pub.dev" - source: hosted - version: "3.7.3" - pool: - dependency: transitive - description: - name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" - source: hosted - version: "1.5.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - shelf: - dependency: transitive - description: - name: shelf - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 - url: "https://pub.dev" - source: hosted - version: "1.4.1" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - shelf_static: - dependency: transitive - description: - name: shelf_static - sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e - url: "https://pub.dev" - source: hosted - version: "1.1.2" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" - url: "https://pub.dev" - source: hosted - version: "1.0.4" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - source_maps: - dependency: transitive - description: - name: source_maps - sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" - url: "https://pub.dev" - source: hosted - version: "0.10.12" - source_span: - dependency: transitive - description: - name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev" - source: hosted - version: "1.10.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" - url: "https://pub.dev" - source: hosted - version: "1.11.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.dev" - source: hosted - version: "2.1.2" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - test: - dependency: "direct dev" - description: - name: test - sha256: "9b0dd8e36af4a5b1569029949d50a52cb2a2a2fdaa20cebb96e6603b9ae241f9" - url: "https://pub.dev" - source: hosted - version: "1.24.6" - test_api: - dependency: transitive - description: - name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" - url: "https://pub.dev" - source: hosted - version: "0.6.1" - test_core: - dependency: transitive - description: - name: test_core - sha256: "4bef837e56375537055fdbbbf6dd458b1859881f4c7e6da936158f77d61ab265" - url: "https://pub.dev" - source: hosted - version: "0.5.6" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c - url: "https://pub.dev" - source: hosted - version: "1.3.2" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: "0fae432c85c4ea880b33b497d32824b97795b04cdaa74d270219572a1f50268d" - url: "https://pub.dev" - source: hosted - version: "11.9.0" - watcher: - dependency: transitive - description: - name: watcher - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b - url: "https://pub.dev" - source: hosted - version: "2.4.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.dev" - source: hosted - version: "3.1.2" -sdks: - dart: ">=3.0.0 <4.0.0" -'''; - -const fooPathWithInternalDependency = ''' -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - sha256: "58826e40314219b223f4723dd4205845040161cdc2df3e6a1cdceed5d8165084" - url: "https://pub.dev" - source: hosted - version: "63.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - sha256: f85566ec7b3d25cbea60f7dd4f157c5025f2f19233ca4feeed33b616c78a26a3 - url: "https://pub.dev" - source: hosted - version: "6.1.0" - archive: - dependency: transitive - description: - name: archive - sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a" - url: "https://pub.dev" - source: hosted - version: "3.3.7" - args: - dependency: transitive - description: - name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 - url: "https://pub.dev" - source: hosted - version: "2.4.2" - async: - dependency: transitive - description: - name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.dev" - source: hosted - version: "2.11.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" - source: hosted - version: "2.0.3" - collection: - dependency: transitive - description: - name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a - url: "https://pub.dev" - source: hosted - version: "1.18.0" - convert: - dependency: transitive - description: - name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - coverage: - dependency: transitive - description: - name: coverage - sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" - url: "https://pub.dev" - source: hosted - version: "1.6.3" - crypto: - dependency: transitive - description: - name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab - url: "https://pub.dev" - source: hosted - version: "3.0.3" - file: - dependency: transitive - description: - name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" - url: "https://pub.dev" - source: hosted - version: "7.0.0" - foo: - dependency: "direct main" - description: - path: "../../foo" - relative: true - source: path - version: "0.0.0" - bar: - dependency: "direct main" - description: - path: "packages/bar" - relative: true - source: path - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" - url: "https://pub.dev" - source: hosted - version: "3.2.0" - glob: - dependency: transitive - description: - name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - http: - dependency: transitive - description: - name: http - sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" - url: "https://pub.dev" - source: hosted - version: "3.2.1" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.dev" - source: hosted - version: "4.0.2" - io: - dependency: transitive - description: - name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" - url: "https://pub.dev" - source: hosted - version: "1.0.4" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 - url: "https://pub.dev" - source: hosted - version: "4.8.1" - logging: - dependency: transitive - description: - name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - mason: - dependency: "direct main" - description: - name: mason - sha256: fdc9ea905e7c690fe39d2f9946b7aead86fd976f8edf97d2521a65d260bbf509 - url: "https://pub.dev" - source: hosted - version: "0.1.0-dev.50" - mason_logger: - dependency: transitive - description: - name: mason_logger - sha256: c12860ae81f0bdc5d05d7914fe473bfb294047e9dc64e8995b5753c7207e81b9 - url: "https://pub.dev" - source: hosted - version: "0.2.8" - matcher: - dependency: transitive - description: - name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" - url: "https://pub.dev" - source: hosted - version: "0.12.16" - meta: - dependency: transitive - description: - name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - mime: - dependency: transitive - description: - name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e - url: "https://pub.dev" - source: hosted - version: "1.0.4" - mustache_template: - dependency: transitive - description: - name: mustache_template - sha256: a46e26f91445bfb0b60519be280555b06792460b27b19e2b19ad5b9740df5d1c - url: "https://pub.dev" - source: hosted - version: "2.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - package_config: - dependency: transitive - description: - name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - path: - dependency: transitive - description: - name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" - url: "https://pub.dev" - source: hosted - version: "1.8.3" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" - url: "https://pub.dev" - source: hosted - version: "3.7.3" - pool: - dependency: transitive - description: - name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" - source: hosted - version: "1.5.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - shelf: - dependency: transitive - description: - name: shelf - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 - url: "https://pub.dev" - source: hosted - version: "1.4.1" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - shelf_static: - dependency: transitive - description: - name: shelf_static - sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e - url: "https://pub.dev" - source: hosted - version: "1.1.2" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" - url: "https://pub.dev" - source: hosted - version: "1.0.4" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - source_maps: - dependency: transitive - description: - name: source_maps - sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" - url: "https://pub.dev" - source: hosted - version: "0.10.12" - source_span: - dependency: transitive - description: - name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev" - source: hosted - version: "1.10.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" - url: "https://pub.dev" - source: hosted - version: "1.11.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.dev" - source: hosted - version: "2.1.2" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - test: - dependency: "direct dev" - description: - name: test - sha256: "9b0dd8e36af4a5b1569029949d50a52cb2a2a2fdaa20cebb96e6603b9ae241f9" - url: "https://pub.dev" - source: hosted - version: "1.24.6" - test_api: - dependency: transitive - description: - name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" - url: "https://pub.dev" - source: hosted - version: "0.6.1" - test_core: - dependency: transitive - description: - name: test_core - sha256: "4bef837e56375537055fdbbbf6dd458b1859881f4c7e6da936158f77d61ab265" - url: "https://pub.dev" - source: hosted - version: "0.5.6" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c - url: "https://pub.dev" - source: hosted - version: "1.3.2" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: "0fae432c85c4ea880b33b497d32824b97795b04cdaa74d270219572a1f50268d" - url: "https://pub.dev" - source: hosted - version: "11.9.0" - watcher: - dependency: transitive - description: - name: watcher - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b - url: "https://pub.dev" - source: hosted - version: "2.4.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.dev" - source: hosted - version: "3.1.2" -sdks: - dart: ">=3.0.0 <4.0.0" -'''; - -const noPathDependencies = ''' -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - sha256: "58826e40314219b223f4723dd4205845040161cdc2df3e6a1cdceed5d8165084" - url: "https://pub.dev" - source: hosted - version: "63.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - sha256: f85566ec7b3d25cbea60f7dd4f157c5025f2f19233ca4feeed33b616c78a26a3 - url: "https://pub.dev" - source: hosted - version: "6.1.0" - archive: - dependency: transitive - description: - name: archive - sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a" - url: "https://pub.dev" - source: hosted - version: "3.3.7" - args: - dependency: transitive - description: - name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 - url: "https://pub.dev" - source: hosted - version: "2.4.2" - async: - dependency: transitive - description: - name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.dev" - source: hosted - version: "2.11.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" - source: hosted - version: "2.0.3" - collection: - dependency: transitive - description: - name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a - url: "https://pub.dev" - source: hosted - version: "1.18.0" - convert: - dependency: transitive - description: - name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - coverage: - dependency: transitive - description: - name: coverage - sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" - url: "https://pub.dev" - source: hosted - version: "1.6.3" - crypto: - dependency: transitive - description: - name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab - url: "https://pub.dev" - source: hosted - version: "3.0.3" - file: - dependency: transitive - description: - name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" - url: "https://pub.dev" - source: hosted - version: "7.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" - url: "https://pub.dev" - source: hosted - version: "3.2.0" - glob: - dependency: transitive - description: - name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - http: - dependency: transitive - description: - name: http - sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" - url: "https://pub.dev" - source: hosted - version: "3.2.1" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.dev" - source: hosted - version: "4.0.2" - io: - dependency: transitive - description: - name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" - url: "https://pub.dev" - source: hosted - version: "1.0.4" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 - url: "https://pub.dev" - source: hosted - version: "4.8.1" - logging: - dependency: transitive - description: - name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - mason: - dependency: "direct main" - description: - name: mason - sha256: fdc9ea905e7c690fe39d2f9946b7aead86fd976f8edf97d2521a65d260bbf509 - url: "https://pub.dev" - source: hosted - version: "0.1.0-dev.50" - mason_logger: - dependency: transitive - description: - name: mason_logger - sha256: c12860ae81f0bdc5d05d7914fe473bfb294047e9dc64e8995b5753c7207e81b9 - url: "https://pub.dev" - source: hosted - version: "0.2.8" - matcher: - dependency: transitive - description: - name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" - url: "https://pub.dev" - source: hosted - version: "0.12.16" - meta: - dependency: transitive - description: - name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - mime: - dependency: transitive - description: - name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e - url: "https://pub.dev" - source: hosted - version: "1.0.4" - mustache_template: - dependency: transitive - description: - name: mustache_template - sha256: a46e26f91445bfb0b60519be280555b06792460b27b19e2b19ad5b9740df5d1c - url: "https://pub.dev" - source: hosted - version: "2.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - package_config: - dependency: transitive - description: - name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - path: - dependency: transitive - description: - name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" - url: "https://pub.dev" - source: hosted - version: "1.8.3" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" - url: "https://pub.dev" - source: hosted - version: "3.7.3" - pool: - dependency: transitive - description: - name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" - source: hosted - version: "1.5.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - shelf: - dependency: transitive - description: - name: shelf - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 - url: "https://pub.dev" - source: hosted - version: "1.4.1" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - shelf_static: - dependency: transitive - description: - name: shelf_static - sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e - url: "https://pub.dev" - source: hosted - version: "1.1.2" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" - url: "https://pub.dev" - source: hosted - version: "1.0.4" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - source_maps: - dependency: transitive - description: - name: source_maps - sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" - url: "https://pub.dev" - source: hosted - version: "0.10.12" - source_span: - dependency: transitive - description: - name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev" - source: hosted - version: "1.10.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" - url: "https://pub.dev" - source: hosted - version: "1.11.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.dev" - source: hosted - version: "2.1.2" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - test: - dependency: "direct main" - description: - name: test - sha256: "9b0dd8e36af4a5b1569029949d50a52cb2a2a2fdaa20cebb96e6603b9ae241f9" - url: "https://pub.dev" - source: hosted - version: "1.24.6" - test_api: - dependency: transitive - description: - name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" - url: "https://pub.dev" - source: hosted - version: "0.6.1" - test_core: - dependency: transitive - description: - name: test_core - sha256: "4bef837e56375537055fdbbbf6dd458b1859881f4c7e6da936158f77d61ab265" - url: "https://pub.dev" - source: hosted - version: "0.5.6" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c - url: "https://pub.dev" - source: hosted - version: "1.3.2" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: "0fae432c85c4ea880b33b497d32824b97795b04cdaa74d270219572a1f50268d" - url: "https://pub.dev" - source: hosted - version: "11.9.0" - watcher: - dependency: transitive - description: - name: watcher - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b - url: "https://pub.dev" - source: hosted - version: "2.4.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.dev" - source: hosted - version: "3.1.2" -sdks: - dart: ">=3.0.0 <4.0.0" -'''; diff --git a/bricks/dart_frog_prod_server/hooks/test/src/create_bundle_test.dart b/bricks/dart_frog_prod_server/hooks/test/src/create_bundle_test.dart deleted file mode 100644 index 82800a693..000000000 --- a/bricks/dart_frog_prod_server/hooks/test/src/create_bundle_test.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'dart:io'; - -import 'package:mason/mason.dart' hide createBundle; -import 'package:mocktail/mocktail.dart'; -import 'package:path/path.dart' as path; -import 'package:test/test.dart'; - -import '../../src/create_bundle.dart'; - -class _MockLogger extends Mock implements Logger {} - -class _MockProgress extends Mock implements Progress {} - -class _FakeHookContext extends Fake implements HookContext { - _FakeHookContext({Logger? logger}) : _logger = logger ?? _MockLogger(); - - final Logger _logger; - - var _vars = {}; - - @override - Map get vars => _vars; - - @override - set vars(Map value) => _vars = value; - - @override - Logger get logger => _logger; -} - -void main() { - group('createBundle', () { - late HookContext context; - late Logger logger; - - setUp(() { - logger = _MockLogger(); - context = _FakeHookContext(logger: logger); - - when(() => logger.progress(any())).thenReturn(_MockProgress()); - }); - - test('exit(1) if bundling throws', () async { - final exitCalls = []; - await createBundle(context, Directory('/invalid/dir'), exitCalls.add); - expect(exitCalls, equals([1])); - verify(() => logger.err(any())).called(1); - }); - - test('does not throw when bundling succeeds', () async { - final exitCalls = []; - final directory = Directory.systemTemp.createTempSync(); - final dotDartFrogDir = Directory(path.join(directory.path, '.dart_frog')) - ..createSync(); - final buildDir = Directory(path.join(directory.path, 'build')) - ..createSync(); - final oldBuildArtifact = File(path.join(buildDir.path, 'artifact.txt')) - ..createSync(); - await createBundle(context, directory, exitCalls.add); - expect(dotDartFrogDir.existsSync(), isFalse); - expect(buildDir.existsSync(), isTrue); - expect(oldBuildArtifact.existsSync(), isFalse); - expect(exitCalls, isEmpty); - verifyNever(() => logger.err(any())); - }); - }); -} diff --git a/bricks/dart_frog_prod_server/hooks/test/src/create_external_packages_folder_test.dart b/bricks/dart_frog_prod_server/hooks/test/src/create_external_packages_folder_test.dart deleted file mode 100644 index 47e79dd73..000000000 --- a/bricks/dart_frog_prod_server/hooks/test/src/create_external_packages_folder_test.dart +++ /dev/null @@ -1,116 +0,0 @@ -import 'dart:io'; - -import 'package:path/path.dart' as path; -import 'package:test/test.dart'; - -import '../../src/create_external_packages_folder.dart'; -import '../pubspeck_locks.dart'; - -void main() { - group('createExternalPackagesFolder', () { - test( - 'bundles external dependencies with external dependencies', - () async { - final directory = Directory.systemTemp.createTempSync(); - File(path.join(directory.path, 'pubspec.yaml')).writeAsStringSync( - ''' -name: example -version: 0.1.0 -environment: - sdk: ^2.17.0 -dependencies: - mason: any - foo: - path: ../../foo -dev_dependencies: - test: any -''', - ); - File(path.join(directory.path, 'pubspec.lock')).writeAsStringSync( - fooPath, - ); - final copyCalls = []; - - await createExternalPackagesFolder( - directory, - copyPath: (from, to) { - copyCalls.add('$from -> $to'); - return Future.value(); - }, - ); - - final from = path.join(directory.path, '../../foo'); - final to = path.join( - directory.path, - 'build', - '.dart_frog_path_dependencies', - 'foo', - ); - expect(copyCalls, ['$from -> $to']); - }, - ); - - test( - "don't bundle internal path dependencies", - () async { - final directory = Directory.systemTemp.createTempSync(); - File(path.join(directory.path, 'pubspec.yaml')).writeAsStringSync( - ''' -name: example -version: 0.1.0 -environment: - sdk: ^2.17.0 -dependencies: - mason: any - foo: - path: ../../foo - bar: - path: packages/bar -dev_dependencies: - test: any -''', - ); - File(path.join(directory.path, 'pubspec.lock')).writeAsStringSync( - fooPathWithInternalDependency, - ); - final copyCalls = []; - - File( - path.join( - directory.path, - 'packages', - 'bar', - 'pubspec.yaml', - ), - ) - ..createSync(recursive: true) - ..writeAsStringSync( - ''' - -name: bar -version: 0.1.0 -environment: - sdk: ^2.17.0 - ''', - ); - - await createExternalPackagesFolder( - directory, - copyPath: (from, to) { - copyCalls.add('$from -> $to'); - return Future.value(); - }, - ); - - final from = path.join(directory.path, '../../foo'); - final to = path.join( - directory.path, - 'build', - '.dart_frog_path_dependencies', - 'foo', - ); - expect(copyCalls, ['$from -> $to']); - }, - ); - }); -} diff --git a/bricks/dart_frog_prod_server/hooks/test/src/dart_pub_get_test.dart b/bricks/dart_frog_prod_server/hooks/test/src/dart_pub_get_test.dart deleted file mode 100644 index 0295881f9..000000000 --- a/bricks/dart_frog_prod_server/hooks/test/src/dart_pub_get_test.dart +++ /dev/null @@ -1,127 +0,0 @@ -import 'dart:io'; - -import 'package:mason/mason.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:test/test.dart'; - -import '../../src/dart_pub_get.dart'; - -class _FakeHookContext extends Fake implements HookContext { - _FakeHookContext({Logger? logger}) : _logger = logger ?? _MockLogger(); - - final Logger _logger; - - var _vars = {}; - - @override - Map get vars => _vars; - - @override - set vars(Map value) => _vars = value; - - @override - Logger get logger => _logger; -} - -class _MockLogger extends Mock implements Logger {} - -class _MockProgress extends Mock implements Progress {} - -void main() { - group('dartPubGet', () { - late HookContext context; - late Logger logger; - - const processId = 42; - final processResult = ProcessResult( - processId, - ExitCode.success.code, - '', - '', - ); - - setUp(() { - logger = _MockLogger(); - context = _FakeHookContext(logger: logger); - - when(() => logger.progress(any())).thenReturn(_MockProgress()); - }); - - test('completes when process succeeds', () async { - final exitCalls = []; - - await dartPubGet( - context, - workingDirectory: '.', - runProcess: ( - executable, - args, { - String? workingDirectory, - bool? runInShell, - }) async { - expect(executable, equals('dart')); - expect(args, equals(['pub', 'get'])); - expect(workingDirectory, equals('.')); - expect(runInShell, isTrue); - return processResult; - }, - exit: exitCalls.add, - ); - expect(exitCalls, isEmpty); - verifyNever(() => logger.err(any())); - }); - - test('exits when process fails', () async { - const error = 'oops something went wrong'; - final exitCalls = []; - - final processResult = ProcessResult( - processId, - ExitCode.software.code, - '', - error, - ); - - await dartPubGet( - context, - workingDirectory: '.', - runProcess: ( - executable, - args, { - String? workingDirectory, - bool? runInShell, - }) async { - return processResult; - }, - exit: exitCalls.add, - ); - expect(exitCalls, equals([ExitCode.software.code])); - verify(() => logger.err(error)).called(1); - }); - - test('exits when ProcessException occurs', () async { - const error = 'oops something went wrong'; - final exitCalls = []; - await dartPubGet( - context, - workingDirectory: '.', - runProcess: ( - executable, - args, { - String? workingDirectory, - bool? runInShell, - }) async { - throw ProcessException( - 'dart', - ['pub', 'get'], - error, - ExitCode.software.code, - ); - }, - exit: exitCalls.add, - ); - expect(exitCalls, equals([ExitCode.software.code])); - verify(() => logger.err(error)).called(1); - }); - }); -} diff --git a/bricks/dart_frog_prod_server/hooks/test/src/exit_overrides_test.dart b/bricks/dart_frog_prod_server/hooks/test/src/exit_overrides_test.dart deleted file mode 100644 index 6d6541dd5..000000000 --- a/bricks/dart_frog_prod_server/hooks/test/src/exit_overrides_test.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'dart:io'; - -import 'package:test/test.dart'; - -import '../../src/exit_overrides.dart'; - -void main() { - group('ExitOverrides', () { - group('runZoned', () { - test('uses default exit when not specified', () { - ExitOverrides.runZoned(() { - final overrides = ExitOverrides.current; - expect(overrides!.exit, equals(exit)); - }); - }); - - test('uses custom exit when specified', () { - ExitOverrides.runZoned( - () { - final overrides = ExitOverrides.current; - expect(overrides!.exit, isNot(equals(exit))); - }, - exit: (_) {}, - ); - }); - }); - }); -} diff --git a/bricks/dart_frog_prod_server/hooks/test/src/get_internal_path_dependencies_test.dart b/bricks/dart_frog_prod_server/hooks/test/src/get_internal_path_dependencies_test.dart deleted file mode 100644 index 935540c6e..000000000 --- a/bricks/dart_frog_prod_server/hooks/test/src/get_internal_path_dependencies_test.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'dart:io'; - -import 'package:path/path.dart' as path; -import 'package:test/test.dart'; - -import '../../src/get_internal_path_dependencies.dart'; - -void main() { - group('getPathDependencies', () { - test('returns nothing when there are no path dependencies', () { - final directory = Directory.systemTemp.createTempSync(); - File(path.join(directory.path, 'pubspec.lock')).writeAsStringSync( - ''' -packages: - test: - dependency: transitive - description: - name: analyzer - sha256: f85566ec7b3d25cbea60f7dd4f157c5025f2f19233ca4feeed33b616c78a26a3 - url: "https://pub.dev" - source: hosted - version: "6.1.0" - mason: - dependency: transitive - description: - name: analyzer - sha256: f85566ec7b3d25cbea60f7dd4f157c5025f2f19233ca4feeed33b616c78a26a3 - url: "https://pub.dev" - source: hosted - version: "6.1.0" -''', - ); - expect(getInternalPathDependencies(directory), completion(isEmpty)); - directory.delete(recursive: true).ignore(); - }); - - test('returns correct path dependencies', () { - final directory = Directory.systemTemp.createTempSync(); - File(path.join(directory.path, 'pubspec.lock')).writeAsStringSync( - ''' -packages: - dart_frog: - dependency: "direct main" - description: - path: "path/to/dart_frog" - relative: true - source: path - version: "0.0.0" - dart_frog_gen: - dependency: "direct main" - description: - path: "path/to/dart_frog_gen" - relative: true - source: path - version: "0.0.0" -''', - ); - expect( - getInternalPathDependencies(directory), - completion( - equals(['path/to/dart_frog', 'path/to/dart_frog_gen']), - ), - ); - directory.delete(recursive: true).ignore(); - }); - }); -} diff --git a/bricks/dart_frog_dev_server/__brick__/server.dart b/bricks_gen/dart_frog_dev_server/__brick__/server.dart similarity index 100% rename from bricks/dart_frog_dev_server/__brick__/server.dart rename to bricks_gen/dart_frog_dev_server/__brick__/server.dart diff --git a/bricks/dart_frog_dev_server/brick.yaml b/bricks_gen/dart_frog_dev_server/brick.yaml similarity index 100% rename from bricks/dart_frog_dev_server/brick.yaml rename to bricks_gen/dart_frog_dev_server/brick.yaml diff --git a/bricks/dart_frog_prod_server/__brick__/build/.dockerignore b/bricks_gen/dart_frog_prod_server/__brick__/build/.dockerignore similarity index 100% rename from bricks/dart_frog_prod_server/__brick__/build/.dockerignore rename to bricks_gen/dart_frog_prod_server/__brick__/build/.dockerignore diff --git a/bricks/dart_frog_prod_server/__brick__/build/bin/server.dart b/bricks_gen/dart_frog_prod_server/__brick__/build/bin/server.dart similarity index 100% rename from bricks/dart_frog_prod_server/__brick__/build/bin/server.dart rename to bricks_gen/dart_frog_prod_server/__brick__/build/bin/server.dart diff --git a/bricks/dart_frog_prod_server/__brick__/build/{{#addDockerfile}}Dockerfile{{/addDockerfile}} b/bricks_gen/dart_frog_prod_server/__brick__/build/{{#addDockerfile}}Dockerfile{{/addDockerfile}} similarity index 100% rename from bricks/dart_frog_prod_server/__brick__/build/{{#addDockerfile}}Dockerfile{{/addDockerfile}} rename to bricks_gen/dart_frog_prod_server/__brick__/build/{{#addDockerfile}}Dockerfile{{/addDockerfile}} diff --git a/bricks/dart_frog_prod_server/brick.yaml b/bricks_gen/dart_frog_prod_server/brick.yaml similarity index 100% rename from bricks/dart_frog_prod_server/brick.yaml rename to bricks_gen/dart_frog_prod_server/brick.yaml diff --git a/packages/dart_frog_cli/e2e/test/daemon/dev_server_domain_test.dart b/packages/dart_frog_cli/e2e/test/daemon/dev_server_domain_test.dart index 8ab995092..520efc437 100644 --- a/packages/dart_frog_cli/e2e/test/daemon/dev_server_domain_test.dart +++ b/packages/dart_frog_cli/e2e/test/daemon/dev_server_domain_test.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; import 'package:dart_frog_cli/src/daemon/daemon.dart'; + import 'package:http/http.dart' as http; import 'package:path/path.dart' as path; import 'package:test/test.dart'; diff --git a/packages/dart_frog_cli/e2e/test/daemon/route_configuration_domain_test.dart b/packages/dart_frog_cli/e2e/test/daemon/route_configuration_domain_test.dart index 2e18e0ccf..ba7b4daeb 100644 --- a/packages/dart_frog_cli/e2e/test/daemon/route_configuration_domain_test.dart +++ b/packages/dart_frog_cli/e2e/test/daemon/route_configuration_domain_test.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:dart_frog_cli/src/daemon/daemon.dart'; + import 'package:path/path.dart' as path; import 'package:test/test.dart'; diff --git a/packages/dart_frog_cli/e2e/test/helpers/dart_frog_daemon.dart b/packages/dart_frog_cli/e2e/test/helpers/dart_frog_daemon.dart index 3733f3cf2..1cd9e2586 100644 --- a/packages/dart_frog_cli/e2e/test/helpers/dart_frog_daemon.dart +++ b/packages/dart_frog_cli/e2e/test/helpers/dart_frog_daemon.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:dart_frog_cli/src/daemon/daemon.dart'; + import 'package:test/test.dart'; /// Starts the dart_frog daemon in the given directory. diff --git a/packages/dart_frog_cli/lib/src/command.dart b/packages/dart_frog_cli/lib/src/command.dart index bc851d7ca..18fe75490 100644 --- a/packages/dart_frog_cli/lib/src/command.dart +++ b/packages/dart_frog_cli/lib/src/command.dart @@ -4,6 +4,8 @@ import 'package:args/args.dart'; import 'package:args/command_runner.dart'; import 'package:dart_frog_cli/src/command_runner.dart'; import 'package:mason/mason.dart'; + + import 'package:meta/meta.dart'; /// {@template dart_frog_command} @@ -44,3 +46,7 @@ abstract class DartFrogCommand extends Command { /// Return the current working directory. Directory get cwd => testCwd ?? Directory.current; } + +mixin PluginHandler on DartFrogCommand { + +} diff --git a/packages/dart_frog_cli/lib/src/command_runner.dart b/packages/dart_frog_cli/lib/src/command_runner.dart index ed670ef6d..29685e585 100644 --- a/packages/dart_frog_cli/lib/src/command_runner.dart +++ b/packages/dart_frog_cli/lib/src/command_runner.dart @@ -7,6 +7,7 @@ import 'package:dart_frog_cli/src/commands/commands.dart'; import 'package:dart_frog_cli/src/commands/update/update.dart'; import 'package:dart_frog_cli/src/version.dart'; import 'package:mason/mason.dart' hide packageVersion; + import 'package:pub_updater/pub_updater.dart'; /// Typedef for [io.exit]. diff --git a/packages/dart_frog_cli/lib/src/commands/build/build.dart b/packages/dart_frog_cli/lib/src/commands/build/build.dart index c4564a25e..2063674ec 100644 --- a/packages/dart_frog_cli/lib/src/commands/build/build.dart +++ b/packages/dart_frog_cli/lib/src/commands/build/build.dart @@ -1,10 +1,7 @@ import 'dart:io'; import 'package:dart_frog_cli/src/command.dart'; -import 'package:dart_frog_cli/src/commands/build/templates/dart_frog_prod_server_bundle.dart'; -import 'package:dart_frog_cli/src/commands/commands.dart'; -import 'package:dart_frog_cli/src/runtime_compatibility.dart' - as runtime_compatibility; +import 'package:dart_frog_gen/dart_frog_gen.dart'; import 'package:mason/mason.dart'; /// {@template build_command} @@ -14,11 +11,9 @@ class BuildCommand extends DartFrogCommand { /// {@macro build_command} BuildCommand({ super.logger, - void Function(Directory)? ensureRuntimeCompatibility, - GeneratorBuilder? generator, - }) : _ensureRuntimeCompatibility = ensureRuntimeCompatibility ?? - runtime_compatibility.ensureRuntimeCompatibility, - _generator = generator ?? MasonGenerator.fromBundle { + void Function(Directory)? runtimeCompatibility, + }) : _ensureRuntimeCompatibility = + runtimeCompatibility ?? ensureRuntimeCompatibility { argParser.addOption( 'dart-version', defaultsTo: 'stable', @@ -28,7 +23,6 @@ class BuildCommand extends DartFrogCommand { } final void Function(Directory) _ensureRuntimeCompatibility; - final GeneratorBuilder _generator; @override final String description = 'Create a production build.'; @@ -40,29 +34,20 @@ class BuildCommand extends DartFrogCommand { Future run() async { _ensureRuntimeCompatibility(cwd); - final generator = await _generator(dartFrogProdServerBundle); - var vars = { - 'dartVersion': results['dart-version'], - }; + final dartVersion = argResults!['dart-version'] as String; - logger.detail('[codegen] running pre-gen...'); - await generator.hooks.preGen( - vars: vars, - workingDirectory: cwd.path, - onVarsChanged: (v) => vars = v, + final prodServerBuilder = ProdServerBuilder( + dartVersion: dartVersion, + workingDirectory: cwd, + logger: logger, ); - logger.detail('[codegen] running generate...'); - final _ = await generator.generate( - DirectoryGeneratorTarget(cwd), - vars: vars, - fileConflictResolution: FileConflictResolution.overwrite, - ); - - logger.detail('[codegen] running post-gen...'); - await generator.hooks.postGen(workingDirectory: cwd.path); - - logger.detail('[codegen] complete.'); - return ExitCode.success.code; + try { + final exitCode = await prodServerBuilder.build(); + return exitCode.code; + } catch (e) { + logger.err(e.toString()); + return ExitCode.software.code; + } } } diff --git a/packages/dart_frog_cli/lib/src/commands/build/templates/dart_frog_prod_server_bundle.dart b/packages/dart_frog_cli/lib/src/commands/build/templates/dart_frog_prod_server_bundle.dart deleted file mode 100644 index 764547de2..000000000 --- a/packages/dart_frog_cli/lib/src/commands/build/templates/dart_frog_prod_server_bundle.dart +++ /dev/null @@ -1,161 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint, implicit_dynamic_list_literal, implicit_dynamic_map_literal, inference_failure_on_collection_literal - -import 'package:mason/mason.dart'; - -final dartFrogProdServerBundle = MasonBundle.fromJson({ - "files": [ - { - "path": "build/.dockerignore", - "data": - "LmRvY2tlcmlnbm9yZQpEb2NrZXJmaWxlCmJ1aWxkLwouZGFydF90b29sLwouZ2l0LwouZ2l0aHViLwouZ2l0aWdub3JlCi5pZGVhLwoucGFja2FnZXM=", - "type": "text" - }, - { - "path": "build/bin/server.dart", - "data": - "Ly8gR0VORVJBVEVEIENPREUgLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKLy8gaWdub3JlX2Zvcl9maWxlOiB0eXBlPWxpbnQsIGltcGxpY2l0X2R5bmFtaWNfbGlzdF9saXRlcmFsCgppbXBvcnQgJ2RhcnQ6aW8nOwoKaW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZy9kYXJ0X2Zyb2cuZGFydCc7Cgp7eyNpbnZva2VDdXN0b21FbnRyeXBvaW50fX1pbXBvcnQgJy4uL21haW4uZGFydCcgYXMgZW50cnlwb2ludDt7ey9pbnZva2VDdXN0b21FbnRyeXBvaW50fX0Ke3sjcm91dGVzfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Owp7ey9yb3V0ZXN9fQp7eyNtaWRkbGV3YXJlfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Owp7ey9taWRkbGV3YXJlfX0Kdm9pZCBtYWluKCkgYXN5bmMgewogIGZpbmFsIGFkZHJlc3MgPSBJbnRlcm5ldEFkZHJlc3MuYW55SVB2NjsKICBmaW5hbCBwb3J0ID0gaW50LnRyeVBhcnNlKFBsYXRmb3JtLmVudmlyb25tZW50WydQT1JUJ10gPz8gJzgwODAnKSA/PyA4MDgwO3t7I2ludm9rZUN1c3RvbUluaXR9fQogIGF3YWl0IGVudHJ5cG9pbnQuaW5pdChhZGRyZXNzLCBwb3J0KTt7ey9pbnZva2VDdXN0b21Jbml0fX0KICBjcmVhdGVTZXJ2ZXIoYWRkcmVzcywgcG9ydCk7Cn0KCkZ1dHVyZTxIdHRwU2VydmVyPiBjcmVhdGVTZXJ2ZXIoSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0KSBhc3luYyB7CiAgZmluYWwgaGFuZGxlciA9IENhc2NhZGUoKXt7I3NlcnZlU3RhdGljRmlsZXN9fS5hZGQoY3JlYXRlU3RhdGljRmlsZUhhbmRsZXIoKSl7ey9zZXJ2ZVN0YXRpY0ZpbGVzfX0uYWRkKGJ1aWxkUm9vdEhhbmRsZXIoKSkuaGFuZGxlcjsKICBmaW5hbCBzZXJ2ZXIgPSBhd2FpdCB7eyNpbnZva2VDdXN0b21FbnRyeXBvaW50fX1lbnRyeXBvaW50LnJ1bihoYW5kbGVyLCBhZGRyZXNzLCBwb3J0KXt7L2ludm9rZUN1c3RvbUVudHJ5cG9pbnR9fXt7Xmludm9rZUN1c3RvbUVudHJ5cG9pbnR9fXNlcnZlKGhhbmRsZXIsIGFkZHJlc3MsIHBvcnQpe3svaW52b2tlQ3VzdG9tRW50cnlwb2ludH19OwogIHByaW50KCdceDFCWzkybeKck1x4MUJbMG0gUnVubmluZyBvbiBodHRwOi8vJHtzZXJ2ZXIuYWRkcmVzcy5ob3N0fToke3NlcnZlci5wb3J0fScpOwogIHJldHVybiBzZXJ2ZXI7Cn0KCkhhbmRsZXIgYnVpbGRSb290SGFuZGxlcigpIHsKICBmaW5hbCBwaXBlbGluZSA9IGNvbnN0IFBpcGVsaW5lKCl7eyNnbG9iYWxNaWRkbGV3YXJlfX0uYWRkTWlkZGxld2FyZSh7eyNzbmFrZUNhc2V9fXt7e25hbWV9fX17ey9zbmFrZUNhc2V9fS5taWRkbGV3YXJlKXt7L2dsb2JhbE1pZGRsZXdhcmV9fTsKICBmaW5hbCByb3V0ZXIgPSBSb3V0ZXIoKXt7I2RpcmVjdG9yaWVzfX0KICAgIC4ubW91bnQoJ3t7e3JvdXRlfX19JywgKGNvbnRleHR7eyNkaXJlY3RvcnlfcGFyYW1zLjB9fSx7eyNkaXJlY3RvcnlfcGFyYW1zfX17ey59fSx7ey9kaXJlY3RvcnlfcGFyYW1zfX17ey9kaXJlY3RvcnlfcGFyYW1zLjB9fSkgPT4gYnVpbGR7eyNwYXNjYWxDYXNlfX17e3tuYW1lfX19e3svcGFzY2FsQ2FzZX19SGFuZGxlcih7eyNkaXJlY3RvcnlfcGFyYW1zfX17ey59fSx7ey9kaXJlY3RvcnlfcGFyYW1zfX0pKGNvbnRleHQpKXt7L2RpcmVjdG9yaWVzfX07CiAgcmV0dXJuIHBpcGVsaW5lLmFkZEhhbmRsZXIocm91dGVyKTsKfQp7eyNkaXJlY3Rvcmllc319CkhhbmRsZXIgYnVpbGR7eyNwYXNjYWxDYXNlfX17e3tuYW1lfX19e3svcGFzY2FsQ2FzZX19SGFuZGxlcih7eyNkaXJlY3RvcnlfcGFyYW1zfX1TdHJpbmcge3sufX0se3svZGlyZWN0b3J5X3BhcmFtc319KSB7CiAgZmluYWwgcGlwZWxpbmUgPSBjb25zdCBQaXBlbGluZSgpe3sjbWlkZGxld2FyZS4wfX17eyNtaWRkbGV3YXJlfX0uYWRkTWlkZGxld2FyZSh7eyNzbmFrZUNhc2V9fXt7e25hbWV9fX17ey9zbmFrZUNhc2V9fS5taWRkbGV3YXJlKXt7L21pZGRsZXdhcmV9fXt7L21pZGRsZXdhcmUuMH19OwogIGZpbmFsIHJvdXRlciA9IFJvdXRlcigpCiAgICB7eyNmaWxlc319e3sjd2lsZGNhcmR9fS4ubW91bnQoJ3t7e3JvdXRlfX19JywgKGNvbnRleHQpID0+IHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Lm9uUmVxdWVzdChjb250ZXh0LGNvbnRleHQucmVxdWVzdC51cmwucGF0aCkpe3svd2lsZGNhcmR9fXt7XndpbGRjYXJkfX0uLmFsbCgne3t7cm91dGV9fX0nLCAoY29udGV4dHt7I2ZpbGVfcGFyYW1zLjB9fSx7eyNmaWxlX3BhcmFtc319e3sufX0se3svZmlsZV9wYXJhbXN9fXt7L2ZpbGVfcGFyYW1zLjB9fSkgPT4ge3sjc25ha2VDYXNlfX17e3tuYW1lfX19e3svc25ha2VDYXNlfX0ub25SZXF1ZXN0KGNvbnRleHQse3sjZGlyZWN0b3J5X3BhcmFtc319e3sufX0se3svZGlyZWN0b3J5X3BhcmFtc319e3sjZmlsZV9wYXJhbXN9fXt7Ln19LHt7L2ZpbGVfcGFyYW1zfX0pKXt7L3dpbGRjYXJkfX17ey9maWxlc319OwogIHJldHVybiBwaXBlbGluZS5hZGRIYW5kbGVyKHJvdXRlcik7Cn0Ke3svZGlyZWN0b3JpZXN9fQo=", - "type": "text" - }, - { - "path": "build/{{#addDockerfile}}Dockerfile{{/addDockerfile}}", - "data": - "IyBPZmZpY2lhbCBEYXJ0IGltYWdlOiBodHRwczovL2h1Yi5kb2NrZXIuY29tL18vZGFydAojIFNwZWNpZnkgdGhlIERhcnQgU0RLIGJhc2UgaW1hZ2UgdmVyc2lvbiB1c2luZyBkYXJ0Ojx2ZXJzaW9uPiAoZXg6IGRhcnQ6Mi4xNykKRlJPTSBkYXJ0Ont7ZGFydFZlcnNpb259fSBBUyBidWlsZAoKV09SS0RJUiAvYXBwCnt7I2hhc0V4dGVybmFsRGVwZW5kZW5jaWVzfX0KCiMgQ29weSBleHRlcm5hbCBkZXBlbmRlbmNpZXMKQ09QWSAuLy5kYXJ0X2Zyb2dfcGF0aF9kZXBlbmRlbmNpZXMgIC4vLmRhcnRfZnJvZ19wYXRoX2RlcGVuZGVuY2llcwpDT1BZIC4vcHVic3BlY19vdmVycmlkZXMueWFtbCAuL3B1YnNwZWNfb3ZlcnJpZGVzLnlhbWwKe3svaGFzRXh0ZXJuYWxEZXBlbmRlbmNpZXN9fQojIENvcHkgRGVwZW5kZW5jaWVzCnt7I3BhdGhEZXBlbmRlbmNpZXN9fUNPUFkge3t7Ln19fSAuL3t7ey59fX0Ke3svcGF0aERlcGVuZGVuY2llc319Cnt7Xmhhc0V4dGVybmFsRGVwZW5kZW5jaWVzfX0KIyBJbnN0YWxsIERlcGVuZGVuY2llcwp7eyNwYXRoRGVwZW5kZW5jaWVzfX1SVU4gZGFydCBwdWIgZ2V0IC1DIHt7ey59fX0Ke3svcGF0aERlcGVuZGVuY2llc319Cnt7L2hhc0V4dGVybmFsRGVwZW5kZW5jaWVzfX0KIyBSZXNvbHZlIGFwcCBkZXBlbmRlbmNpZXMuCkNPUFkgcHVic3BlYy4qIC4vClJVTiBkYXJ0IHB1YiBnZXQKCiMgQ29weSBhcHAgc291cmNlIGNvZGUgYW5kIEFPVCBjb21waWxlIGl0LgpDT1BZIC4gLgojIEVuc3VyZSBwYWNrYWdlcyBhcmUgc3RpbGwgdXAtdG8tZGF0ZSBpZiBhbnl0aGluZyBoYXMgY2hhbmdlZApSVU4gZGFydCBwdWIgZ2V0IC0tb2ZmbGluZQpSVU4gZGFydCBjb21waWxlIGV4ZSBiaW4vc2VydmVyLmRhcnQgLW8gYmluL3NlcnZlcgoKIyBCdWlsZCBtaW5pbWFsIHNlcnZpbmcgaW1hZ2UgZnJvbSBBT1QtY29tcGlsZWQgYC9zZXJ2ZXJgIGFuZCByZXF1aXJlZCBzeXN0ZW0KIyBsaWJyYXJpZXMgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMgc3RvcmVkIGluIGAvcnVudGltZS9gIGZyb20gdGhlIGJ1aWxkIHN0YWdlLgpGUk9NIHNjcmF0Y2gKQ09QWSAtLWZyb209YnVpbGQgL3J1bnRpbWUvIC8KQ09QWSAtLWZyb209YnVpbGQgL2FwcC9iaW4vc2VydmVyIC9hcHAvYmluLwp7eyNzZXJ2ZVN0YXRpY0ZpbGVzfX1DT1BZIC0tZnJvbT1idWlsZCAvYXBwL3B1YmxpYyAvcHVibGljL3t7L3NlcnZlU3RhdGljRmlsZXN9fQoKIyBTdGFydCBzZXJ2ZXIuCkNNRCBbIi9hcHAvYmluL3NlcnZlciJdCg==", - "type": "text" - } - ], - "hooks": [ - { - "path": "post_gen.dart", - "data": - "aW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JyBzaG93IEhvb2tDb250ZXh0LCBsaWdodEN5YW47CmltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKCmltcG9ydCAnc3JjL2RhcnRfcHViX2dldC5kYXJ0JzsKaW1wb3J0ICdzcmMvZXhpdF9vdmVycmlkZXMuZGFydCc7Cgp2b2lkIF9kZWZhdWx0RXhpdChpbnQgY29kZSkgPT4gRXhpdE92ZXJyaWRlcy5jdXJyZW50Py5leGl0ID8/IGlvLmV4aXQ7CgpGdXR1cmU8dm9pZD4gcnVuKEhvb2tDb250ZXh0IGNvbnRleHQpID0+IHBvc3RHZW4oY29udGV4dCk7CgpGdXR1cmU8dm9pZD4gcG9zdEdlbigKICBIb29rQ29udGV4dCBjb250ZXh0LCB7CiAgaW8uRGlyZWN0b3J5PyBkaXJlY3RvcnksCiAgUHJvY2Vzc1J1bm5lciBydW5Qcm9jZXNzID0gaW8uUHJvY2Vzcy5ydW4sCiAgdm9pZCBGdW5jdGlvbihpbnQgZXhpdENvZGUpIGV4aXQgPSBfZGVmYXVsdEV4aXQsCn0pIGFzeW5jIHsKICBmaW5hbCBwcm9qZWN0RGlyZWN0b3J5ID0gZGlyZWN0b3J5ID8/IGlvLkRpcmVjdG9yeS5jdXJyZW50OwogIGZpbmFsIGJ1aWxkRGlyZWN0b3J5UGF0aCA9IHBhdGguam9pbihwcm9qZWN0RGlyZWN0b3J5LnBhdGgsICdidWlsZCcpOwoKICBhd2FpdCBkYXJ0UHViR2V0KAogICAgY29udGV4dCwKICAgIHdvcmtpbmdEaXJlY3Rvcnk6IGJ1aWxkRGlyZWN0b3J5UGF0aCwKICAgIHJ1blByb2Nlc3M6IHJ1blByb2Nlc3MsCiAgICBleGl0OiBleGl0LAogICk7CgogIGZpbmFsIHJlbGF0aXZlQnVpbGRQYXRoID0gcGF0aC5yZWxhdGl2ZShidWlsZERpcmVjdG9yeVBhdGgpOwogIGNvbnRleHQubG9nZ2VyCiAgICAuLmluZm8oJycpCiAgICAuLnN1Y2Nlc3MoJ0NyZWF0ZWQgYSBwcm9kdWN0aW9uIGJ1aWxkIScpCiAgICAuLmluZm8oJycpCiAgICAuLmluZm8oJ1N0YXJ0IHRoZSBwcm9kdWN0aW9uIHNlcnZlciBieSBydW5uaW5nOicpCiAgICAuLmluZm8oJycpCiAgICAuLmluZm8oCiAgICAgICcnJyR7bGlnaHRDeWFuLndyYXAoJ2RhcnQgJHtwYXRoLmpvaW4ocmVsYXRpdmVCdWlsZFBhdGgsICdiaW4nLCAnc2VydmVyLmRhcnQnKX0nKX0nJycsCiAgICApOwp9Cg==", - "type": "text" - }, - { - "path": "pre_gen.dart", - "data": - "aW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfZ2VuL2RhcnRfZnJvZ19nZW4uZGFydCc7CmltcG9ydCAncGFja2FnZTppby9pby5kYXJ0JyBhcyBpb19leHBhbmRlZDsKaW1wb3J0ICdwYWNrYWdlOm1hc29uL21hc29uLmRhcnQnCiAgICBzaG93IEhvb2tDb250ZXh0LCBkZWZhdWx0Rm9yZWdyb3VuZCwgbGlnaHRDeWFuOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CgppbXBvcnQgJ3NyYy9jcmVhdGVfYnVuZGxlLmRhcnQnOwppbXBvcnQgJ3NyYy9jcmVhdGVfZXh0ZXJuYWxfcGFja2FnZXNfZm9sZGVyLmRhcnQnOwppbXBvcnQgJ3NyYy9kYXJ0X3B1Yl9nZXQuZGFydCc7CmltcG9ydCAnc3JjL2V4aXRfb3ZlcnJpZGVzLmRhcnQnOwppbXBvcnQgJ3NyYy9nZXRfaW50ZXJuYWxfcGF0aF9kZXBlbmRlbmNpZXMuZGFydCc7Cgp0eXBlZGVmIFJvdXRlQ29uZmlndXJhdGlvbkJ1aWxkZXIgPSBSb3V0ZUNvbmZpZ3VyYXRpb24gRnVuY3Rpb24oCiAgaW8uRGlyZWN0b3J5IGRpcmVjdG9yeSwKKTsKCnZvaWQgX2RlZmF1bHRFeGl0KGludCBjb2RlKSA9PiBFeGl0T3ZlcnJpZGVzLmN1cnJlbnQ/LmV4aXQgPz8gaW8uZXhpdDsKCkZ1dHVyZTx2b2lkPiBydW4oSG9va0NvbnRleHQgY29udGV4dCkgPT4gcHJlR2VuKGNvbnRleHQpOwoKRnV0dXJlPHZvaWQ+IHByZUdlbigKICBIb29rQ29udGV4dCBjb250ZXh0LCB7CiAgaW8uRGlyZWN0b3J5PyBkaXJlY3RvcnksCiAgUHJvY2Vzc1J1bm5lciBydW5Qcm9jZXNzID0gaW8uUHJvY2Vzcy5ydW4sCiAgUm91dGVDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZENvbmZpZ3VyYXRpb24gPSBidWlsZFJvdXRlQ29uZmlndXJhdGlvbiwKICB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSkgZXhpdCA9IF9kZWZhdWx0RXhpdCwKICBGdXR1cmU8dm9pZD4gRnVuY3Rpb24oU3RyaW5nIGZyb20sIFN0cmluZyB0bykgY29weVBhdGggPSBpb19leHBhbmRlZC5jb3B5UGF0aCwKfSkgYXN5bmMgewogIGZpbmFsIHByb2plY3REaXJlY3RvcnkgPSBkaXJlY3RvcnkgPz8gaW8uRGlyZWN0b3J5LmN1cnJlbnQ7CgogIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHB1YnNwZWMubG9jayBmaWxlIGlzIHVwIHRvIGRhdGUKICBhd2FpdCBkYXJ0UHViR2V0KAogICAgY29udGV4dCwKICAgIHdvcmtpbmdEaXJlY3Rvcnk6IHByb2plY3REaXJlY3RvcnkucGF0aCwKICAgIHJ1blByb2Nlc3M6IHJ1blByb2Nlc3MsCiAgICBleGl0OiBleGl0LAogICk7CgogIGF3YWl0IGNyZWF0ZUJ1bmRsZShjb250ZXh0LCBwcm9qZWN0RGlyZWN0b3J5LCBleGl0KTsKCiAgZmluYWwgUm91dGVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CiAgdHJ5IHsKICAgIGNvbmZpZ3VyYXRpb24gPSBidWlsZENvbmZpZ3VyYXRpb24ocHJvamVjdERpcmVjdG9yeSk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGNvbnRleHQubG9nZ2VyLmVycignJGVycm9yJyk7CiAgICByZXR1cm4gZXhpdCgxKTsKICB9CgogIHJlcG9ydFJvdXRlQ29uZmxpY3RzKAogICAgY29uZmlndXJhdGlvbiwKICAgIG9uUm91dGVDb25mbGljdDogKAogICAgICBvcmlnaW5hbEZpbGVQYXRoLAogICAgICBjb25mbGljdGluZ0ZpbGVQYXRoLAogICAgICBjb25mbGljdGluZ0VuZHBvaW50LAogICAgKSB7CiAgICAgIGNvbnRleHQubG9nZ2VyLmVycigKICAgICAgICAnJydSb3V0ZSBjb25mbGljdCBkZXRlY3RlZC4gJHtsaWdodEN5YW4ud3JhcChvcmlnaW5hbEZpbGVQYXRoKX0gYW5kICR7bGlnaHRDeWFuLndyYXAoY29uZmxpY3RpbmdGaWxlUGF0aCl9IGJvdGggcmVzb2x2ZSB0byAke2xpZ2h0Q3lhbi53cmFwKGNvbmZsaWN0aW5nRW5kcG9pbnQpfS4nJycsCiAgICAgICk7CiAgICB9LAogICAgb25WaW9sYXRpb25FbmQ6ICgpIHsKICAgICAgZXhpdCgxKTsKICAgIH0sCiAgKTsKCiAgcmVwb3J0Um9ndWVSb3V0ZXMoCiAgICBjb25maWd1cmF0aW9uLAogICAgb25Sb2d1ZVJvdXRlOiAoZmlsZVBhdGgsIGlkZWFsUGF0aCkgewogICAgICBjb250ZXh0LmxvZ2dlci5lcnIoCiAgICAgICAgJycnUm9ndWUgcm91dGUgZGV0ZWN0ZWQuJHtkZWZhdWx0Rm9yZWdyb3VuZC53cmFwKCcgJyl9UmVuYW1lICR7bGlnaHRDeWFuLndyYXAoZmlsZVBhdGgpfSB0byAke2xpZ2h0Q3lhbi53cmFwKGlkZWFsUGF0aCl9LicnJywKICAgICAgKTsKICAgIH0sCiAgICBvblZpb2xhdGlvbkVuZDogKCkgewogICAgICBleGl0KDEpOwogICAgfSwKICApOwoKICBmaW5hbCBjdXN0b21Eb2NrZXJGaWxlID0gaW8uRmlsZSgKICAgIHBhdGguam9pbihwcm9qZWN0RGlyZWN0b3J5LnBhdGgsICdEb2NrZXJmaWxlJyksCiAgKTsKCiAgZmluYWwgaW50ZXJuYWxQYXRoRGVwZW5kZW5jaWVzID0gYXdhaXQgZ2V0SW50ZXJuYWxQYXRoRGVwZW5kZW5jaWVzKAogICAgcHJvamVjdERpcmVjdG9yeSwKICApOwoKICBmaW5hbCBleHRlcm5hbERlcGVuZGVuY2llcyA9IGF3YWl0IGNyZWF0ZUV4dGVybmFsUGFja2FnZXNGb2xkZXIoCiAgICBwcm9qZWN0RGlyZWN0b3J5LAogICAgY29weVBhdGg6IGNvcHlQYXRoLAogICk7CgogIGZpbmFsIGFkZERvY2tlcmZpbGUgPSAhY3VzdG9tRG9ja2VyRmlsZS5leGlzdHNTeW5jKCk7CgogIGNvbnRleHQudmFycyA9IHsKICAgICdkaXJlY3Rvcmllcyc6IGNvbmZpZ3VyYXRpb24uZGlyZWN0b3JpZXMKICAgICAgICAubWFwKChjKSA9PiBjLnRvSnNvbigpKQogICAgICAgIC50b0xpc3QoKQogICAgICAgIC5yZXZlcnNlZAogICAgICAgIC50b0xpc3QoKSwKICAgICdyb3V0ZXMnOiBjb25maWd1cmF0aW9uLnJvdXRlcy5tYXAoKHIpID0+IHIudG9Kc29uKCkpLnRvTGlzdCgpLAogICAgJ21pZGRsZXdhcmUnOiBjb25maWd1cmF0aW9uLm1pZGRsZXdhcmUubWFwKChtKSA9PiBtLnRvSnNvbigpKS50b0xpc3QoKSwKICAgICdnbG9iYWxNaWRkbGV3YXJlJzogY29uZmlndXJhdGlvbi5nbG9iYWxNaWRkbGV3YXJlICE9IG51bGwKICAgICAgICA/IGNvbmZpZ3VyYXRpb24uZ2xvYmFsTWlkZGxld2FyZSEudG9Kc29uKCkKICAgICAgICA6IGZhbHNlLAogICAgJ3NlcnZlU3RhdGljRmlsZXMnOiBjb25maWd1cmF0aW9uLnNlcnZlU3RhdGljRmlsZXMsCiAgICAnaW52b2tlQ3VzdG9tRW50cnlwb2ludCc6IGNvbmZpZ3VyYXRpb24uaW52b2tlQ3VzdG9tRW50cnlwb2ludCwKICAgICdpbnZva2VDdXN0b21Jbml0JzogY29uZmlndXJhdGlvbi5pbnZva2VDdXN0b21Jbml0LAogICAgJ3BhdGhEZXBlbmRlbmNpZXMnOiBpbnRlcm5hbFBhdGhEZXBlbmRlbmNpZXMsCiAgICAnaGFzRXh0ZXJuYWxEZXBlbmRlbmNpZXMnOiBleHRlcm5hbERlcGVuZGVuY2llcy5pc05vdEVtcHR5LAogICAgJ2V4dGVybmFsUGF0aERlcGVuZGVuY2llcyc6IGV4dGVybmFsRGVwZW5kZW5jaWVzLAogICAgJ2RhcnRWZXJzaW9uJzogY29udGV4dC52YXJzWydkYXJ0VmVyc2lvbiddLAogICAgJ2FkZERvY2tlcmZpbGUnOiBhZGREb2NrZXJmaWxlLAogIH07Cn0K", - "type": "text" - }, - { - "path": "pubspec.yaml", - "data": - "bmFtZTogZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzCnB1Ymxpc2hfdG86IG5vbmUKCmVudmlyb25tZW50OgogIHNkazogIj49My4wLjAgPDQuMC4wIgoKZGVwZW5kZW5jaWVzOgogIGRhcnRfZnJvZ19nZW46IF4yLjAuMAogIGlvOiBeMS4wLjMKICBtYXNvbjogXjAuMS4wLWRldi4zOQogIHBhdGg6IF4xLjguMQogIHB1YnNwZWNfbG9jazogXjMuMC4yCgpkZXZfZGVwZW5kZW5jaWVzOgogIG1vY2t0YWlsOiBeMS4wLjAKICB0ZXN0OiBeMS4xOS4yCiAgdmVyeV9nb29kX2FuYWx5c2lzOiBeNS4xLjAK", - "type": "text" - }, - { - "path": "src/create_bundle.dart", - "data": - "aW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTppby9pby5kYXJ0JyBzaG93IGNvcHlQYXRoOwppbXBvcnQgJ3BhY2thZ2U6bWFzb24vbWFzb24uZGFydCc7CmltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKCkZ1dHVyZTx2b2lkPiBjcmVhdGVCdW5kbGUoCiAgSG9va0NvbnRleHQgY29udGV4dCwKICBpby5EaXJlY3RvcnkgcHJvamVjdERpcmVjdG9yeSwKICB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSkgZXhpdCwKKSBhc3luYyB7CiAgZmluYWwgYnVpbGREaXJlY3RvcnlQYXRoID0gcGF0aC5qb2luKHByb2plY3REaXJlY3RvcnkucGF0aCwgJ2J1aWxkJyk7CiAgZmluYWwgYnVpbGREaXJlY3RvcnkgPSBpby5EaXJlY3RvcnkoYnVpbGREaXJlY3RvcnlQYXRoKTsKICBmaW5hbCBkYXJ0RnJvZ0RpcmVjdG9yeVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdERpcmVjdG9yeS5wYXRoLCAnLmRhcnRfZnJvZycpOwogIGZpbmFsIGRhcnRGcm9nRGlyZWN0b3J5ID0gaW8uRGlyZWN0b3J5KGRhcnRGcm9nRGlyZWN0b3J5UGF0aCk7CiAgZmluYWwgYnVuZGxpbmdQcm9ncmVzcyA9IGNvbnRleHQubG9nZ2VyLnByb2dyZXNzKCdCdW5kbGluZyBzb3VyY2VzJyk7CiAgZmluYWwgdGVtcERpcmVjdG9yeSA9IGF3YWl0IGlvLkRpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXAoKTsKCiAgaWYgKGJ1aWxkRGlyZWN0b3J5LmV4aXN0c1N5bmMoKSkgewogICAgYXdhaXQgYnVpbGREaXJlY3RvcnkuZGVsZXRlKHJlY3Vyc2l2ZTogdHJ1ZSk7CiAgfQoKICBpZiAoZGFydEZyb2dEaXJlY3RvcnkuZXhpc3RzU3luYygpKSB7CiAgICBhd2FpdCBkYXJ0RnJvZ0RpcmVjdG9yeS5kZWxldGUocmVjdXJzaXZlOiB0cnVlKTsKICB9CgogIHRyeSB7CiAgICBhd2FpdCBjb3B5UGF0aCgKICAgICAgcHJvamVjdERpcmVjdG9yeS5wYXRoLAogICAgICAnJHt0ZW1wRGlyZWN0b3J5LnBhdGh9JHtwYXRoLnNlcGFyYXRvcn0nLAogICAgKTsKICAgIGJ1bmRsaW5nUHJvZ3Jlc3MuY29tcGxldGUoKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgYnVuZGxpbmdQcm9ncmVzcy5mYWlsKCk7CiAgICBjb250ZXh0LmxvZ2dlci5lcnIoJyRlcnJvcicpOwogICAgcmV0dXJuIGV4aXQoMSk7CiAgfQogIGF3YWl0IGNvcHlQYXRoKHRlbXBEaXJlY3RvcnkucGF0aCwgYnVpbGREaXJlY3RvcnkucGF0aCk7Cn0K", - "type": "text" - }, - { - "path": "src/create_external_packages_folder.dart", - "data": - "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTppby9pby5kYXJ0JyBhcyBpbzsKaW1wb3J0ICdwYWNrYWdlOnBhdGgvcGF0aC5kYXJ0JyBhcyBwYXRoOwoKaW1wb3J0ICdnZXRfcHVic3BlY19sb2NrLmRhcnQnOwoKRnV0dXJlPExpc3Q8U3RyaW5nPj4gY3JlYXRlRXh0ZXJuYWxQYWNrYWdlc0ZvbGRlcigKICBEaXJlY3RvcnkgZGlyZWN0b3J5LCB7CiAgcGF0aC5Db250ZXh0PyBwYXRoQ29udGV4dCwKICBGdXR1cmU8dm9pZD4gRnVuY3Rpb24oU3RyaW5nIGZyb20sIFN0cmluZyB0bykgY29weVBhdGggPSBpby5jb3B5UGF0aCwKfSkgYXN5bmMgewogIGZpbmFsIHBhdGhSZXNvbHZlciA9IHBhdGhDb250ZXh0ID8/IHBhdGguY29udGV4dDsKICBmaW5hbCBwdWJzcGVjTG9jayA9IGF3YWl0IGdldFB1YnNwZWNMb2NrKAogICAgZGlyZWN0b3J5LnBhdGgsCiAgICBwYXRoQ29udGV4dDogcGF0aFJlc29sdmVyLAogICk7CgogIGZpbmFsIGV4dGVybmFsUGF0aERlcGVuZGVuY2llcyA9IHB1YnNwZWNMb2NrLnBhY2thZ2VzCiAgICAgIC5tYXAoCiAgICAgICAgKHApID0+IHAuaXN3aXRjaCgKICAgICAgICAgIHNkazogKF8pID0+IG51bGwsCiAgICAgICAgICBob3N0ZWQ6IChfKSA9PiBudWxsLAogICAgICAgICAgZ2l0OiAoXykgPT4gbnVsbCwKICAgICAgICAgIHBhdGg6IChkKSA9PiBkLnBhdGgsCiAgICAgICAgKSwKICAgICAgKQogICAgICAud2hlcmVUeXBlPFN0cmluZz4oKQogICAgICAud2hlcmUoKGRlcGVuZGVuY3lQYXRoKSB7CiAgICByZXR1cm4gIXBhdGhSZXNvbHZlci5pc1dpdGhpbignJywgZGVwZW5kZW5jeVBhdGgpOwogIH0pLnRvTGlzdCgpOwoKICBpZiAoZXh0ZXJuYWxQYXRoRGVwZW5kZW5jaWVzLmlzRW1wdHkpIHsKICAgIHJldHVybiBbXTsKICB9CiAgZmluYWwgbWFwcGVkRGVwZW5kZW5jaWVzID0gZXh0ZXJuYWxQYXRoRGVwZW5kZW5jaWVzCiAgICAgIC5tYXAoCiAgICAoZGVwZW5kZW5jeVBhdGgpID0+ICgKICAgICAgcGF0aFJlc29sdmVyLmJhc2VuYW1lKGRlcGVuZGVuY3lQYXRoKSwKICAgICAgZGVwZW5kZW5jeVBhdGgsCiAgICApLAogICkKICAgICAgLmZvbGQoPFN0cmluZywgU3RyaW5nPnt9LCAobWFwLCBkZXBlbmRlbmN5KSB7CiAgICBtYXBbZGVwZW5kZW5jeS4kMV0gPSBkZXBlbmRlbmN5LiQyOwogICAgcmV0dXJuIG1hcDsKICB9KTsKCiAgZmluYWwgYnVpbGREaXJlY3RvcnkgPSBEaXJlY3RvcnkoCiAgICBwYXRoUmVzb2x2ZXIuam9pbigKICAgICAgZGlyZWN0b3J5LnBhdGgsCiAgICAgICdidWlsZCcsCiAgICApLAogICkuLmNyZWF0ZVN5bmMoKTsKCiAgZmluYWwgcGFja2FnZXNEaXJlY3RvcnkgPSBEaXJlY3RvcnkoCiAgICBwYXRoUmVzb2x2ZXIuam9pbigKICAgICAgYnVpbGREaXJlY3RvcnkucGF0aCwKICAgICAgJy5kYXJ0X2Zyb2dfcGF0aF9kZXBlbmRlbmNpZXMnLAogICAgKSwKICApLi5jcmVhdGVTeW5jKCk7CgogIGZpbmFsIGNvcGllZFBhdGhzID0gPFN0cmluZz5bXTsKICBmb3IgKGZpbmFsIGVudHJ5IGluIG1hcHBlZERlcGVuZGVuY2llcy5lbnRyaWVzKSB7CiAgICBmaW5hbCBmcm9tID0gcGF0aFJlc29sdmVyLmpvaW4oZGlyZWN0b3J5LnBhdGgsIGVudHJ5LnZhbHVlKTsKICAgIGZpbmFsIHRvID0gcGF0aFJlc29sdmVyLmpvaW4ocGFja2FnZXNEaXJlY3RvcnkucGF0aCwgZW50cnkua2V5KTsKCiAgICBhd2FpdCBjb3B5UGF0aChmcm9tLCB0byk7CiAgICBjb3BpZWRQYXRocy5hZGQoCiAgICAgIHBhdGgucmVsYXRpdmUodG8sIGZyb206IGJ1aWxkRGlyZWN0b3J5LnBhdGgpLAogICAgKTsKICB9CgogIGZpbmFsIG1hcHBlZFBhdGhzID0gbWFwcGVkRGVwZW5kZW5jaWVzLm1hcCgKICAgIChrZXksIHZhbHVlKSA9PiBNYXBFbnRyeSgKICAgICAga2V5LAogICAgICBwYXRoUmVzb2x2ZXIucmVsYXRpdmUoCiAgICAgICAgcGF0aC5qb2luKHBhY2thZ2VzRGlyZWN0b3J5LnBhdGgsIGtleSksCiAgICAgICAgZnJvbTogYnVpbGREaXJlY3RvcnkucGF0aCwKICAgICAgKSwKICAgICksCiAgKTsKCiAgYXdhaXQgRmlsZSgKICAgIHBhdGhSZXNvbHZlci5qb2luKAogICAgICBidWlsZERpcmVjdG9yeS5wYXRoLAogICAgICAncHVic3BlY19vdmVycmlkZXMueWFtbCcsCiAgICApLAogICkud3JpdGVBc1N0cmluZygnJycKZGVwZW5kZW5jeV9vdmVycmlkZXM6CiR7bWFwcGVkUGF0aHMuZW50cmllcy5tYXAoKGVudHJ5KSA9PiAnICAke2VudHJ5LmtleX06XG4gICAgcGF0aDogJHtlbnRyeS52YWx1ZX0nKS5qb2luKCdcbicpfQonJycpOwoKICByZXR1cm4gY29waWVkUGF0aHM7Cn0K", - "type": "text" - }, - { - "path": "src/dart_pub_get.dart", - "data": - "aW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JzsKCnR5cGVkZWYgUHJvY2Vzc1J1bm5lciA9IEZ1dHVyZTxpby5Qcm9jZXNzUmVzdWx0PiBGdW5jdGlvbigKICBTdHJpbmcgZXhlY3V0YWJsZSwKICBMaXN0PFN0cmluZz4gYXJndW1lbnRzLCB7CiAgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksCiAgYm9vbCBydW5JblNoZWxsLAp9KTsKCkZ1dHVyZTx2b2lkPiBkYXJ0UHViR2V0KAogIEhvb2tDb250ZXh0IGNvbnRleHQsIHsKICByZXF1aXJlZCBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSwKICByZXF1aXJlZCBQcm9jZXNzUnVubmVyIHJ1blByb2Nlc3MsCiAgcmVxdWlyZWQgdm9pZCBGdW5jdGlvbihpbnQgZXhpdENvZGUpIGV4aXQsCn0pIGFzeW5jIHsKICBmaW5hbCBwcm9ncmVzcyA9IGNvbnRleHQubG9nZ2VyLnByb2dyZXNzKCdJbnN0YWxsaW5nIGRlcGVuZGVuY2llcycpOwogIHRyeSB7CiAgICBmaW5hbCByZXN1bHQgPSBhd2FpdCBydW5Qcm9jZXNzKAogICAgICAnZGFydCcsCiAgICAgIFsncHViJywgJ2dldCddLAogICAgICB3b3JraW5nRGlyZWN0b3J5OiB3b3JraW5nRGlyZWN0b3J5LAogICAgICBydW5JblNoZWxsOiB0cnVlLAogICAgKTsKICAgIHByb2dyZXNzLmNvbXBsZXRlKCk7CgogICAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPSAwKSB7CiAgICAgIGNvbnRleHQubG9nZ2VyLmVycignJHtyZXN1bHQuc3RkZXJyfScpOwogICAgICByZXR1cm4gZXhpdChyZXN1bHQuZXhpdENvZGUpOwogICAgfQogIH0gb24gaW8uUHJvY2Vzc0V4Y2VwdGlvbiBjYXRjaCAoZXJyb3IpIHsKICAgIGNvbnRleHQubG9nZ2VyLmVycihlcnJvci5tZXNzYWdlKTsKICAgIHJldHVybiBleGl0KGVycm9yLmVycm9yQ29kZSk7CiAgfQp9Cg==", - "type": "text" - }, - { - "path": "src/exit_overrides.dart", - "data": - "aW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmNvbnN0IF9hc3luY1J1blpvbmVkID0gcnVuWm9uZWQ7CgphYnN0cmFjdCBjbGFzcyBFeGl0T3ZlcnJpZGVzIHsKICBzdGF0aWMgZmluYWwgX3Rva2VuID0gT2JqZWN0KCk7CgogIHN0YXRpYyBFeGl0T3ZlcnJpZGVzPyBnZXQgY3VycmVudCB7CiAgICByZXR1cm4gWm9uZS5jdXJyZW50W190b2tlbl0gYXMgRXhpdE92ZXJyaWRlcz87CiAgfQoKICBzdGF0aWMgUiBydW5ab25lZDxSPihSIEZ1bmN0aW9uKCkgYm9keSwge3ZvaWQgRnVuY3Rpb24oaW50KT8gZXhpdH0pIHsKICAgIGZpbmFsIG92ZXJyaWRlcyA9IF9FeGl0T3ZlcnJpZGVzU2NvcGUoZXhpdCk7CiAgICByZXR1cm4gX2FzeW5jUnVuWm9uZWQoYm9keSwgem9uZVZhbHVlczoge190b2tlbjogb3ZlcnJpZGVzfSk7CiAgfQoKICB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSkgZ2V0IGV4aXQgPT4gaW8uZXhpdDsKfQoKY2xhc3MgX0V4aXRPdmVycmlkZXNTY29wZSBleHRlbmRzIEV4aXRPdmVycmlkZXMgewogIF9FeGl0T3ZlcnJpZGVzU2NvcGUodGhpcy5fZXhpdCk7CgogIGZpbmFsIEV4aXRPdmVycmlkZXM/IF9wcmV2aW91cyA9IEV4aXRPdmVycmlkZXMuY3VycmVudDsKICBmaW5hbCB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSk/IF9leGl0OwoKICBAb3ZlcnJpZGUKICB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSkgZ2V0IGV4aXQgewogICAgcmV0dXJuIF9leGl0ID8/IF9wcmV2aW91cz8uZXhpdCA/PyBzdXBlci5leGl0OwogIH0KfQo=", - "type": "text" - }, - { - "path": "src/get_internal_path_dependencies.dart", - "data": - "aW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKCmltcG9ydCAnZ2V0X3B1YnNwZWNfbG9jay5kYXJ0JzsKCkZ1dHVyZTxMaXN0PFN0cmluZz4+IGdldEludGVybmFsUGF0aERlcGVuZGVuY2llcyhpby5EaXJlY3RvcnkgZGlyZWN0b3J5KSBhc3luYyB7CiAgZmluYWwgcHVic3BlY0xvY2sgPSBhd2FpdCBnZXRQdWJzcGVjTG9jayhkaXJlY3RvcnkucGF0aCk7CiAgcmV0dXJuIHB1YnNwZWNMb2NrLnBhY2thZ2VzCiAgICAgIC5tYXAoCiAgICAgICAgKHApID0+IHAuaXN3aXRjaCgKICAgICAgICAgIHNkazogKF8pID0+IG51bGwsCiAgICAgICAgICBob3N0ZWQ6IChfKSA9PiBudWxsLAogICAgICAgICAgZ2l0OiAoXykgPT4gbnVsbCwKICAgICAgICAgIHBhdGg6IChkKSA9PiBkLnBhdGgsCiAgICAgICAgKSwKICAgICAgKQogICAgICAud2hlcmVUeXBlPFN0cmluZz4oKQogICAgICAud2hlcmUoKGRlcGVuZGVuY3lQYXRoKSB7CiAgICByZXR1cm4gcGF0aC5pc1dpdGhpbignJywgZGVwZW5kZW5jeVBhdGgpOwogIH0pLnRvTGlzdCgpOwp9Cg==", - "type": "text" - }, - { - "path": "src/get_pubspec_lock.dart", - "data": - "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKaW1wb3J0ICdwYWNrYWdlOnB1YnNwZWNfbG9jay9wdWJzcGVjX2xvY2suZGFydCc7CgpGdXR1cmU8UHVic3BlY0xvY2s+IGdldFB1YnNwZWNMb2NrKAogIFN0cmluZyB3b3JraW5nRGlyZWN0b3J5LCB7CiAgcGF0aC5Db250ZXh0PyBwYXRoQ29udGV4dCwKfSkgYXN5bmMgewogIGZpbmFsIHBhdGhSZXNvbHZlciA9IHBhdGhDb250ZXh0ID8/IHBhdGguY29udGV4dDsKICBmaW5hbCBwdWJzcGVjTG9ja0ZpbGUgPSBGaWxlKAogICAgd29ya2luZ0RpcmVjdG9yeS5pc0VtcHR5CiAgICAgICAgPyAncHVic3BlYy5sb2NrJwogICAgICAgIDogcGF0aFJlc29sdmVyLmpvaW4od29ya2luZ0RpcmVjdG9yeSwgJ3B1YnNwZWMubG9jaycpLAogICk7CgogIGZpbmFsIGNvbnRlbnQgPSBhd2FpdCBwdWJzcGVjTG9ja0ZpbGUucmVhZEFzU3RyaW5nKCk7CiAgcmV0dXJuIGNvbnRlbnQubG9hZFB1YnNwZWNMb2NrRnJvbVlhbWwoKTsKfQo=", - "type": "text" - }, - { - "path": "test/post_gen_test.dart", - "data": - "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JwogICAgc2hvdyBFeGl0Q29kZSwgSG9va0NvbnRleHQsIExvZ2dlciwgUHJvZ3Jlc3MsIGxpZ2h0Q3lhbjsKaW1wb3J0ICdwYWNrYWdlOm1vY2t0YWlsL21vY2t0YWlsLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CgppbXBvcnQgJy4uL3Bvc3RfZ2VuLmRhcnQnOwppbXBvcnQgJy4uL3NyYy9leGl0X292ZXJyaWRlcy5kYXJ0JzsKCmNsYXNzIF9GYWtlSG9va0NvbnRleHQgZXh0ZW5kcyBGYWtlIGltcGxlbWVudHMgSG9va0NvbnRleHQgewogIF9GYWtlSG9va0NvbnRleHQoe0xvZ2dlcj8gbG9nZ2VyfSkgOiBfbG9nZ2VyID0gbG9nZ2VyID8/IF9Nb2NrTG9nZ2VyKCk7CgogIGZpbmFsIExvZ2dlciBfbG9nZ2VyOwoKICB2YXIgX3ZhcnMgPSA8U3RyaW5nLCBkeW5hbWljPnt9OwoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgdmFycyA9PiBfdmFyczsKCiAgQG92ZXJyaWRlCiAgc2V0IHZhcnMoTWFwPFN0cmluZywgZHluYW1pYz4gdmFsdWUpID0+IF92YXJzID0gdmFsdWU7CgogIEBvdmVycmlkZQogIExvZ2dlciBnZXQgbG9nZ2VyID0+IF9sb2dnZXI7Cn0KCmNsYXNzIF9Nb2NrTG9nZ2VyIGV4dGVuZHMgTW9jayBpbXBsZW1lbnRzIExvZ2dlciB7fQoKY2xhc3MgX01vY2tQcm9ncmVzcyBleHRlbmRzIE1vY2sgaW1wbGVtZW50cyBQcm9ncmVzcyB7fQoKdm9pZCBtYWluKCkgewogIGdyb3VwKCdwb3N0R2VuJywgKCkgewogICAgbGF0ZSBIb29rQ29udGV4dCBjb250ZXh0OwogICAgbGF0ZSBMb2dnZXIgbG9nZ2VyOwoKICAgIGNvbnN0IHByb2Nlc3NJZCA9IDQyOwogICAgZmluYWwgcHJvY2Vzc1Jlc3VsdCA9IFByb2Nlc3NSZXN1bHQoCiAgICAgIHByb2Nlc3NJZCwKICAgICAgRXhpdENvZGUuc3VjY2Vzcy5jb2RlLAogICAgICAnJywKICAgICAgJycsCiAgICApOwoKICAgIHNldFVwKCgpIHsKICAgICAgbG9nZ2VyID0gX01vY2tMb2dnZXIoKTsKICAgICAgY29udGV4dCA9IF9GYWtlSG9va0NvbnRleHQobG9nZ2VyOiBsb2dnZXIpOwoKICAgICAgd2hlbigoKSA9PiBsb2dnZXIucHJvZ3Jlc3MoYW55KCkpKS50aGVuUmV0dXJuKF9Nb2NrUHJvZ3Jlc3MoKSk7CiAgICB9KTsKCiAgICB0ZXN0KCdydW4gY29tcGxldGVzJywgKCkgewogICAgICBleHBlY3QoCiAgICAgICAgRXhpdE92ZXJyaWRlcy5ydW5ab25lZCgKICAgICAgICAgICgpID0+IHJ1bihfRmFrZUhvb2tDb250ZXh0KGxvZ2dlcjogbG9nZ2VyKSksCiAgICAgICAgICBleGl0OiAoXykge30sCiAgICAgICAgKSwKICAgICAgICBjb21wbGV0ZXMsCiAgICAgICk7CiAgICB9KTsKCiAgICB0ZXN0KCdydW5zIGRhcnQgcHViIGdldCBhbmQgb3V0cHV0cyBuZXh0IHN0ZXBzJywgKCkgYXN5bmMgewogICAgICB2YXIgcHJvY2Vzc1J1bm5lckNhbGxDb3VudCA9IDA7CiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CgogICAgICBhd2FpdCBwb3N0R2VuKAogICAgICAgIGNvbnRleHQsCiAgICAgICAgcnVuUHJvY2VzczogKAogICAgICAgICAgZXhlY3V0YWJsZSwKICAgICAgICAgIGFyZ3MsIHsKICAgICAgICAgIFN0cmluZz8gd29ya2luZ0RpcmVjdG9yeSwKICAgICAgICAgIGJvb2w/IHJ1bkluU2hlbGwsCiAgICAgICAgfSkgYXN5bmMgewogICAgICAgICAgcHJvY2Vzc1J1bm5lckNhbGxDb3VudCsrOwogICAgICAgICAgZXhwZWN0KGV4ZWN1dGFibGUsIGVxdWFscygnZGFydCcpKTsKICAgICAgICAgIGV4cGVjdChhcmdzLCBlcXVhbHMoWydwdWInLCAnZ2V0J10pKTsKICAgICAgICAgIGV4cGVjdCgKICAgICAgICAgICAgd29ya2luZ0RpcmVjdG9yeSwKICAgICAgICAgICAgZXF1YWxzKHBhdGguam9pbihEaXJlY3RvcnkuY3VycmVudC5wYXRoLCAnYnVpbGQnKSksCiAgICAgICAgICApOwogICAgICAgICAgZXhwZWN0KHJ1bkluU2hlbGwsIGlzVHJ1ZSk7CiAgICAgICAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdDsKICAgICAgICB9LAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICk7CiAgICAgIGV4cGVjdChwcm9jZXNzUnVubmVyQ2FsbENvdW50LCBlcXVhbHMoMSkpOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBpc0VtcHR5KTsKICAgICAgdmVyaWZ5KCgpID0+IGxvZ2dlci5zdWNjZXNzKCdDcmVhdGVkIGEgcHJvZHVjdGlvbiBidWlsZCEnKSkuY2FsbGVkKDEpOwogICAgICB2ZXJpZnkoCiAgICAgICAgKCkgPT4gbG9nZ2VyLmluZm8oJ1N0YXJ0IHRoZSBwcm9kdWN0aW9uIHNlcnZlciBieSBydW5uaW5nOicpLAogICAgICApLmNhbGxlZCgxKTsKICAgICAgdmVyaWZ5KAogICAgICAgICgpID0+IGxvZ2dlci5pbmZvKCcke2xpZ2h0Q3lhbi53cmFwKCdkYXJ0IGJ1aWxkL2Jpbi9zZXJ2ZXIuZGFydCcpfScpLAogICAgICApLmNhbGxlZCgxKTsKICAgICAgdmVyaWZ5TmV2ZXIoKCkgPT4gbG9nZ2VyLmVycihhbnkoKSkpOwogICAgfSk7CiAgfSk7Cn0K", - "type": "text" - }, - { - "path": "test/pre_gen_test.dart", - "data": - "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfZ2VuL2RhcnRfZnJvZ19nZW4uZGFydCc7CmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JwogICAgc2hvdyBIb29rQ29udGV4dCwgTG9nZ2VyLCBQcm9ncmVzcywgZGVmYXVsdEZvcmVncm91bmQsIGxpZ2h0Q3lhbjsKaW1wb3J0ICdwYWNrYWdlOm1vY2t0YWlsL21vY2t0YWlsLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CgppbXBvcnQgJy4uL3ByZV9nZW4uZGFydCc7CmltcG9ydCAnLi4vc3JjL2V4aXRfb3ZlcnJpZGVzLmRhcnQnOwppbXBvcnQgJ3B1YnNwZWNrX2xvY2tzLmRhcnQnOwoKY2xhc3MgX0Zha2VIb29rQ29udGV4dCBleHRlbmRzIEZha2UgaW1wbGVtZW50cyBIb29rQ29udGV4dCB7CiAgX0Zha2VIb29rQ29udGV4dCh7TG9nZ2VyPyBsb2dnZXJ9KSA6IF9sb2dnZXIgPSBsb2dnZXIgPz8gX01vY2tMb2dnZXIoKTsKCiAgZmluYWwgTG9nZ2VyIF9sb2dnZXI7CgogIHZhciBfdmFycyA9IDxTdHJpbmcsIGR5bmFtaWM+e307CgogIEBvdmVycmlkZQogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldCB2YXJzID0+IF92YXJzOwoKICBAb3ZlcnJpZGUKICBzZXQgdmFycyhNYXA8U3RyaW5nLCBkeW5hbWljPiB2YWx1ZSkgPT4gX3ZhcnMgPSB2YWx1ZTsKCiAgQG92ZXJyaWRlCiAgTG9nZ2VyIGdldCBsb2dnZXIgPT4gX2xvZ2dlcjsKfQoKY2xhc3MgX01vY2tMb2dnZXIgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgTG9nZ2VyIHt9CgpjbGFzcyBfTW9ja1Byb2dyZXNzIGV4dGVuZHMgTW9jayBpbXBsZW1lbnRzIFByb2dyZXNzIHt9Cgp2b2lkIG1haW4oKSB7CiAgZ3JvdXAoJ3ByZUdlbicsICgpIHsKICAgIGxhdGUgSG9va0NvbnRleHQgY29udGV4dDsKICAgIGxhdGUgTG9nZ2VyIGxvZ2dlcjsKCiAgICBGdXR1cmU8UHJvY2Vzc1Jlc3VsdD4gc3VjY2Vzc1J1blByb2Nlc3MoCiAgICAgIGV4ZWN1dGFibGUsCiAgICAgIGFyZ3MsIHsKICAgICAgU3RyaW5nPyB3b3JraW5nRGlyZWN0b3J5LAogICAgICBib29sPyBydW5JblNoZWxsLAogICAgfSkgPT4KICAgICAgICBGdXR1cmUudmFsdWUoUHJvY2Vzc1Jlc3VsdCgwLCAwLCAnJywgJycpKTsKCiAgICBzZXRVcCgoKSB7CiAgICAgIGxvZ2dlciA9IF9Nb2NrTG9nZ2VyKCk7CiAgICAgIGNvbnRleHQgPSBfRmFrZUhvb2tDb250ZXh0KGxvZ2dlcjogbG9nZ2VyKQogICAgICAgIC4udmFyc1snZGFydFZlcnNpb24nXSA9ICdzdGFibGUnOwoKICAgICAgd2hlbigoKSA9PiBsb2dnZXIucHJvZ3Jlc3MoYW55KCkpKS50aGVuUmV0dXJuKF9Nb2NrUHJvZ3Jlc3MoKSk7CiAgICB9KTsKCiAgICB0ZXN0KCdydW4gY29tcGxldGVzJywgKCkgewogICAgICBleHBlY3QoCiAgICAgICAgRXhpdE92ZXJyaWRlcy5ydW5ab25lZCgKICAgICAgICAgICgpID0+IHJ1bihfRmFrZUhvb2tDb250ZXh0KGxvZ2dlcjogbG9nZ2VyKSksCiAgICAgICAgICBleGl0OiAoXykge30sCiAgICAgICAgKSwKICAgICAgICBjb21wbGV0ZXMsCiAgICAgICk7CiAgICB9KTsKCiAgICB0ZXN0KCdleGl0KDEpIGlmIGJ1aWxkUm91dGVDb25maWd1cmF0aW9uIHRocm93cycsICgpIGFzeW5jIHsKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgZmluYWwgZXhjZXB0aW9uID0gRXhjZXB0aW9uKCdvb3BzJyk7CiAgICAgIGF3YWl0IHByZUdlbigKICAgICAgICBjb250ZXh0LAogICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IHRocm93IGV4Y2VwdGlvbiwKICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICAgIHJ1blByb2Nlc3M6IHN1Y2Nlc3NSdW5Qcm9jZXNzLAogICAgICApOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBlcXVhbHMoWzFdKSk7CiAgICAgIHZlcmlmeSgoKSA9PiBsb2dnZXIuZXJyKGV4Y2VwdGlvbi50b1N0cmluZygpKSkuY2FsbGVkKDEpOwogICAgfSk7CgogICAgdGVzdCgnZXhpdCgxKSBmb3Igcm91dGUgY29uZmxpY3RzJywgKCkgYXN5bmMgewogICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gUm91dGVDb25maWd1cmF0aW9uKAogICAgICAgIG1pZGRsZXdhcmU6IFtdLAogICAgICAgIGRpcmVjdG9yaWVzOiBbXSwKICAgICAgICByb3V0ZXM6IFtdLAogICAgICAgIHJvZ3VlUm91dGVzOiBbXSwKICAgICAgICBlbmRwb2ludHM6IHsKICAgICAgICAgICcvJzogWwogICAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgbmFtZTogJ2luZGV4JywKICAgICAgICAgICAgICBwYXRoOiAnaW5kZXguZGFydCcsCiAgICAgICAgICAgICAgcm91dGU6ICcvJywKICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgKSwKICAgICAgICAgIF0sCiAgICAgICAgICAnL2hlbGxvJzogWwogICAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgbmFtZTogJ2hlbGxvJywKICAgICAgICAgICAgICBwYXRoOiAnaGVsbG8uZGFydCcsCiAgICAgICAgICAgICAgcm91dGU6ICcvaGVsbG8nLAogICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICApLAogICAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgbmFtZTogJ2hlbGxvX2luZGV4JywKICAgICAgICAgICAgICBwYXRoOiAnaGVsbG8vaW5kZXguZGFydCcsCiAgICAgICAgICAgICAgcm91dGU6ICcvJywKICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgKSwKICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgKTsKCiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGF3YWl0IHByZUdlbigKICAgICAgICBjb250ZXh0LAogICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IGNvbmZpZ3VyYXRpb24sCiAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgICBydW5Qcm9jZXNzOiBzdWNjZXNzUnVuUHJvY2VzcywKICAgICAgKTsKCiAgICAgIHZlcmlmeSgKICAgICAgICAoKSA9PiBsb2dnZXIuZXJyKAogICAgICAgICAgJycnUm91dGUgY29uZmxpY3QgZGV0ZWN0ZWQuICR7bGlnaHRDeWFuLndyYXAoJ3JvdXRlcy9oZWxsby5kYXJ0Jyl9IGFuZCAke2xpZ2h0Q3lhbi53cmFwKCdyb3V0ZXMvaGVsbG8vaW5kZXguZGFydCcpfSBib3RoIHJlc29sdmUgdG8gJHtsaWdodEN5YW4ud3JhcCgnL2hlbGxvJyl9LicnJywKICAgICAgICApLAogICAgICApOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBlcXVhbHMoWzFdKSk7CiAgICB9KTsKCiAgICB0ZXN0KCdleGl0KDEpIGZvciByb2d1ZSByb3V0ZXMnLCAoKSBhc3luYyB7CiAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBSb3V0ZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgbWlkZGxld2FyZTogW10sCiAgICAgICAgZGlyZWN0b3JpZXM6IFtdLAogICAgICAgIHJvdXRlczogW10sCiAgICAgICAgcm9ndWVSb3V0ZXM6IFsKICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgbmFtZTogJ2hlbGxvJywKICAgICAgICAgICAgcGF0aDogJ2hlbGxvLmRhcnQnLAogICAgICAgICAgICByb3V0ZTogJy9oZWxsbycsCiAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICksCiAgICAgICAgXSwKICAgICAgICBlbmRwb2ludHM6IHt9LAogICAgICAgIGludm9rZUN1c3RvbUVudHJ5cG9pbnQ6IHRydWUsCiAgICAgICk7CgogICAgICBmaW5hbCBleGl0Q2FsbHMgPSA8aW50PltdOwogICAgICBhd2FpdCBwcmVHZW4oCiAgICAgICAgY29udGV4dCwKICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiBjb25maWd1cmF0aW9uLAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgcnVuUHJvY2Vzczogc3VjY2Vzc1J1blByb2Nlc3MsCiAgICAgICk7CgogICAgICB2ZXJpZnkoCiAgICAgICAgKCkgPT4gbG9nZ2VyLmVycigKICAgICAgICAgICcnJ1JvZ3VlIHJvdXRlIGRldGVjdGVkLiR7ZGVmYXVsdEZvcmVncm91bmQud3JhcCgnICcpfVJlbmFtZSAke2xpZ2h0Q3lhbi53cmFwKCdyb3V0ZXMvaGVsbG8uZGFydCcpfSB0byAke2xpZ2h0Q3lhbi53cmFwKCdyb3V0ZXMvaGVsbG8vaW5kZXguZGFydCcpfS4nJycsCiAgICAgICAgKSwKICAgICAgKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgZXF1YWxzKFsxXSkpOwogICAgfSk7CgogICAgdGVzdCgKICAgICAgJ3dvcmtzIHdpdGggZXh0ZXJuYWwgZGVwZW5kZW5jaWVzJywKICAgICAgKCkgYXN5bmMgewogICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBSb3V0ZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgICBtaWRkbGV3YXJlOiBbXSwKICAgICAgICAgIGRpcmVjdG9yaWVzOiBbXSwKICAgICAgICAgIHJvdXRlczogW10sCiAgICAgICAgICByb2d1ZVJvdXRlczogW10sCiAgICAgICAgICBlbmRwb2ludHM6IHt9LAogICAgICAgICk7CgogICAgICAgIGZpbmFsIGRpcmVjdG9yeSA9IERpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKCk7CiAgICAgICAgRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LnBhdGgsICdwdWJzcGVjLnlhbWwnKSkud3JpdGVBc1N0cmluZ1N5bmMoCiAgICAgICAgICAnJycKbmFtZTogZXhhbXBsZQp2ZXJzaW9uOiAwLjEuMAplbnZpcm9ubWVudDoKICBzZGs6IF4yLjE3LjAKZGVwZW5kZW5jaWVzOgogIG1hc29uOiBhbnkKICBmb286CiAgICBwYXRoOiAuLi8uLi9mb28KZGV2X2RlcGVuZGVuY2llczoKICB0ZXN0OiBhbnkKJycnLAogICAgICAgICk7CiAgICAgICAgRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LnBhdGgsICdwdWJzcGVjLmxvY2snKSkud3JpdGVBc1N0cmluZ1N5bmMoCiAgICAgICAgICBmb29QYXRoLAogICAgICAgICk7CiAgICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgICBhd2FpdCBwcmVHZW4oCiAgICAgICAgICBjb250ZXh0LAogICAgICAgICAgYnVpbGRDb25maWd1cmF0aW9uOiAoXykgPT4gY29uZmlndXJhdGlvbiwKICAgICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgICBkaXJlY3Rvcnk6IGRpcmVjdG9yeSwKICAgICAgICAgIHJ1blByb2Nlc3M6IHN1Y2Nlc3NSdW5Qcm9jZXNzLAogICAgICAgICAgY29weVBhdGg6IChfLCBfXykgYXN5bmMge30sCiAgICAgICAgKTsKCiAgICAgICAgZXhwZWN0KGV4aXRDYWxscywgaXNFbXB0eSk7CiAgICAgICAgZGlyZWN0b3J5LmRlbGV0ZShyZWN1cnNpdmU6IHRydWUpLmlnbm9yZSgpOwogICAgICB9LAogICAgKTsKCiAgICB0ZXN0KCdyZXRhaW5zIGludm9rZUN1c3RvbUVudHJ5cG9pbnQgKHRydWUpJywgKCkgYXN5bmMgewogICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gUm91dGVDb25maWd1cmF0aW9uKAogICAgICAgIG1pZGRsZXdhcmU6IFtdLAogICAgICAgIGRpcmVjdG9yaWVzOiBbXSwKICAgICAgICByb3V0ZXM6IFtdLAogICAgICAgIHJvZ3VlUm91dGVzOiBbXSwKICAgICAgICBlbmRwb2ludHM6IHt9LAogICAgICAgIGludm9rZUN1c3RvbUVudHJ5cG9pbnQ6IHRydWUsCiAgICAgICk7CiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGF3YWl0IHByZUdlbigKICAgICAgICBjb250ZXh0LAogICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IGNvbmZpZ3VyYXRpb24sCiAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgICBydW5Qcm9jZXNzOiBzdWNjZXNzUnVuUHJvY2VzcywKICAgICAgKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgaXNFbXB0eSk7CiAgICAgIHZlcmlmeU5ldmVyKCgpID0+IGxvZ2dlci5lcnIoYW55KCkpKTsKICAgICAgZXhwZWN0KAogICAgICAgIGNvbnRleHQudmFycywKICAgICAgICBlcXVhbHMoewogICAgICAgICAgJ2RpcmVjdG9yaWVzJzogPFJvdXRlRGlyZWN0b3J5PltdLAogICAgICAgICAgJ3JvdXRlcyc6IDxSb3V0ZUZpbGU+W10sCiAgICAgICAgICAnbWlkZGxld2FyZSc6IDxNaWRkbGV3YXJlRmlsZT5bXSwKICAgICAgICAgICdnbG9iYWxNaWRkbGV3YXJlJzogZmFsc2UsCiAgICAgICAgICAnc2VydmVTdGF0aWNGaWxlcyc6IGZhbHNlLAogICAgICAgICAgJ2ludm9rZUN1c3RvbUVudHJ5cG9pbnQnOiB0cnVlLAogICAgICAgICAgJ2ludm9rZUN1c3RvbUluaXQnOiBmYWxzZSwKICAgICAgICAgICdwYXRoRGVwZW5kZW5jaWVzJzogPFN0cmluZz5bXSwKICAgICAgICAgICdoYXNFeHRlcm5hbERlcGVuZGVuY2llcyc6IGZhbHNlLAogICAgICAgICAgJ2V4dGVybmFsUGF0aERlcGVuZGVuY2llcyc6IDxTdHJpbmc+W10sCiAgICAgICAgICAnZGFydFZlcnNpb24nOiAnc3RhYmxlJywKICAgICAgICAgICdhZGREb2NrZXJmaWxlJzogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgKTsKICAgIH0pOwoKICAgIHRlc3QoImRvbid0IGNyZWF0ZSB0aGUgZG9ja2VyZmlsZSBpZiBvbmUgYWxyZWFkeSBleGlzdHMgb24gdGhlIGZvbGRlci4iLAogICAgICAgICgpIGFzeW5jIHsKICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9IFJvdXRlQ29uZmlndXJhdGlvbigKICAgICAgICBtaWRkbGV3YXJlOiBbXSwKICAgICAgICBkaXJlY3RvcmllczogW10sCiAgICAgICAgcm91dGVzOiBbXSwKICAgICAgICByb2d1ZVJvdXRlczogW10sCiAgICAgICAgZW5kcG9pbnRzOiB7fSwKICAgICAgKTsKCiAgICAgIGZpbmFsIGRpcmVjdG9yeSA9IERpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKCk7CiAgICAgIEZpbGUocGF0aC5qb2luKGRpcmVjdG9yeS5wYXRoLCAncHVic3BlYy55YW1sJykpLndyaXRlQXNTdHJpbmdTeW5jKAogICAgICAgICcnJwpuYW1lOiBleGFtcGxlCnZlcnNpb246IDAuMS4wCmVudmlyb25tZW50OgogIHNkazogXjIuMTcuMApkZXBlbmRlbmNpZXM6CiAgbWFzb246IGFueQogIHRlc3Q6IGFueQonJycsCiAgICAgICk7CgogICAgICBGaWxlKHBhdGguam9pbihkaXJlY3RvcnkucGF0aCwgJ3B1YnNwZWMubG9jaycpKS53cml0ZUFzU3RyaW5nU3luYygKICAgICAgICBub1BhdGhEZXBlbmRlbmNpZXMsCiAgICAgICk7CiAgICAgIEZpbGUocGF0aC5qb2luKGRpcmVjdG9yeS5wYXRoLCAnRG9ja2VyZmlsZScpKS53cml0ZUFzU3RyaW5nU3luYygKICAgICAgICAnJywKICAgICAgKTsKCiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGF3YWl0IHByZUdlbigKICAgICAgICBjb250ZXh0LAogICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IGNvbmZpZ3VyYXRpb24sCiAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgICBkaXJlY3Rvcnk6IGRpcmVjdG9yeSwKICAgICAgICBydW5Qcm9jZXNzOiBzdWNjZXNzUnVuUHJvY2VzcywKICAgICAgKTsKCiAgICAgIGV4cGVjdCgKICAgICAgICBjb250ZXh0LnZhcnMsCiAgICAgICAgZXF1YWxzKHsKICAgICAgICAgICdkaXJlY3Rvcmllcyc6IDxSb3V0ZURpcmVjdG9yeT5bXSwKICAgICAgICAgICdyb3V0ZXMnOiA8Um91dGVGaWxlPltdLAogICAgICAgICAgJ21pZGRsZXdhcmUnOiA8TWlkZGxld2FyZUZpbGU+W10sCiAgICAgICAgICAnZ2xvYmFsTWlkZGxld2FyZSc6IGZhbHNlLAogICAgICAgICAgJ3NlcnZlU3RhdGljRmlsZXMnOiBmYWxzZSwKICAgICAgICAgICdpbnZva2VDdXN0b21FbnRyeXBvaW50JzogZmFsc2UsCiAgICAgICAgICAnaW52b2tlQ3VzdG9tSW5pdCc6IGZhbHNlLAogICAgICAgICAgJ2hhc0V4dGVybmFsRGVwZW5kZW5jaWVzJzogZmFsc2UsCiAgICAgICAgICAnZXh0ZXJuYWxQYXRoRGVwZW5kZW5jaWVzJzogPFN0cmluZz5bXSwKICAgICAgICAgICdwYXRoRGVwZW5kZW5jaWVzJzogPFN0cmluZz5bXSwKICAgICAgICAgICdkYXJ0VmVyc2lvbic6ICdzdGFibGUnLAogICAgICAgICAgJ2FkZERvY2tlcmZpbGUnOiBmYWxzZSwKICAgICAgICB9KSwKICAgICAgKTsKICAgICAgZGlyZWN0b3J5LmRlbGV0ZShyZWN1cnNpdmU6IHRydWUpLmlnbm9yZSgpOwogICAgfSk7CgogICAgdGVzdCgncmV0YWlucyBpbnZva2VDdXN0b21Jbml0ICh0cnVlKScsICgpIGFzeW5jIHsKICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9IFJvdXRlQ29uZmlndXJhdGlvbigKICAgICAgICBtaWRkbGV3YXJlOiBbXSwKICAgICAgICBkaXJlY3RvcmllczogW10sCiAgICAgICAgcm91dGVzOiBbXSwKICAgICAgICByb2d1ZVJvdXRlczogW10sCiAgICAgICAgZW5kcG9pbnRzOiB7fSwKICAgICAgICBpbnZva2VDdXN0b21Jbml0OiB0cnVlLAogICAgICApOwogICAgICBmaW5hbCBleGl0Q2FsbHMgPSA8aW50PltdOwogICAgICBhd2FpdCBwcmVHZW4oCiAgICAgICAgY29udGV4dCwKICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiBjb25maWd1cmF0aW9uLAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgcnVuUHJvY2Vzczogc3VjY2Vzc1J1blByb2Nlc3MsCiAgICAgICk7CiAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGlzRW1wdHkpOwogICAgICB2ZXJpZnlOZXZlcigoKSA9PiBsb2dnZXIuZXJyKGFueSgpKSk7CiAgICAgIGV4cGVjdCgKICAgICAgICBjb250ZXh0LnZhcnMsCiAgICAgICAgZXF1YWxzKHsKICAgICAgICAgICdkaXJlY3Rvcmllcyc6IDxSb3V0ZURpcmVjdG9yeT5bXSwKICAgICAgICAgICdyb3V0ZXMnOiA8Um91dGVGaWxlPltdLAogICAgICAgICAgJ21pZGRsZXdhcmUnOiA8TWlkZGxld2FyZUZpbGU+W10sCiAgICAgICAgICAnZ2xvYmFsTWlkZGxld2FyZSc6IGZhbHNlLAogICAgICAgICAgJ3NlcnZlU3RhdGljRmlsZXMnOiBmYWxzZSwKICAgICAgICAgICdpbnZva2VDdXN0b21FbnRyeXBvaW50JzogZmFsc2UsCiAgICAgICAgICAnaW52b2tlQ3VzdG9tSW5pdCc6IHRydWUsCiAgICAgICAgICAnaGFzRXh0ZXJuYWxEZXBlbmRlbmNpZXMnOiBmYWxzZSwKICAgICAgICAgICdleHRlcm5hbFBhdGhEZXBlbmRlbmNpZXMnOiA8U3RyaW5nPltdLAogICAgICAgICAgJ3BhdGhEZXBlbmRlbmNpZXMnOiA8U3RyaW5nPltdLAogICAgICAgICAgJ2RhcnRWZXJzaW9uJzogJ3N0YWJsZScsCiAgICAgICAgICAnYWRkRG9ja2VyZmlsZSc6IHRydWUsCiAgICAgICAgfSksCiAgICAgICk7CiAgICB9KTsKCiAgICB0ZXN0KAogICAgICAndXBkYXRlcyBjb250ZXh0LnZhcnMgd2hlbiBidWlsZFJvdXRlQ29uZmlndXJhdGlvbiBzdWNjZWVkcycsCiAgICAgICgpIGFzeW5jIHsKICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gUm91dGVDb25maWd1cmF0aW9uKAogICAgICAgICAgZ2xvYmFsTWlkZGxld2FyZTogTWlkZGxld2FyZUZpbGUoCiAgICAgICAgICAgIG5hbWU6ICdtaWRkbGV3YXJlJywKICAgICAgICAgICAgcGF0aDogJ21pZGRsZXdhcmUuZGFydCcsCiAgICAgICAgICApLAogICAgICAgICAgbWlkZGxld2FyZTogWwogICAgICAgICAgICBNaWRkbGV3YXJlRmlsZSgKICAgICAgICAgICAgICBuYW1lOiAnaGVsbG9fbWlkZGxld2FyZScsCiAgICAgICAgICAgICAgcGF0aDogJ2hlbGxvL21pZGRsZXdhcmUuZGFydCcsCiAgICAgICAgICAgICksCiAgICAgICAgICBdLAogICAgICAgICAgZGlyZWN0b3JpZXM6IFsKICAgICAgICAgICAgUm91dGVEaXJlY3RvcnkoCiAgICAgICAgICAgICAgbmFtZTogJ18nLAogICAgICAgICAgICAgIHJvdXRlOiAnLycsCiAgICAgICAgICAgICAgbWlkZGxld2FyZTogW10sCiAgICAgICAgICAgICAgZmlsZXM6IFsKICAgICAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICAgICAgbmFtZTogJ2luZGV4JywKICAgICAgICAgICAgICAgICAgcGF0aDogJ2luZGV4LmRhcnQnLAogICAgICAgICAgICAgICAgICByb3V0ZTogJy8nLAogICAgICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgUm91dGVGaWxlKAogICAgICAgICAgICAgICAgICBuYW1lOiAnaGVsbG8nLAogICAgICAgICAgICAgICAgICBwYXRoOiAnaGVsbG8uZGFydCcsCiAgICAgICAgICAgICAgICAgIHJvdXRlOiAnL2hlbGxvJywKICAgICAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICksCiAgICAgICAgICBdLAogICAgICAgICAgcm91dGVzOiBbCiAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICBuYW1lOiAnaW5kZXgnLAogICAgICAgICAgICAgIHBhdGg6ICdpbmRleC5kYXJ0JywKICAgICAgICAgICAgICByb3V0ZTogJy8nLAogICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICApLAogICAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgbmFtZTogJ2hlbGxvJywKICAgICAgICAgICAgICBwYXRoOiAnaGVsbG8uZGFydCcsCiAgICAgICAgICAgICAgcm91dGU6ICcvaGVsbG8nLAogICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICApLAogICAgICAgICAgXSwKICAgICAgICAgIHJvZ3VlUm91dGVzOiBbXSwKICAgICAgICAgIGVuZHBvaW50czogewogICAgICAgICAgICAnLyc6IFsKICAgICAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgICBuYW1lOiAnaW5kZXgnLAogICAgICAgICAgICAgICAgcGF0aDogJ2luZGV4LmRhcnQnLAogICAgICAgICAgICAgICAgcm91dGU6ICcvJywKICAgICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgJy9oZWxsbyc6IFsKICAgICAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgICBuYW1lOiAnaGVsbG8nLAogICAgICAgICAgICAgICAgcGF0aDogJ2hlbGxvLmRhcnQnLAogICAgICAgICAgICAgICAgcm91dGU6ICcvaGVsbG8nLAogICAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgICApLAogICAgICAgICAgICBdLAogICAgICAgICAgfSwKICAgICAgICAgIHNlcnZlU3RhdGljRmlsZXM6IHRydWUsCiAgICAgICAgKTsKICAgICAgICBmaW5hbCBleGl0Q2FsbHMgPSA8aW50PltdOwogICAgICAgIGF3YWl0IHByZUdlbigKICAgICAgICAgIGNvbnRleHQsCiAgICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiBjb25maWd1cmF0aW9uLAogICAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgICAgIHJ1blByb2Nlc3M6IHN1Y2Nlc3NSdW5Qcm9jZXNzLAogICAgICAgICk7CiAgICAgICAgZXhwZWN0KGV4aXRDYWxscywgaXNFbXB0eSk7CiAgICAgICAgdmVyaWZ5TmV2ZXIoKCkgPT4gbG9nZ2VyLmVycihhbnkoKSkpOwogICAgICAgIGV4cGVjdCgKICAgICAgICAgIGNvbnRleHQudmFycywKICAgICAgICAgIGVxdWFscyh7CiAgICAgICAgICAgICdkaXJlY3Rvcmllcyc6IFsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAnbmFtZSc6ICdfJywKICAgICAgICAgICAgICAgICdyb3V0ZSc6ICcvJywKICAgICAgICAgICAgICAgICdtaWRkbGV3YXJlJzogPE1hcDxTdHJpbmcsIGR5bmFtaWM+PltdLAogICAgICAgICAgICAgICAgJ2ZpbGVzJzogWwogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnaW5kZXgnLAogICAgICAgICAgICAgICAgICAgICdwYXRoJzogJ2luZGV4LmRhcnQnLAogICAgICAgICAgICAgICAgICAgICdyb3V0ZSc6ICcvJywKICAgICAgICAgICAgICAgICAgICAnZmlsZV9wYXJhbXMnOiBjb25zdCA8U3RyaW5nPltdLAogICAgICAgICAgICAgICAgICAgICd3aWxkY2FyZCc6IGZhbHNlLAogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnaGVsbG8nLAogICAgICAgICAgICAgICAgICAgICdwYXRoJzogJ2hlbGxvLmRhcnQnLAogICAgICAgICAgICAgICAgICAgICdyb3V0ZSc6ICcvaGVsbG8nLAogICAgICAgICAgICAgICAgICAgICdmaWxlX3BhcmFtcyc6IGNvbnN0IDxTdHJpbmc+W10sCiAgICAgICAgICAgICAgICAgICAgJ3dpbGRjYXJkJzogZmFsc2UsCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAnZGlyZWN0b3J5X3BhcmFtcyc6IGNvbnN0IDxTdHJpbmc+W10sCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAncm91dGVzJzogWwogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICduYW1lJzogJ2luZGV4JywKICAgICAgICAgICAgICAgICdwYXRoJzogJ2luZGV4LmRhcnQnLAogICAgICAgICAgICAgICAgJ3JvdXRlJzogJy8nLAogICAgICAgICAgICAgICAgJ2ZpbGVfcGFyYW1zJzogY29uc3QgPFN0cmluZz5bXSwKICAgICAgICAgICAgICAgICd3aWxkY2FyZCc6IGZhbHNlLAogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJ25hbWUnOiAnaGVsbG8nLAogICAgICAgICAgICAgICAgJ3BhdGgnOiAnaGVsbG8uZGFydCcsCiAgICAgICAgICAgICAgICAncm91dGUnOiAnL2hlbGxvJywKICAgICAgICAgICAgICAgICdmaWxlX3BhcmFtcyc6IGNvbnN0IDxTdHJpbmc+W10sCiAgICAgICAgICAgICAgICAnd2lsZGNhcmQnOiBmYWxzZSwKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICdtaWRkbGV3YXJlJzogWwogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICduYW1lJzogJ2hlbGxvX21pZGRsZXdhcmUnLAogICAgICAgICAgICAgICAgJ3BhdGgnOiAnaGVsbG8vbWlkZGxld2FyZS5kYXJ0JywKICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICAnZ2xvYmFsTWlkZGxld2FyZSc6IHsKICAgICAgICAgICAgICAnbmFtZSc6ICdtaWRkbGV3YXJlJywKICAgICAgICAgICAgICAncGF0aCc6ICdtaWRkbGV3YXJlLmRhcnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICAnc2VydmVTdGF0aWNGaWxlcyc6IHRydWUsCiAgICAgICAgICAgICdpbnZva2VDdXN0b21FbnRyeXBvaW50JzogZmFsc2UsCiAgICAgICAgICAgICdpbnZva2VDdXN0b21Jbml0JzogZmFsc2UsCiAgICAgICAgICAgICdoYXNFeHRlcm5hbERlcGVuZGVuY2llcyc6IGZhbHNlLAogICAgICAgICAgICAnZXh0ZXJuYWxQYXRoRGVwZW5kZW5jaWVzJzogPFN0cmluZz5bXSwKICAgICAgICAgICAgJ3BhdGhEZXBlbmRlbmNpZXMnOiA8U3RyaW5nPltdLAogICAgICAgICAgICAnZGFydFZlcnNpb24nOiAnc3RhYmxlJywKICAgICAgICAgICAgJ2FkZERvY2tlcmZpbGUnOiB0cnVlLAogICAgICAgICAgfSksCiAgICAgICAgKTsKICAgICAgfSwKICAgICk7CiAgfSk7Cn0K", - "type": "text" - }, - { - "path": "test/pubspeck_locks.dart", - "data": - "Y29uc3QgZm9vUGF0aCA9ICcnJwojIEdlbmVyYXRlZCBieSBwdWIKIyBTZWUgaHR0cHM6Ly9kYXJ0LmRldi90b29scy9wdWIvZ2xvc3NhcnkjbG9ja2ZpbGUKcGFja2FnZXM6CiAgX2ZlX2FuYWx5emVyX3NoYXJlZDoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBfZmVfYW5hbHl6ZXJfc2hhcmVkCiAgICAgIHNoYTI1NjogIjU4ODI2ZTQwMzE0MjE5YjIyM2Y0NzIzZGQ0MjA1ODQ1MDQwMTYxY2RjMmRmM2U2YTFjZGNlZWQ1ZDgxNjUwODQiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiNjMuMC4wIgogIGFuYWx5emVyOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGFuYWx5emVyCiAgICAgIHNoYTI1NjogZjg1NTY2ZWM3YjNkMjVjYmVhNjBmN2RkNGYxNTdjNTAyNWYyZjE5MjMzY2E0ZmVlZWQzM2I2MTZjNzhhMjZhMwogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjYuMS4wIgogIGFyY2hpdmU6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogYXJjaGl2ZQogICAgICBzaGEyNTY6ICIwYzgzNjhjOWIzZjBhYmJjMTkzYjlkNjEzMzY0OWE2MTQyMDRiNTI4OTgyYmViYzcwMjYzNzJkNjE2NzdjZTNhIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjMuMy43IgogIGFyZ3M6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogYXJncwogICAgICBzaGEyNTY6IGVlZjZjNDZiNjIyZTA0OTRhMzZjNWExMmQxMGQ3N2ZiNGU4NTU1MDFhOTFjMWI5ZWY5MzM5MzI2ZTU4ZjA1OTYKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIyLjQuMiIKICBhc3luYzoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBhc3luYwogICAgICBzaGEyNTY6ICI5NDdiZmNmMTg3Zjc0ZGJjNWUxNDZjOWViOWMwZjEwYzlmOGIzMDc0M2UzNDE0ODFjMWUyZWQzZWNjMThjMjBjIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjIuMTEuMCIKICBib29sZWFuX3NlbGVjdG9yOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGJvb2xlYW5fc2VsZWN0b3IKICAgICAgc2hhMjU2OiAiNmNmYjVhZjEyMjUzZWFmMmIzNjhmMDdiYWNjNWE4MGQxMzAxYTA3MWM3MzM2MGQ3NDZiN2YyZTMyZDc2MmM2NiIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIyLjEuMSIKICBjaGVja2VkX3lhbWw6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogY2hlY2tlZF95YW1sCiAgICAgIHNoYTI1NjogZmViNmJlZDIxOTQ5MDYxNzMxYTdhNzVmYzVkMmFhNzI3Y2YxNjBiOTFhZjlhM2U0NjRjNWUzYTMyZTI4YjVmZgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjIuMC4zIgogIGNvbGxlY3Rpb246CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogY29sbGVjdGlvbgogICAgICBzaGEyNTY6IGVlNjdjYjA3MTU5MTFkMjhkYjZiZjRhZjEwMjYwNzhiZDZmMDEyOGIwN2E1ZjY2ZmIyZWQ5NGVjNjc4M2MwOWEKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjE4LjAiCiAgY29udmVydDoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBjb252ZXJ0CiAgICAgIHNoYTI1NjogIjBmMDhiMTQ3NTVkMTYzZjZlMjEzNGNiNTgyMjJkZDI1ZWEyYTJlZThhMTk1ZTUzOTgzZDU3YzA3NTMyNGQ1OTIiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMy4xLjEiCiAgY292ZXJhZ2U6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogY292ZXJhZ2UKICAgICAgc2hhMjU2OiAiMmZiODE1MDgwZTQ0YTA5Yjg1ZTBmMmNhOGE4MjBiMTUwNTM5ODJiMmU3MTRiNTkyNjc3MTllOGE5ZmYxNzA5NyIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjYuMyIKICBjcnlwdG86CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogY3J5cHRvCiAgICAgIHNoYTI1NjogZmY2MjU3NzQxNzM3NTQ2ODFkNjZkYWFmNGE0NDg2ODRmYjA0Yjc4ZjkwMmRhOWNiM2QzMDhjMTljYzVlOGJhYgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjMuMC4zIgogIGZpbGU6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogZmlsZQogICAgICBzaGEyNTY6ICI1ZmMyMmQ3YzI1NTgyZTM4YWQ5YTg1MTUzNzJjZDlhOTM4MzQwMjdhYWNmMTgwMWNmMDExNjRkYWMwZmZhMDhjIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjcuMC4wIgogIGZvbzoKICAgIGRlcGVuZGVuY3k6ICJkaXJlY3QgbWFpbiIKICAgIGRlc2NyaXB0aW9uOgogICAgICBwYXRoOiAiLi4vLi4vZm9vIgogICAgICByZWxhdGl2ZTogdHJ1ZQogICAgc291cmNlOiBwYXRoCiAgICB2ZXJzaW9uOiAiMC4wLjAiCiAgZnJvbnRlbmRfc2VydmVyX2NsaWVudDoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBmcm9udGVuZF9zZXJ2ZXJfY2xpZW50CiAgICAgIHNoYTI1NjogIjQwOGUzY2ExNDhiMzFjMjAyODJhZDZmMzdlYmZhNmY0YmRjOGZlZGU1Yjc0YmMyZjA4ZDlkOTJiNTVkYjM2MTIiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMy4yLjAiCiAgZ2xvYjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBnbG9iCiAgICAgIHNoYTI1NjogIjBlNzAxNGIzYjdkNGRhYzFjYTRkNjExNGY4MmJmMTc4MmVlODY3NDViOWI0MmE5MmM5Mjg5YzIzZDhhMGFiNjMiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi4xLjIiCiAgaHR0cDoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBodHRwCiAgICAgIHNoYTI1NjogIjc1OWQxYTMyOTg0N2RkMGYzOTIyNmM2ODhkM2UwNmE2Yjg2Nzk2NjhlMzUwZTI4OTFhNjQ3NGY4YjRiYjg1MjUiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4xLjAiCiAgaHR0cF9tdWx0aV9zZXJ2ZXI6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogaHR0cF9tdWx0aV9zZXJ2ZXIKICAgICAgc2hhMjU2OiAiOTc0ODZmMjBmOWMyZjdiZThmNTE0ODUxNzAzZDAxMTljMzU5NmQxNGVhNjMyMjdhZjZmN2E0ODFlZjJiMmY4YiIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIzLjIuMSIKICBodHRwX3BhcnNlcjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBodHRwX3BhcnNlcgogICAgICBzaGEyNTY6ICIyYWEwOGNlMDM0MWNjOWIzNTRhNDk4Mzg4ZTMwOTg2NTE1NDA2NjY4ZGJjYzRmN2M5NTBjM2U3MTU0OTY2OTNiIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjQuMC4yIgogIGlvOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGlvCiAgICAgIHNoYTI1NjogIjJlYzI1NzA0YWJhMzYxNjU5ZTEwZTNlNWY1ZDY3MjA2OGQzMzJmYzhhYzUxNjQyMWQ0ODNhMTFlNWNiZDA2MWUiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4wLjQiCiAganM6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZToganMKICAgICAgc2hhMjU2OiBmMmM0NDVkY2U0OTYyNzEzNjA5NDk4MDYxNWEwMzE0MTlmN2YzZWIzOTMyMzdlNGVjZDk3YWMxNWRlYTM0M2YzCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMC42LjciCiAganNvbl9hbm5vdGF0aW9uOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGpzb25fYW5ub3RhdGlvbgogICAgICBzaGEyNTY6IGIxMGE3YjJmZjgzZDgzYzc3N2VkYmEzYzZhMGY5NzA0NWRkYWRkNTZjOTQ0ZTFhMjNhM2ZkZjQzYTFiZjQ0NjcKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICI0LjguMSIKICBsb2dnaW5nOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGxvZ2dpbmcKICAgICAgc2hhMjU2OiAiNjIzYTg4Yzk1OTRhYTc3NDQ0M2FhM2ViMmQ0MTgwN2E0ODQ4NmI1NjEzZTY3NTk5ZmI0YzQxYzBhZDQ3YzM0MCIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjIuMCIKICBtYXNvbjoKICAgIGRlcGVuZGVuY3k6ICJkaXJlY3QgbWFpbiIKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBtYXNvbgogICAgICBzaGEyNTY6IGZkYzllYTkwNWU3YzY5MGZlMzlkMmY5OTQ2YjdhZWFkODZmZDk3NmY4ZWRmOTdkMjUyMWE2NWQyNjBiYmY1MDkKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIwLjEuMC1kZXYuNTAiCiAgbWFzb25fbG9nZ2VyOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IG1hc29uX2xvZ2dlcgogICAgICBzaGEyNTY6IGMxMjg2MGFlODFmMGJkYzVkMDVkNzkxNGZlNDczYmZiMjk0MDQ3ZTlkYzY0ZTg5OTViNTc1M2M3MjA3ZTgxYjkKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIwLjIuOCIKICBtYXRjaGVyOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IG1hdGNoZXIKICAgICAgc2hhMjU2OiAiMTgwM2U3NmU2NjUzNzY4ZDY0ZWQ4ZmYyZTFlNjdiZWEzYWQ0YjkyM2ViNWM1NmEyOTVjM2U2MzRiYWQ1OTYwZSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIwLjEyLjE2IgogIG1ldGE6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogbWV0YQogICAgICBzaGEyNTY6ICIzYzc0ZGJmODc2M2QzNjUzOWYxMTRjNzk5ZDhhMmQ4NzM0M2I1MDY3ZTlkNzk2Y2EyMmI1ZWI4NDM3MDkwZWUzIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuOS4xIgogIG1pbWU6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogbWltZQogICAgICBzaGEyNTY6IGU0ZmY4ZTg1NjRjMDNmMjU1NDA4ZGVjZDE2ZTc4OTlkYTE3MzM4NTJhOTExMGE1OGZlNmQxYjgxNzY4NGE2M2UKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjAuNCIKICBtdXN0YWNoZV90ZW1wbGF0ZToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBtdXN0YWNoZV90ZW1wbGF0ZQogICAgICBzaGEyNTY6IGE0NmUyNmY5MTQ0NWJmYjBiNjA1MTliZTI4MDU1NWIwNjc5MjQ2MGIyN2IxOWUyYjE5YWQ1Yjk3NDBkZjVkMWMKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIyLjAuMCIKICBub2RlX3ByZWFtYmxlOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IG5vZGVfcHJlYW1ibGUKICAgICAgc2hhMjU2OiAiNmU3ZWFjODkwNDdhYjhhOGQyNmNmMTYxMjdiNWVkMjZkZTY1MjA5ODQ3NjMwNDAwZjlhZWZkN2NkNWM3MzBkYiIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIyLjAuMiIKICBwYWNrYWdlX2NvbmZpZzoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBwYWNrYWdlX2NvbmZpZwogICAgICBzaGEyNTY6ICIxYzViNzdjY2M5MWU0ODIzYTVhZjYxZWU3NGU2Yjk3MmRiMWVmOThjMmZmNWExOGQzMTYxYzk4MmE1NTQ0OGJkIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjIuMS4wIgogIHBhdGg6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogcGF0aAogICAgICBzaGEyNTY6ICI4ODI5ZDhhNTVjMTNmYzBlMzcxMjdjMjlmZWRmMjkwYzEwMmY0ZTQwYWU5NGFkYTU3NDA5MWZlMGZmOTZjOTE3IgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuOC4zIgogIHBvaW50eWNhc3RsZToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBwb2ludHljYXN0bGUKICAgICAgc2hhMjU2OiAiN2MxZTVmMGQyM2M5MDE2YzViYmQ4YjE0NzNkMGQzZmIzZmM4NTFiODc2MDQ2MDM5NTA5ZTE4ZTBjNzQ4NWYyYyIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIzLjcuMyIKICBwb29sOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHBvb2wKICAgICAgc2hhMjU2OiAiMjBmZTg2OGI2MzE0YjMyMmVhMDM2YmEzMjVlNmZjMDcxMWEyMjk0ODg1NjQ3NWUyYzJiNjMwNmU4YWIzOWMyYSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjUuMSIKICBwdWJfc2VtdmVyOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHB1Yl9zZW12ZXIKICAgICAgc2hhMjU2OiAiNDBkM2FiMWJiZDQ3NGM0YzIzMjhjOTFlM2E3ZGY4YzZkZDYyOWI3OWVjZTRjNGJkMDRiZWU0OTZhMjI0ZmIwYyIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIyLjEuNCIKICBzaGVsZjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBzaGVsZgogICAgICBzaGEyNTY6IGFkMjljNTA1YWVlNzA1ZjQxYTRkODk2MzY0MWY5MWFjNGNlZTNjOGZhZDU5NDdlMDMzMzkwYTdiZDgxODBmYTQKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjQuMSIKICBzaGVsZl9wYWNrYWdlc19oYW5kbGVyOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHNoZWxmX3BhY2thZ2VzX2hhbmRsZXIKICAgICAgc2hhMjU2OiAiODlmOTY3ZWNhMjk2MDdjOTMzYmE5NTcxZDgzOGJlMzFkNjdmNTNmNmU0ZWUxNTE0N2Q1ZGMyOTM0ZmVlMWIxZSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIzLjAuMiIKICBzaGVsZl9zdGF0aWM6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogc2hlbGZfc3RhdGljCiAgICAgIHNoYTI1NjogYTQxZDNmNTNjNGFkZjBmNTc0ODA1NzhjMWQ2MWQ5MDM0MmNkNjE3ZGU3ZmM4MDc3YjEzMDQ2NDNjMmQ4NWMxZQogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMS4yIgogIHNoZWxmX3dlYl9zb2NrZXQ6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogc2hlbGZfd2ViX3NvY2tldAogICAgICBzaGEyNTY6ICI5Y2EwODFiZTQxYzYwMTkwZWJjYjQ3NjZiMjQ4NmE3ZDUwMjYxZGI3YmQwZjVkOTYxNWYyZDY1MzYzN2E4NGMxIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMC40IgogIHNvdXJjZV9tYXBfc3RhY2tfdHJhY2U6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogc291cmNlX21hcF9zdGFja190cmFjZQogICAgICBzaGEyNTY6ICI4NGNmNzY5YWQ4M2FhNmJiNjFlMGFhNWExOGU1M2FlYTY4MzM5NWYxOTZhNmYzOWM0Yzg4MWZiOTBlZDRmN2FlIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjIuMS4xIgogIHNvdXJjZV9tYXBzOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHNvdXJjZV9tYXBzCiAgICAgIHNoYTI1NjogIjcwOGIzZjZiOTcyNDhlNTc4MWY0OTNiNzY1YzMzMzdkYjExYzVkMmM4MWMzMDk0ZjEwOTA0YmZhODAwNGM3MDMiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMC4xMC4xMiIKICBzb3VyY2Vfc3BhbjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBzb3VyY2Vfc3BhbgogICAgICBzaGEyNTY6ICI1M2U5NDNkNDIwNmE1ZTMwZGYzMzhmZDRjNmU3YTA3N2UwMjI1NDUzMWIxMzhhMTVhZWMzYmQxNDNjMWE4YjNjIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMTAuMCIKICBzdGFja190cmFjZToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBzdGFja190cmFjZQogICAgICBzaGEyNTY6ICI3MzcxMzk5MDEyNWE2ZDkzMTIyNTQxMjM3NTUwZWUzMzUyYTJkODRiYWFkNTJkMzc1YTRjYWQyZWI5YjdjZTBiIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMTEuMSIKICBzdHJlYW1fY2hhbm5lbDoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBzdHJlYW1fY2hhbm5lbAogICAgICBzaGEyNTY6IGJhMmFhNWQ4Y2M2MDlkOTZiYmIyODk5YzI4OTM0ZjllMWFmNWNkZGJkNjBhODI3ODIyZWE0NjcxNjFlYjU0ZTcKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIyLjEuMiIKICBzdHJpbmdfc2Nhbm5lcjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBzdHJpbmdfc2Nhbm5lcgogICAgICBzaGEyNTY6ICI1NTY2OTJhZGFiNmNmYTg3MzIyYTExNTY0MGMxMWYxM2NiNzdiM2YwNzZkZGNjNWQ2YWUzYzIwMjQyYmVkY2RlIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMi4wIgogIHRlcm1fZ2x5cGg6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogdGVybV9nbHlwaAogICAgICBzaGEyNTY6IGEyOTI0OGE4NGZiYjdjNzkyODJiNDBiOGM3MmExMjA5ZGIxNjlhMmUwNTQyYmNlMzQxZGE5OTJmZTFiYzdlODQKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjIuMSIKICB0ZXN0OgogICAgZGVwZW5kZW5jeTogImRpcmVjdCBkZXYiCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogdGVzdAogICAgICBzaGEyNTY6ICI5YjBkZDhlMzZhZjRhNWIxNTY5MDI5OTQ5ZDUwYTUyY2IyYTJhMmZkYWEyMGNlYmI5NmU2NjAzYjlhZTI0MWY5IgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMjQuNiIKICB0ZXN0X2FwaToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB0ZXN0X2FwaQogICAgICBzaGEyNTY6ICI1YzJmNzMwMDE4MjY0ZDI3NmMyMGU0ZjE1MDNmZDEzMDhkZmJiYWUzOWVjOGVlNjNjNTIzNjMxMWFjMDY5NTRiIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjAuNi4xIgogIHRlc3RfY29yZToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB0ZXN0X2NvcmUKICAgICAgc2hhMjU2OiAiNGJlZjgzN2U1NjM3NTUzNzA1NWZkYmJiZjZkZDQ1OGIxODU5ODgxZjRjN2U2ZGE5MzYxNThmNzdkNjFhYjI2NSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIwLjUuNiIKICB0eXBlZF9kYXRhOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHR5cGVkX2RhdGEKICAgICAgc2hhMjU2OiBmYWNjOGQ2NTgyZjE2MDQyZGQ0OWYyNDYzZmYxYmQ2ZTJjOWVmOWYzZDVkYTNkOWIwODdlMjQ0YTdiNTY0YjNjCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4zLjIiCiAgdm1fc2VydmljZToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB2bV9zZXJ2aWNlCiAgICAgIHNoYTI1NjogIjBmYWU0MzJjODVjNGVhODgwYjMzYjQ5N2QzMjgyNGI5Nzc5NWIwNGNkYWE3NGQyNzAyMTk1NzJhMWY1MDI2OGQiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMTEuOS4wIgogIHdhdGNoZXI6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogd2F0Y2hlcgogICAgICBzaGEyNTY6ICIzZDJhZDY3NTFiM2MxNmNmMDdjN2ZjYTMxN2ExNDEzYjNmMjY1MzAzMTkxODFiMzdlM2I5MDM5Yjg0ZmMwMWQ4IgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMS4wIgogIHdlYl9zb2NrZXRfY2hhbm5lbDoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB3ZWJfc29ja2V0X2NoYW5uZWwKICAgICAgc2hhMjU2OiBkODgyMzhlNWVhYzlhNDJiYjQzY2E0ZTcyMWVkYmEzYzA4YzYzNTRkNGE1MzA2M2FmYWE1Njg1MTYyMTc2MjFiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi40LjAiCiAgd2Via2l0X2luc3BlY3Rpb25fcHJvdG9jb2w6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogd2Via2l0X2luc3BlY3Rpb25fcHJvdG9jb2wKICAgICAgc2hhMjU2OiAiNjdkM2E4YjZjNzllMTk4N2QxOWQ4NDhiMDg5MmU1ODJkYmIwYzY2YzU3Y2MxZmVmNThhMTc3ZGQyYWEyODIzZCIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjIuMCIKICB5YW1sOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHlhbWwKICAgICAgc2hhMjU2OiAiNzU3Njk1MDFlYTM0ODlmY2E1NjYwMWZmMzM0NTRmZTQ1NTA3ZWEzYmZiMDE0MTYxYWJjM2I0M2FlMjU5ODlkNSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIzLjEuMiIKc2RrczoKICBkYXJ0OiAiPj0zLjAuMCA8NC4wLjAiCicnJzsKCmNvbnN0IGZvb1BhdGhXaXRoSW50ZXJuYWxEZXBlbmRlbmN5ID0gJycnCiMgR2VuZXJhdGVkIGJ5IHB1YgojIFNlZSBodHRwczovL2RhcnQuZGV2L3Rvb2xzL3B1Yi9nbG9zc2FyeSNsb2NrZmlsZQpwYWNrYWdlczoKICBfZmVfYW5hbHl6ZXJfc2hhcmVkOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IF9mZV9hbmFseXplcl9zaGFyZWQKICAgICAgc2hhMjU2OiAiNTg4MjZlNDAzMTQyMTliMjIzZjQ3MjNkZDQyMDU4NDUwNDAxNjFjZGMyZGYzZTZhMWNkY2VlZDVkODE2NTA4NCIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICI2My4wLjAiCiAgYW5hbHl6ZXI6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogYW5hbHl6ZXIKICAgICAgc2hhMjU2OiBmODU1NjZlYzdiM2QyNWNiZWE2MGY3ZGQ0ZjE1N2M1MDI1ZjJmMTkyMzNjYTRmZWVlZDMzYjYxNmM3OGEyNmEzCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiNi4xLjAiCiAgYXJjaGl2ZToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBhcmNoaXZlCiAgICAgIHNoYTI1NjogIjBjODM2OGM5YjNmMGFiYmMxOTNiOWQ2MTMzNjQ5YTYxNDIwNGI1Mjg5ODJiZWJjNzAyNjM3MmQ2MTY3N2NlM2EiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMy4zLjciCiAgYXJnczoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBhcmdzCiAgICAgIHNoYTI1NjogZWVmNmM0NmI2MjJlMDQ5NGEzNmM1YTEyZDEwZDc3ZmI0ZTg1NTUwMWE5MWMxYjllZjkzMzkzMjZlNThmMDU5NgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjIuNC4yIgogIGFzeW5jOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGFzeW5jCiAgICAgIHNoYTI1NjogIjk0N2JmY2YxODdmNzRkYmM1ZTE0NmM5ZWI5YzBmMTBjOWY4YjMwNzQzZTM0MTQ4MWMxZTJlZDNlY2MxOGMyMGMiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi4xMS4wIgogIGJvb2xlYW5fc2VsZWN0b3I6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogYm9vbGVhbl9zZWxlY3RvcgogICAgICBzaGEyNTY6ICI2Y2ZiNWFmMTIyNTNlYWYyYjM2OGYwN2JhY2M1YTgwZDEzMDFhMDcxYzczMzYwZDc0NmI3ZjJlMzJkNzYyYzY2IgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjIuMS4xIgogIGNoZWNrZWRfeWFtbDoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBjaGVja2VkX3lhbWwKICAgICAgc2hhMjU2OiBmZWI2YmVkMjE5NDkwNjE3MzFhN2E3NWZjNWQyYWE3MjdjZjE2MGI5MWFmOWEzZTQ2NGM1ZTNhMzJlMjhiNWZmCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi4wLjMiCiAgY29sbGVjdGlvbjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBjb2xsZWN0aW9uCiAgICAgIHNoYTI1NjogZWU2N2NiMDcxNTkxMWQyOGRiNmJmNGFmMTAyNjA3OGJkNmYwMTI4YjA3YTVmNjZmYjJlZDk0ZWM2NzgzYzA5YQogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMTguMCIKICBjb252ZXJ0OgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGNvbnZlcnQKICAgICAgc2hhMjU2OiAiMGYwOGIxNDc1NWQxNjNmNmUyMTM0Y2I1ODIyMmRkMjVlYTJhMmVlOGExOTVlNTM5ODNkNTdjMDc1MzI0ZDU5MiIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIzLjEuMSIKICBjb3ZlcmFnZToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBjb3ZlcmFnZQogICAgICBzaGEyNTY6ICIyZmI4MTUwODBlNDRhMDliODVlMGYyY2E4YTgyMGIxNTA1Mzk4MmIyZTcxNGI1OTI2NzcxOWU4YTlmZjE3MDk3IgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuNi4zIgogIGNyeXB0bzoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBjcnlwdG8KICAgICAgc2hhMjU2OiBmZjYyNTc3NDE3Mzc1NDY4MWQ2NmRhYWY0YTQ0ODY4NGZiMDRiNzhmOTAyZGE5Y2IzZDMwOGMxOWNjNWU4YmFiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMy4wLjMiCiAgZmlsZToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBmaWxlCiAgICAgIHNoYTI1NjogIjVmYzIyZDdjMjU1ODJlMzhhZDlhODUxNTM3MmNkOWE5MzgzNDAyN2FhY2YxODAxY2YwMTE2NGRhYzBmZmEwOGMiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiNy4wLjAiCiAgZm9vOgogICAgZGVwZW5kZW5jeTogImRpcmVjdCBtYWluIgogICAgZGVzY3JpcHRpb246CiAgICAgIHBhdGg6ICIuLi8uLi9mb28iCiAgICAgIHJlbGF0aXZlOiB0cnVlCiAgICBzb3VyY2U6IHBhdGgKICAgIHZlcnNpb246ICIwLjAuMCIKICBiYXI6CiAgICBkZXBlbmRlbmN5OiAiZGlyZWN0IG1haW4iCiAgICBkZXNjcmlwdGlvbjoKICAgICAgcGF0aDogInBhY2thZ2VzL2JhciIKICAgICAgcmVsYXRpdmU6IHRydWUKICAgIHNvdXJjZTogcGF0aAogICAgdmVyc2lvbjogIjAuMC4wIgogIGZyb250ZW5kX3NlcnZlcl9jbGllbnQ6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogZnJvbnRlbmRfc2VydmVyX2NsaWVudAogICAgICBzaGEyNTY6ICI0MDhlM2NhMTQ4YjMxYzIwMjgyYWQ2ZjM3ZWJmYTZmNGJkYzhmZWRlNWI3NGJjMmYwOGQ5ZDkyYjU1ZGIzNjEyIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjMuMi4wIgogIGdsb2I6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogZ2xvYgogICAgICBzaGEyNTY6ICIwZTcwMTRiM2I3ZDRkYWMxY2E0ZDYxMTRmODJiZjE3ODJlZTg2NzQ1YjliNDJhOTJjOTI4OWMyM2Q4YTBhYjYzIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjIuMS4yIgogIGh0dHA6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogaHR0cAogICAgICBzaGEyNTY6ICI3NTlkMWEzMjk4NDdkZDBmMzkyMjZjNjg4ZDNlMDZhNmI4Njc5NjY4ZTM1MGUyODkxYTY0NzRmOGI0YmI4NTI1IgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMS4wIgogIGh0dHBfbXVsdGlfc2VydmVyOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGh0dHBfbXVsdGlfc2VydmVyCiAgICAgIHNoYTI1NjogIjk3NDg2ZjIwZjljMmY3YmU4ZjUxNDg1MTcwM2QwMTE5YzM1OTZkMTRlYTYzMjI3YWY2ZjdhNDgxZWYyYjJmOGIiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMy4yLjEiCiAgaHR0cF9wYXJzZXI6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogaHR0cF9wYXJzZXIKICAgICAgc2hhMjU2OiAiMmFhMDhjZTAzNDFjYzliMzU0YTQ5ODM4OGUzMDk4NjUxNTQwNjY2OGRiY2M0ZjdjOTUwYzNlNzE1NDk2NjkzYiIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICI0LjAuMiIKICBpbzoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBpbwogICAgICBzaGEyNTY6ICIyZWMyNTcwNGFiYTM2MTY1OWUxMGUzZTVmNWQ2NzIwNjhkMzMyZmM4YWM1MTY0MjFkNDgzYTExZTVjYmQwNjFlIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMC40IgogIGpzOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGpzCiAgICAgIHNoYTI1NjogZjJjNDQ1ZGNlNDk2MjcxMzYwOTQ5ODA2MTVhMDMxNDE5ZjdmM2ViMzkzMjM3ZTRlY2Q5N2FjMTVkZWEzNDNmMwogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjAuNi43IgogIGpzb25fYW5ub3RhdGlvbjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBqc29uX2Fubm90YXRpb24KICAgICAgc2hhMjU2OiBiMTBhN2IyZmY4M2Q4M2M3NzdlZGJhM2M2YTBmOTcwNDVkZGFkZDU2Yzk0NGUxYTIzYTNmZGY0M2ExYmY0NDY3CiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiNC44LjEiCiAgbG9nZ2luZzoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBsb2dnaW5nCiAgICAgIHNoYTI1NjogIjYyM2E4OGM5NTk0YWE3NzQ0NDNhYTNlYjJkNDE4MDdhNDg0ODZiNTYxM2U2NzU5OWZiNGM0MWMwYWQ0N2MzNDAiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4yLjAiCiAgbWFzb246CiAgICBkZXBlbmRlbmN5OiAiZGlyZWN0IG1haW4iCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogbWFzb24KICAgICAgc2hhMjU2OiBmZGM5ZWE5MDVlN2M2OTBmZTM5ZDJmOTk0NmI3YWVhZDg2ZmQ5NzZmOGVkZjk3ZDI1MjFhNjVkMjYwYmJmNTA5CiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMC4xLjAtZGV2LjUwIgogIG1hc29uX2xvZ2dlcjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBtYXNvbl9sb2dnZXIKICAgICAgc2hhMjU2OiBjMTI4NjBhZTgxZjBiZGM1ZDA1ZDc5MTRmZTQ3M2JmYjI5NDA0N2U5ZGM2NGU4OTk1YjU3NTNjNzIwN2U4MWI5CiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMC4yLjgiCiAgbWF0Y2hlcjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBtYXRjaGVyCiAgICAgIHNoYTI1NjogIjE4MDNlNzZlNjY1Mzc2OGQ2NGVkOGZmMmUxZTY3YmVhM2FkNGI5MjNlYjVjNTZhMjk1YzNlNjM0YmFkNTk2MGUiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMC4xMi4xNiIKICBtZXRhOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IG1ldGEKICAgICAgc2hhMjU2OiAiM2M3NGRiZjg3NjNkMzY1MzlmMTE0Yzc5OWQ4YTJkODczNDNiNTA2N2U5ZDc5NmNhMjJiNWViODQzNzA5MGVlMyIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjkuMSIKICBtaW1lOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IG1pbWUKICAgICAgc2hhMjU2OiBlNGZmOGU4NTY0YzAzZjI1NTQwOGRlY2QxNmU3ODk5ZGExNzMzODUyYTkxMTBhNThmZTZkMWI4MTc2ODRhNjNlCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4wLjQiCiAgbXVzdGFjaGVfdGVtcGxhdGU6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogbXVzdGFjaGVfdGVtcGxhdGUKICAgICAgc2hhMjU2OiBhNDZlMjZmOTE0NDViZmIwYjYwNTE5YmUyODA1NTViMDY3OTI0NjBiMjdiMTllMmIxOWFkNWI5NzQwZGY1ZDFjCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi4wLjAiCiAgbm9kZV9wcmVhbWJsZToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBub2RlX3ByZWFtYmxlCiAgICAgIHNoYTI1NjogIjZlN2VhYzg5MDQ3YWI4YThkMjZjZjE2MTI3YjVlZDI2ZGU2NTIwOTg0NzYzMDQwMGY5YWVmZDdjZDVjNzMwZGIiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi4wLjIiCiAgcGFja2FnZV9jb25maWc6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogcGFja2FnZV9jb25maWcKICAgICAgc2hhMjU2OiAiMWM1Yjc3Y2NjOTFlNDgyM2E1YWY2MWVlNzRlNmI5NzJkYjFlZjk4YzJmZjVhMThkMzE2MWM5ODJhNTU0NDhiZCIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIyLjEuMCIKICBwYXRoOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHBhdGgKICAgICAgc2hhMjU2OiAiODgyOWQ4YTU1YzEzZmMwZTM3MTI3YzI5ZmVkZjI5MGMxMDJmNGU0MGFlOTRhZGE1NzQwOTFmZTBmZjk2YzkxNyIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjguMyIKICBwb2ludHljYXN0bGU6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogcG9pbnR5Y2FzdGxlCiAgICAgIHNoYTI1NjogIjdjMWU1ZjBkMjNjOTAxNmM1YmJkOGIxNDczZDBkM2ZiM2ZjODUxYjg3NjA0NjAzOTUwOWUxOGUwYzc0ODVmMmMiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMy43LjMiCiAgcG9vbDoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBwb29sCiAgICAgIHNoYTI1NjogIjIwZmU4NjhiNjMxNGIzMjJlYTAzNmJhMzI1ZTZmYzA3MTFhMjI5NDg4NTY0NzVlMmMyYjYzMDZlOGFiMzljMmEiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS41LjEiCiAgcHViX3NlbXZlcjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBwdWJfc2VtdmVyCiAgICAgIHNoYTI1NjogIjQwZDNhYjFiYmQ0NzRjNGMyMzI4YzkxZTNhN2RmOGM2ZGQ2MjliNzllY2U0YzRiZDA0YmVlNDk2YTIyNGZiMGMiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi4xLjQiCiAgc2hlbGY6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogc2hlbGYKICAgICAgc2hhMjU2OiBhZDI5YzUwNWFlZTcwNWY0MWE0ZDg5NjM2NDFmOTFhYzRjZWUzYzhmYWQ1OTQ3ZTAzMzM5MGE3YmQ4MTgwZmE0CiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS40LjEiCiAgc2hlbGZfcGFja2FnZXNfaGFuZGxlcjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBzaGVsZl9wYWNrYWdlc19oYW5kbGVyCiAgICAgIHNoYTI1NjogIjg5Zjk2N2VjYTI5NjA3YzkzM2JhOTU3MWQ4MzhiZTMxZDY3ZjUzZjZlNGVlMTUxNDdkNWRjMjkzNGZlZTFiMWUiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMy4wLjIiCiAgc2hlbGZfc3RhdGljOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHNoZWxmX3N0YXRpYwogICAgICBzaGEyNTY6IGE0MWQzZjUzYzRhZGYwZjU3NDgwNTc4YzFkNjFkOTAzNDJjZDYxN2RlN2ZjODA3N2IxMzA0NjQzYzJkODVjMWUKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjEuMiIKICBzaGVsZl93ZWJfc29ja2V0OgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHNoZWxmX3dlYl9zb2NrZXQKICAgICAgc2hhMjU2OiAiOWNhMDgxYmU0MWM2MDE5MGViY2I0NzY2YjI0ODZhN2Q1MDI2MWRiN2JkMGY1ZDk2MTVmMmQ2NTM2MzdhODRjMSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjAuNCIKICBzb3VyY2VfbWFwX3N0YWNrX3RyYWNlOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHNvdXJjZV9tYXBfc3RhY2tfdHJhY2UKICAgICAgc2hhMjU2OiAiODRjZjc2OWFkODNhYTZiYjYxZTBhYTVhMThlNTNhZWE2ODMzOTVmMTk2YTZmMzljNGM4ODFmYjkwZWQ0ZjdhZSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIyLjEuMSIKICBzb3VyY2VfbWFwczoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBzb3VyY2VfbWFwcwogICAgICBzaGEyNTY6ICI3MDhiM2Y2Yjk3MjQ4ZTU3ODFmNDkzYjc2NWMzMzM3ZGIxMWM1ZDJjODFjMzA5NGYxMDkwNGJmYTgwMDRjNzAzIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjAuMTAuMTIiCiAgc291cmNlX3NwYW46CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogc291cmNlX3NwYW4KICAgICAgc2hhMjU2OiAiNTNlOTQzZDQyMDZhNWUzMGRmMzM4ZmQ0YzZlN2EwNzdlMDIyNTQ1MzFiMTM4YTE1YWVjM2JkMTQzYzFhOGIzYyIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjEwLjAiCiAgc3RhY2tfdHJhY2U6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogc3RhY2tfdHJhY2UKICAgICAgc2hhMjU2OiAiNzM3MTM5OTAxMjVhNmQ5MzEyMjU0MTIzNzU1MGVlMzM1MmEyZDg0YmFhZDUyZDM3NWE0Y2FkMmViOWI3Y2UwYiIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjExLjEiCiAgc3RyZWFtX2NoYW5uZWw6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogc3RyZWFtX2NoYW5uZWwKICAgICAgc2hhMjU2OiBiYTJhYTVkOGNjNjA5ZDk2YmJiMjg5OWMyODkzNGY5ZTFhZjVjZGRiZDYwYTgyNzgyMmVhNDY3MTYxZWI1NGU3CiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi4xLjIiCiAgc3RyaW5nX3NjYW5uZXI6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogc3RyaW5nX3NjYW5uZXIKICAgICAgc2hhMjU2OiAiNTU2NjkyYWRhYjZjZmE4NzMyMmExMTU2NDBjMTFmMTNjYjc3YjNmMDc2ZGRjYzVkNmFlM2MyMDI0MmJlZGNkZSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjIuMCIKICB0ZXJtX2dseXBoOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHRlcm1fZ2x5cGgKICAgICAgc2hhMjU2OiBhMjkyNDhhODRmYmI3Yzc5MjgyYjQwYjhjNzJhMTIwOWRiMTY5YTJlMDU0MmJjZTM0MWRhOTkyZmUxYmM3ZTg0CiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4yLjEiCiAgdGVzdDoKICAgIGRlcGVuZGVuY3k6ICJkaXJlY3QgZGV2IgogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHRlc3QKICAgICAgc2hhMjU2OiAiOWIwZGQ4ZTM2YWY0YTViMTU2OTAyOTk0OWQ1MGE1MmNiMmEyYTJmZGFhMjBjZWJiOTZlNjYwM2I5YWUyNDFmOSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjI0LjYiCiAgdGVzdF9hcGk6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogdGVzdF9hcGkKICAgICAgc2hhMjU2OiAiNWMyZjczMDAxODI2NGQyNzZjMjBlNGYxNTAzZmQxMzA4ZGZiYmFlMzllYzhlZTYzYzUyMzYzMTFhYzA2OTU0YiIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIwLjYuMSIKICB0ZXN0X2NvcmU6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogdGVzdF9jb3JlCiAgICAgIHNoYTI1NjogIjRiZWY4MzdlNTYzNzU1MzcwNTVmZGJiYmY2ZGQ0NThiMTg1OTg4MWY0YzdlNmRhOTM2MTU4Zjc3ZDYxYWIyNjUiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMC41LjYiCiAgdHlwZWRfZGF0YToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB0eXBlZF9kYXRhCiAgICAgIHNoYTI1NjogZmFjYzhkNjU4MmYxNjA0MmRkNDlmMjQ2M2ZmMWJkNmUyYzllZjlmM2Q1ZGEzZDliMDg3ZTI0NGE3YjU2NGIzYwogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMy4yIgogIHZtX3NlcnZpY2U6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogdm1fc2VydmljZQogICAgICBzaGEyNTY6ICIwZmFlNDMyYzg1YzRlYTg4MGIzM2I0OTdkMzI4MjRiOTc3OTViMDRjZGFhNzRkMjcwMjE5NTcyYTFmNTAyNjhkIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjExLjkuMCIKICB3YXRjaGVyOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHdhdGNoZXIKICAgICAgc2hhMjU2OiAiM2QyYWQ2NzUxYjNjMTZjZjA3YzdmY2EzMTdhMTQxM2IzZjI2NTMwMzE5MTgxYjM3ZTNiOTAzOWI4NGZjMDFkOCIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjEuMCIKICB3ZWJfc29ja2V0X2NoYW5uZWw6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogd2ViX3NvY2tldF9jaGFubmVsCiAgICAgIHNoYTI1NjogZDg4MjM4ZTVlYWM5YTQyYmI0M2NhNGU3MjFlZGJhM2MwOGM2MzU0ZDRhNTMwNjNhZmFhNTY4NTE2MjE3NjIxYgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjIuNC4wIgogIHdlYmtpdF9pbnNwZWN0aW9uX3Byb3RvY29sOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHdlYmtpdF9pbnNwZWN0aW9uX3Byb3RvY29sCiAgICAgIHNoYTI1NjogIjY3ZDNhOGI2Yzc5ZTE5ODdkMTlkODQ4YjA4OTJlNTgyZGJiMGM2NmM1N2NjMWZlZjU4YTE3N2RkMmFhMjgyM2QiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4yLjAiCiAgeWFtbDoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB5YW1sCiAgICAgIHNoYTI1NjogIjc1NzY5NTAxZWEzNDg5ZmNhNTY2MDFmZjMzNDU0ZmU0NTUwN2VhM2JmYjAxNDE2MWFiYzNiNDNhZTI1OTg5ZDUiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMy4xLjIiCnNka3M6CiAgZGFydDogIj49My4wLjAgPDQuMC4wIgonJyc7Cgpjb25zdCBub1BhdGhEZXBlbmRlbmNpZXMgPSAnJycKIyBHZW5lcmF0ZWQgYnkgcHViCiMgU2VlIGh0dHBzOi8vZGFydC5kZXYvdG9vbHMvcHViL2dsb3NzYXJ5I2xvY2tmaWxlCnBhY2thZ2VzOgogIF9mZV9hbmFseXplcl9zaGFyZWQ6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogX2ZlX2FuYWx5emVyX3NoYXJlZAogICAgICBzaGEyNTY6ICI1ODgyNmU0MDMxNDIxOWIyMjNmNDcyM2RkNDIwNTg0NTA0MDE2MWNkYzJkZjNlNmExY2RjZWVkNWQ4MTY1MDg0IgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjYzLjAuMCIKICBhbmFseXplcjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBhbmFseXplcgogICAgICBzaGEyNTY6IGY4NTU2NmVjN2IzZDI1Y2JlYTYwZjdkZDRmMTU3YzUwMjVmMmYxOTIzM2NhNGZlZWVkMzNiNjE2Yzc4YTI2YTMKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICI2LjEuMCIKICBhcmNoaXZlOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGFyY2hpdmUKICAgICAgc2hhMjU2OiAiMGM4MzY4YzliM2YwYWJiYzE5M2I5ZDYxMzM2NDlhNjE0MjA0YjUyODk4MmJlYmM3MDI2MzcyZDYxNjc3Y2UzYSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIzLjMuNyIKICBhcmdzOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGFyZ3MKICAgICAgc2hhMjU2OiBlZWY2YzQ2YjYyMmUwNDk0YTM2YzVhMTJkMTBkNzdmYjRlODU1NTAxYTkxYzFiOWVmOTMzOTMyNmU1OGYwNTk2CiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi40LjIiCiAgYXN5bmM6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogYXN5bmMKICAgICAgc2hhMjU2OiAiOTQ3YmZjZjE4N2Y3NGRiYzVlMTQ2YzllYjljMGYxMGM5ZjhiMzA3NDNlMzQxNDgxYzFlMmVkM2VjYzE4YzIwYyIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIyLjExLjAiCiAgYm9vbGVhbl9zZWxlY3RvcjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBib29sZWFuX3NlbGVjdG9yCiAgICAgIHNoYTI1NjogIjZjZmI1YWYxMjI1M2VhZjJiMzY4ZjA3YmFjYzVhODBkMTMwMWEwNzFjNzMzNjBkNzQ2YjdmMmUzMmQ3NjJjNjYiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi4xLjEiCiAgY2hlY2tlZF95YW1sOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGNoZWNrZWRfeWFtbAogICAgICBzaGEyNTY6IGZlYjZiZWQyMTk0OTA2MTczMWE3YTc1ZmM1ZDJhYTcyN2NmMTYwYjkxYWY5YTNlNDY0YzVlM2EzMmUyOGI1ZmYKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIyLjAuMyIKICBjb2xsZWN0aW9uOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGNvbGxlY3Rpb24KICAgICAgc2hhMjU2OiBlZTY3Y2IwNzE1OTExZDI4ZGI2YmY0YWYxMDI2MDc4YmQ2ZjAxMjhiMDdhNWY2NmZiMmVkOTRlYzY3ODNjMDlhCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4xOC4wIgogIGNvbnZlcnQ6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogY29udmVydAogICAgICBzaGEyNTY6ICIwZjA4YjE0NzU1ZDE2M2Y2ZTIxMzRjYjU4MjIyZGQyNWVhMmEyZWU4YTE5NWU1Mzk4M2Q1N2MwNzUzMjRkNTkyIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjMuMS4xIgogIGNvdmVyYWdlOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGNvdmVyYWdlCiAgICAgIHNoYTI1NjogIjJmYjgxNTA4MGU0NGEwOWI4NWUwZjJjYThhODIwYjE1MDUzOTgyYjJlNzE0YjU5MjY3NzE5ZThhOWZmMTcwOTciCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS42LjMiCiAgY3J5cHRvOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGNyeXB0bwogICAgICBzaGEyNTY6IGZmNjI1Nzc0MTczNzU0NjgxZDY2ZGFhZjRhNDQ4Njg0ZmIwNGI3OGY5MDJkYTljYjNkMzA4YzE5Y2M1ZThiYWIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIzLjAuMyIKICBmaWxlOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGZpbGUKICAgICAgc2hhMjU2OiAiNWZjMjJkN2MyNTU4MmUzOGFkOWE4NTE1MzcyY2Q5YTkzODM0MDI3YWFjZjE4MDFjZjAxMTY0ZGFjMGZmYTA4YyIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICI3LjAuMCIKICBmcm9udGVuZF9zZXJ2ZXJfY2xpZW50OgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGZyb250ZW5kX3NlcnZlcl9jbGllbnQKICAgICAgc2hhMjU2OiAiNDA4ZTNjYTE0OGIzMWMyMDI4MmFkNmYzN2ViZmE2ZjRiZGM4ZmVkZTViNzRiYzJmMDhkOWQ5MmI1NWRiMzYxMiIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIzLjIuMCIKICBnbG9iOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGdsb2IKICAgICAgc2hhMjU2OiAiMGU3MDE0YjNiN2Q0ZGFjMWNhNGQ2MTE0ZjgyYmYxNzgyZWU4Njc0NWI5YjQyYTkyYzkyODljMjNkOGEwYWI2MyIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIyLjEuMiIKICBodHRwOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGh0dHAKICAgICAgc2hhMjU2OiAiNzU5ZDFhMzI5ODQ3ZGQwZjM5MjI2YzY4OGQzZTA2YTZiODY3OTY2OGUzNTBlMjg5MWE2NDc0ZjhiNGJiODUyNSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjEuMCIKICBodHRwX211bHRpX3NlcnZlcjoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBodHRwX211bHRpX3NlcnZlcgogICAgICBzaGEyNTY6ICI5NzQ4NmYyMGY5YzJmN2JlOGY1MTQ4NTE3MDNkMDExOWMzNTk2ZDE0ZWE2MzIyN2FmNmY3YTQ4MWVmMmIyZjhiIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjMuMi4xIgogIGh0dHBfcGFyc2VyOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGh0dHBfcGFyc2VyCiAgICAgIHNoYTI1NjogIjJhYTA4Y2UwMzQxY2M5YjM1NGE0OTgzODhlMzA5ODY1MTU0MDY2NjhkYmNjNGY3Yzk1MGMzZTcxNTQ5NjY5M2IiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiNC4wLjIiCiAgaW86CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogaW8KICAgICAgc2hhMjU2OiAiMmVjMjU3MDRhYmEzNjE2NTllMTBlM2U1ZjVkNjcyMDY4ZDMzMmZjOGFjNTE2NDIxZDQ4M2ExMWU1Y2JkMDYxZSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjAuNCIKICBqczoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBqcwogICAgICBzaGEyNTY6IGYyYzQ0NWRjZTQ5NjI3MTM2MDk0OTgwNjE1YTAzMTQxOWY3ZjNlYjM5MzIzN2U0ZWNkOTdhYzE1ZGVhMzQzZjMKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIwLjYuNyIKICBqc29uX2Fubm90YXRpb246CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZToganNvbl9hbm5vdGF0aW9uCiAgICAgIHNoYTI1NjogYjEwYTdiMmZmODNkODNjNzc3ZWRiYTNjNmEwZjk3MDQ1ZGRhZGQ1NmM5NDRlMWEyM2EzZmRmNDNhMWJmNDQ2NwogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjQuOC4xIgogIGxvZ2dpbmc6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogbG9nZ2luZwogICAgICBzaGEyNTY6ICI2MjNhODhjOTU5NGFhNzc0NDQzYWEzZWIyZDQxODA3YTQ4NDg2YjU2MTNlNjc1OTlmYjRjNDFjMGFkNDdjMzQwIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMi4wIgogIG1hc29uOgogICAgZGVwZW5kZW5jeTogImRpcmVjdCBtYWluIgogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IG1hc29uCiAgICAgIHNoYTI1NjogZmRjOWVhOTA1ZTdjNjkwZmUzOWQyZjk5NDZiN2FlYWQ4NmZkOTc2ZjhlZGY5N2QyNTIxYTY1ZDI2MGJiZjUwOQogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjAuMS4wLWRldi41MCIKICBtYXNvbl9sb2dnZXI6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogbWFzb25fbG9nZ2VyCiAgICAgIHNoYTI1NjogYzEyODYwYWU4MWYwYmRjNWQwNWQ3OTE0ZmU0NzNiZmIyOTQwNDdlOWRjNjRlODk5NWI1NzUzYzcyMDdlODFiOQogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjAuMi44IgogIG1hdGNoZXI6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogbWF0Y2hlcgogICAgICBzaGEyNTY6ICIxODAzZTc2ZTY2NTM3NjhkNjRlZDhmZjJlMWU2N2JlYTNhZDRiOTIzZWI1YzU2YTI5NWMzZTYzNGJhZDU5NjBlIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjAuMTIuMTYiCiAgbWV0YToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBtZXRhCiAgICAgIHNoYTI1NjogIjNjNzRkYmY4NzYzZDM2NTM5ZjExNGM3OTlkOGEyZDg3MzQzYjUwNjdlOWQ3OTZjYTIyYjVlYjg0MzcwOTBlZTMiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS45LjEiCiAgbWltZToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBtaW1lCiAgICAgIHNoYTI1NjogZTRmZjhlODU2NGMwM2YyNTU0MDhkZWNkMTZlNzg5OWRhMTczMzg1MmE5MTEwYTU4ZmU2ZDFiODE3Njg0YTYzZQogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMC40IgogIG11c3RhY2hlX3RlbXBsYXRlOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IG11c3RhY2hlX3RlbXBsYXRlCiAgICAgIHNoYTI1NjogYTQ2ZTI2ZjkxNDQ1YmZiMGI2MDUxOWJlMjgwNTU1YjA2NzkyNDYwYjI3YjE5ZTJiMTlhZDViOTc0MGRmNWQxYwogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjIuMC4wIgogIG5vZGVfcHJlYW1ibGU6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogbm9kZV9wcmVhbWJsZQogICAgICBzaGEyNTY6ICI2ZTdlYWM4OTA0N2FiOGE4ZDI2Y2YxNjEyN2I1ZWQyNmRlNjUyMDk4NDc2MzA0MDBmOWFlZmQ3Y2Q1YzczMGRiIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjIuMC4yIgogIHBhY2thZ2VfY29uZmlnOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHBhY2thZ2VfY29uZmlnCiAgICAgIHNoYTI1NjogIjFjNWI3N2NjYzkxZTQ4MjNhNWFmNjFlZTc0ZTZiOTcyZGIxZWY5OGMyZmY1YTE4ZDMxNjFjOTgyYTU1NDQ4YmQiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi4xLjAiCiAgcGF0aDoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBwYXRoCiAgICAgIHNoYTI1NjogIjg4MjlkOGE1NWMxM2ZjMGUzNzEyN2MyOWZlZGYyOTBjMTAyZjRlNDBhZTk0YWRhNTc0MDkxZmUwZmY5NmM5MTciCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS44LjMiCiAgcG9pbnR5Y2FzdGxlOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHBvaW50eWNhc3RsZQogICAgICBzaGEyNTY6ICI3YzFlNWYwZDIzYzkwMTZjNWJiZDhiMTQ3M2QwZDNmYjNmYzg1MWI4NzYwNDYwMzk1MDllMThlMGM3NDg1ZjJjIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjMuNy4zIgogIHBvb2w6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogcG9vbAogICAgICBzaGEyNTY6ICIyMGZlODY4YjYzMTRiMzIyZWEwMzZiYTMyNWU2ZmMwNzExYTIyOTQ4ODU2NDc1ZTJjMmI2MzA2ZThhYjM5YzJhIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuNS4xIgogIHB1Yl9zZW12ZXI6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogcHViX3NlbXZlcgogICAgICBzaGEyNTY6ICI0MGQzYWIxYmJkNDc0YzRjMjMyOGM5MWUzYTdkZjhjNmRkNjI5Yjc5ZWNlNGM0YmQwNGJlZTQ5NmEyMjRmYjBjIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjIuMS40IgogIHNoZWxmOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHNoZWxmCiAgICAgIHNoYTI1NjogYWQyOWM1MDVhZWU3MDVmNDFhNGQ4OTYzNjQxZjkxYWM0Y2VlM2M4ZmFkNTk0N2UwMzMzOTBhN2JkODE4MGZhNAogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuNC4xIgogIHNoZWxmX3BhY2thZ2VzX2hhbmRsZXI6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogc2hlbGZfcGFja2FnZXNfaGFuZGxlcgogICAgICBzaGEyNTY6ICI4OWY5NjdlY2EyOTYwN2M5MzNiYTk1NzFkODM4YmUzMWQ2N2Y1M2Y2ZTRlZTE1MTQ3ZDVkYzI5MzRmZWUxYjFlIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjMuMC4yIgogIHNoZWxmX3N0YXRpYzoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBzaGVsZl9zdGF0aWMKICAgICAgc2hhMjU2OiBhNDFkM2Y1M2M0YWRmMGY1NzQ4MDU3OGMxZDYxZDkwMzQyY2Q2MTdkZTdmYzgwNzdiMTMwNDY0M2MyZDg1YzFlCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4xLjIiCiAgc2hlbGZfd2ViX3NvY2tldDoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBzaGVsZl93ZWJfc29ja2V0CiAgICAgIHNoYTI1NjogIjljYTA4MWJlNDFjNjAxOTBlYmNiNDc2NmIyNDg2YTdkNTAyNjFkYjdiZDBmNWQ5NjE1ZjJkNjUzNjM3YTg0YzEiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4wLjQiCiAgc291cmNlX21hcF9zdGFja190cmFjZToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBzb3VyY2VfbWFwX3N0YWNrX3RyYWNlCiAgICAgIHNoYTI1NjogIjg0Y2Y3NjlhZDgzYWE2YmI2MWUwYWE1YTE4ZTUzYWVhNjgzMzk1ZjE5NmE2ZjM5YzRjODgxZmI5MGVkNGY3YWUiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi4xLjEiCiAgc291cmNlX21hcHM6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogc291cmNlX21hcHMKICAgICAgc2hhMjU2OiAiNzA4YjNmNmI5NzI0OGU1NzgxZjQ5M2I3NjVjMzMzN2RiMTFjNWQyYzgxYzMwOTRmMTA5MDRiZmE4MDA0YzcwMyIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIwLjEwLjEyIgogIHNvdXJjZV9zcGFuOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHNvdXJjZV9zcGFuCiAgICAgIHNoYTI1NjogIjUzZTk0M2Q0MjA2YTVlMzBkZjMzOGZkNGM2ZTdhMDc3ZTAyMjU0NTMxYjEzOGExNWFlYzNiZDE0M2MxYThiM2MiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4xMC4wIgogIHN0YWNrX3RyYWNlOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHN0YWNrX3RyYWNlCiAgICAgIHNoYTI1NjogIjczNzEzOTkwMTI1YTZkOTMxMjI1NDEyMzc1NTBlZTMzNTJhMmQ4NGJhYWQ1MmQzNzVhNGNhZDJlYjliN2NlMGIiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4xMS4xIgogIHN0cmVhbV9jaGFubmVsOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHN0cmVhbV9jaGFubmVsCiAgICAgIHNoYTI1NjogYmEyYWE1ZDhjYzYwOWQ5NmJiYjI4OTljMjg5MzRmOWUxYWY1Y2RkYmQ2MGE4Mjc4MjJlYTQ2NzE2MWViNTRlNwogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjIuMS4yIgogIHN0cmluZ19zY2FubmVyOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHN0cmluZ19zY2FubmVyCiAgICAgIHNoYTI1NjogIjU1NjY5MmFkYWI2Y2ZhODczMjJhMTE1NjQwYzExZjEzY2I3N2IzZjA3NmRkY2M1ZDZhZTNjMjAyNDJiZWRjZGUiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4yLjAiCiAgdGVybV9nbHlwaDoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB0ZXJtX2dseXBoCiAgICAgIHNoYTI1NjogYTI5MjQ4YTg0ZmJiN2M3OTI4MmI0MGI4YzcyYTEyMDlkYjE2OWEyZTA1NDJiY2UzNDFkYTk5MmZlMWJjN2U4NAogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMi4xIgogIHRlc3Q6CiAgICBkZXBlbmRlbmN5OiAiZGlyZWN0IG1haW4iCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogdGVzdAogICAgICBzaGEyNTY6ICI5YjBkZDhlMzZhZjRhNWIxNTY5MDI5OTQ5ZDUwYTUyY2IyYTJhMmZkYWEyMGNlYmI5NmU2NjAzYjlhZTI0MWY5IgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMjQuNiIKICB0ZXN0X2FwaToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB0ZXN0X2FwaQogICAgICBzaGEyNTY6ICI1YzJmNzMwMDE4MjY0ZDI3NmMyMGU0ZjE1MDNmZDEzMDhkZmJiYWUzOWVjOGVlNjNjNTIzNjMxMWFjMDY5NTRiIgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjAuNi4xIgogIHRlc3RfY29yZToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB0ZXN0X2NvcmUKICAgICAgc2hhMjU2OiAiNGJlZjgzN2U1NjM3NTUzNzA1NWZkYmJiZjZkZDQ1OGIxODU5ODgxZjRjN2U2ZGE5MzYxNThmNzdkNjFhYjI2NSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIwLjUuNiIKICB0eXBlZF9kYXRhOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHR5cGVkX2RhdGEKICAgICAgc2hhMjU2OiBmYWNjOGQ2NTgyZjE2MDQyZGQ0OWYyNDYzZmYxYmQ2ZTJjOWVmOWYzZDVkYTNkOWIwODdlMjQ0YTdiNTY0YjNjCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4zLjIiCiAgdm1fc2VydmljZToKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB2bV9zZXJ2aWNlCiAgICAgIHNoYTI1NjogIjBmYWU0MzJjODVjNGVhODgwYjMzYjQ5N2QzMjgyNGI5Nzc5NWIwNGNkYWE3NGQyNzAyMTk1NzJhMWY1MDI2OGQiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMTEuOS4wIgogIHdhdGNoZXI6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogd2F0Y2hlcgogICAgICBzaGEyNTY6ICIzZDJhZDY3NTFiM2MxNmNmMDdjN2ZjYTMxN2ExNDEzYjNmMjY1MzAzMTkxODFiMzdlM2I5MDM5Yjg0ZmMwMWQ4IgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMS4wIgogIHdlYl9zb2NrZXRfY2hhbm5lbDoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB3ZWJfc29ja2V0X2NoYW5uZWwKICAgICAgc2hhMjU2OiBkODgyMzhlNWVhYzlhNDJiYjQzY2E0ZTcyMWVkYmEzYzA4YzYzNTRkNGE1MzA2M2FmYWE1Njg1MTYyMTc2MjFiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi40LjAiCiAgd2Via2l0X2luc3BlY3Rpb25fcHJvdG9jb2w6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogd2Via2l0X2luc3BlY3Rpb25fcHJvdG9jb2wKICAgICAgc2hhMjU2OiAiNjdkM2E4YjZjNzllMTk4N2QxOWQ4NDhiMDg5MmU1ODJkYmIwYzY2YzU3Y2MxZmVmNThhMTc3ZGQyYWEyODIzZCIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjIuMCIKICB5YW1sOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHlhbWwKICAgICAgc2hhMjU2OiAiNzU3Njk1MDFlYTM0ODlmY2E1NjYwMWZmMzM0NTRmZTQ1NTA3ZWEzYmZiMDE0MTYxYWJjM2I0M2FlMjU5ODlkNSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIzLjEuMiIKc2RrczoKICBkYXJ0OiAiPj0zLjAuMCA8NC4wLjAiCicnJzsK", - "type": "text" - }, - { - "path": "test/src/create_bundle_test.dart", - "data": - "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JyBoaWRlIGNyZWF0ZUJ1bmRsZTsKaW1wb3J0ICdwYWNrYWdlOm1vY2t0YWlsL21vY2t0YWlsLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CgppbXBvcnQgJy4uLy4uL3NyYy9jcmVhdGVfYnVuZGxlLmRhcnQnOwoKY2xhc3MgX01vY2tMb2dnZXIgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgTG9nZ2VyIHt9CgpjbGFzcyBfTW9ja1Byb2dyZXNzIGV4dGVuZHMgTW9jayBpbXBsZW1lbnRzIFByb2dyZXNzIHt9CgpjbGFzcyBfRmFrZUhvb2tDb250ZXh0IGV4dGVuZHMgRmFrZSBpbXBsZW1lbnRzIEhvb2tDb250ZXh0IHsKICBfRmFrZUhvb2tDb250ZXh0KHtMb2dnZXI/IGxvZ2dlcn0pIDogX2xvZ2dlciA9IGxvZ2dlciA/PyBfTW9ja0xvZ2dlcigpOwoKICBmaW5hbCBMb2dnZXIgX2xvZ2dlcjsKCiAgdmFyIF92YXJzID0gPFN0cmluZywgZHluYW1pYz57fTsKCiAgQG92ZXJyaWRlCiAgTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0IHZhcnMgPT4gX3ZhcnM7CgogIEBvdmVycmlkZQogIHNldCB2YXJzKE1hcDxTdHJpbmcsIGR5bmFtaWM+IHZhbHVlKSA9PiBfdmFycyA9IHZhbHVlOwoKICBAb3ZlcnJpZGUKICBMb2dnZXIgZ2V0IGxvZ2dlciA9PiBfbG9nZ2VyOwp9Cgp2b2lkIG1haW4oKSB7CiAgZ3JvdXAoJ2NyZWF0ZUJ1bmRsZScsICgpIHsKICAgIGxhdGUgSG9va0NvbnRleHQgY29udGV4dDsKICAgIGxhdGUgTG9nZ2VyIGxvZ2dlcjsKCiAgICBzZXRVcCgoKSB7CiAgICAgIGxvZ2dlciA9IF9Nb2NrTG9nZ2VyKCk7CiAgICAgIGNvbnRleHQgPSBfRmFrZUhvb2tDb250ZXh0KGxvZ2dlcjogbG9nZ2VyKTsKCiAgICAgIHdoZW4oKCkgPT4gbG9nZ2VyLnByb2dyZXNzKGFueSgpKSkudGhlblJldHVybihfTW9ja1Byb2dyZXNzKCkpOwogICAgfSk7CgogICAgdGVzdCgnZXhpdCgxKSBpZiBidW5kbGluZyB0aHJvd3MnLCAoKSBhc3luYyB7CiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGF3YWl0IGNyZWF0ZUJ1bmRsZShjb250ZXh0LCBEaXJlY3RvcnkoJy9pbnZhbGlkL2RpcicpLCBleGl0Q2FsbHMuYWRkKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgZXF1YWxzKFsxXSkpOwogICAgICB2ZXJpZnkoKCkgPT4gbG9nZ2VyLmVycihhbnkoKSkpLmNhbGxlZCgxKTsKICAgIH0pOwoKICAgIHRlc3QoJ2RvZXMgbm90IHRocm93IHdoZW4gYnVuZGxpbmcgc3VjY2VlZHMnLCAoKSBhc3luYyB7CiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGZpbmFsIGRpcmVjdG9yeSA9IERpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKCk7CiAgICAgIGZpbmFsIGRvdERhcnRGcm9nRGlyID0gRGlyZWN0b3J5KHBhdGguam9pbihkaXJlY3RvcnkucGF0aCwgJy5kYXJ0X2Zyb2cnKSkKICAgICAgICAuLmNyZWF0ZVN5bmMoKTsKICAgICAgZmluYWwgYnVpbGREaXIgPSBEaXJlY3RvcnkocGF0aC5qb2luKGRpcmVjdG9yeS5wYXRoLCAnYnVpbGQnKSkKICAgICAgICAuLmNyZWF0ZVN5bmMoKTsKICAgICAgZmluYWwgb2xkQnVpbGRBcnRpZmFjdCA9IEZpbGUocGF0aC5qb2luKGJ1aWxkRGlyLnBhdGgsICdhcnRpZmFjdC50eHQnKSkKICAgICAgICAuLmNyZWF0ZVN5bmMoKTsKICAgICAgYXdhaXQgY3JlYXRlQnVuZGxlKGNvbnRleHQsIGRpcmVjdG9yeSwgZXhpdENhbGxzLmFkZCk7CiAgICAgIGV4cGVjdChkb3REYXJ0RnJvZ0Rpci5leGlzdHNTeW5jKCksIGlzRmFsc2UpOwogICAgICBleHBlY3QoYnVpbGREaXIuZXhpc3RzU3luYygpLCBpc1RydWUpOwogICAgICBleHBlY3Qob2xkQnVpbGRBcnRpZmFjdC5leGlzdHNTeW5jKCksIGlzRmFsc2UpOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBpc0VtcHR5KTsKICAgICAgdmVyaWZ5TmV2ZXIoKCkgPT4gbG9nZ2VyLmVycihhbnkoKSkpOwogICAgfSk7CiAgfSk7Cn0K", - "type": "text" - }, - { - "path": "test/src/create_external_packages_folder_test.dart", - "data": - "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKCmltcG9ydCAnLi4vLi4vc3JjL2NyZWF0ZV9leHRlcm5hbF9wYWNrYWdlc19mb2xkZXIuZGFydCc7CmltcG9ydCAnLi4vcHVic3BlY2tfbG9ja3MuZGFydCc7Cgp2b2lkIG1haW4oKSB7CiAgZ3JvdXAoJ2NyZWF0ZUV4dGVybmFsUGFja2FnZXNGb2xkZXInLCAoKSB7CiAgICB0ZXN0KAogICAgICAnYnVuZGxlcyBleHRlcm5hbCBkZXBlbmRlbmNpZXMgd2l0aCBleHRlcm5hbCBkZXBlbmRlbmNpZXMnLAogICAgICAoKSBhc3luYyB7CiAgICAgICAgZmluYWwgZGlyZWN0b3J5ID0gRGlyZWN0b3J5LnN5c3RlbVRlbXAuY3JlYXRlVGVtcFN5bmMoKTsKICAgICAgICBGaWxlKHBhdGguam9pbihkaXJlY3RvcnkucGF0aCwgJ3B1YnNwZWMueWFtbCcpKS53cml0ZUFzU3RyaW5nU3luYygKICAgICAgICAgICcnJwpuYW1lOiBleGFtcGxlCnZlcnNpb246IDAuMS4wCmVudmlyb25tZW50OgogIHNkazogXjIuMTcuMApkZXBlbmRlbmNpZXM6CiAgbWFzb246IGFueQogIGZvbzoKICAgIHBhdGg6IC4uLy4uL2ZvbwpkZXZfZGVwZW5kZW5jaWVzOgogIHRlc3Q6IGFueQonJycsCiAgICAgICAgKTsKICAgICAgICBGaWxlKHBhdGguam9pbihkaXJlY3RvcnkucGF0aCwgJ3B1YnNwZWMubG9jaycpKS53cml0ZUFzU3RyaW5nU3luYygKICAgICAgICAgIGZvb1BhdGgsCiAgICAgICAgKTsKICAgICAgICBmaW5hbCBjb3B5Q2FsbHMgPSA8U3RyaW5nPltdOwoKICAgICAgICBhd2FpdCBjcmVhdGVFeHRlcm5hbFBhY2thZ2VzRm9sZGVyKAogICAgICAgICAgZGlyZWN0b3J5LAogICAgICAgICAgY29weVBhdGg6IChmcm9tLCB0bykgewogICAgICAgICAgICBjb3B5Q2FsbHMuYWRkKCckZnJvbSAtPiAkdG8nKTsKICAgICAgICAgICAgcmV0dXJuIEZ1dHVyZS52YWx1ZSgpOwogICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBmaW5hbCBmcm9tID0gcGF0aC5qb2luKGRpcmVjdG9yeS5wYXRoLCAnLi4vLi4vZm9vJyk7CiAgICAgICAgZmluYWwgdG8gPSBwYXRoLmpvaW4oCiAgICAgICAgICBkaXJlY3RvcnkucGF0aCwKICAgICAgICAgICdidWlsZCcsCiAgICAgICAgICAnLmRhcnRfZnJvZ19wYXRoX2RlcGVuZGVuY2llcycsCiAgICAgICAgICAnZm9vJywKICAgICAgICApOwogICAgICAgIGV4cGVjdChjb3B5Q2FsbHMsIFsnJGZyb20gLT4gJHRvJ10pOwogICAgICB9LAogICAgKTsKCiAgICB0ZXN0KAogICAgICAiZG9uJ3QgYnVuZGxlIGludGVybmFsIHBhdGggZGVwZW5kZW5jaWVzIiwKICAgICAgKCkgYXN5bmMgewogICAgICAgIGZpbmFsIGRpcmVjdG9yeSA9IERpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKCk7CiAgICAgICAgRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LnBhdGgsICdwdWJzcGVjLnlhbWwnKSkud3JpdGVBc1N0cmluZ1N5bmMoCiAgICAgICAgICAnJycKbmFtZTogZXhhbXBsZQp2ZXJzaW9uOiAwLjEuMAplbnZpcm9ubWVudDoKICBzZGs6IF4yLjE3LjAKZGVwZW5kZW5jaWVzOgogIG1hc29uOiBhbnkKICBmb286CiAgICBwYXRoOiAuLi8uLi9mb28KICBiYXI6CiAgICBwYXRoOiBwYWNrYWdlcy9iYXIKZGV2X2RlcGVuZGVuY2llczoKICB0ZXN0OiBhbnkKJycnLAogICAgICAgICk7CiAgICAgICAgRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LnBhdGgsICdwdWJzcGVjLmxvY2snKSkud3JpdGVBc1N0cmluZ1N5bmMoCiAgICAgICAgICBmb29QYXRoV2l0aEludGVybmFsRGVwZW5kZW5jeSwKICAgICAgICApOwogICAgICAgIGZpbmFsIGNvcHlDYWxscyA9IDxTdHJpbmc+W107CgogICAgICAgIEZpbGUoCiAgICAgICAgICBwYXRoLmpvaW4oCiAgICAgICAgICAgIGRpcmVjdG9yeS5wYXRoLAogICAgICAgICAgICAncGFja2FnZXMnLAogICAgICAgICAgICAnYmFyJywKICAgICAgICAgICAgJ3B1YnNwZWMueWFtbCcsCiAgICAgICAgICApLAogICAgICAgICkKICAgICAgICAgIC4uY3JlYXRlU3luYyhyZWN1cnNpdmU6IHRydWUpCiAgICAgICAgICAuLndyaXRlQXNTdHJpbmdTeW5jKAogICAgICAgICAgICAnJycKCm5hbWU6IGJhcgp2ZXJzaW9uOiAwLjEuMAplbnZpcm9ubWVudDoKICBzZGs6IF4yLjE3LjAKICAgICAgICAgICAgJycnLAogICAgICAgICAgKTsKCiAgICAgICAgYXdhaXQgY3JlYXRlRXh0ZXJuYWxQYWNrYWdlc0ZvbGRlcigKICAgICAgICAgIGRpcmVjdG9yeSwKICAgICAgICAgIGNvcHlQYXRoOiAoZnJvbSwgdG8pIHsKICAgICAgICAgICAgY29weUNhbGxzLmFkZCgnJGZyb20gLT4gJHRvJyk7CiAgICAgICAgICAgIHJldHVybiBGdXR1cmUudmFsdWUoKTsKICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgZmluYWwgZnJvbSA9IHBhdGguam9pbihkaXJlY3RvcnkucGF0aCwgJy4uLy4uL2ZvbycpOwogICAgICAgIGZpbmFsIHRvID0gcGF0aC5qb2luKAogICAgICAgICAgZGlyZWN0b3J5LnBhdGgsCiAgICAgICAgICAnYnVpbGQnLAogICAgICAgICAgJy5kYXJ0X2Zyb2dfcGF0aF9kZXBlbmRlbmNpZXMnLAogICAgICAgICAgJ2ZvbycsCiAgICAgICAgKTsKICAgICAgICBleHBlY3QoY29weUNhbGxzLCBbJyRmcm9tIC0+ICR0byddKTsKICAgICAgfSwKICAgICk7CiAgfSk7Cn0K", - "type": "text" - }, - { - "path": "test/src/dart_pub_get_test.dart", - "data": - "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOm1vY2t0YWlsL21vY2t0YWlsLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwoKaW1wb3J0ICcuLi8uLi9zcmMvZGFydF9wdWJfZ2V0LmRhcnQnOwoKY2xhc3MgX0Zha2VIb29rQ29udGV4dCBleHRlbmRzIEZha2UgaW1wbGVtZW50cyBIb29rQ29udGV4dCB7CiAgX0Zha2VIb29rQ29udGV4dCh7TG9nZ2VyPyBsb2dnZXJ9KSA6IF9sb2dnZXIgPSBsb2dnZXIgPz8gX01vY2tMb2dnZXIoKTsKCiAgZmluYWwgTG9nZ2VyIF9sb2dnZXI7CgogIHZhciBfdmFycyA9IDxTdHJpbmcsIGR5bmFtaWM+e307CgogIEBvdmVycmlkZQogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldCB2YXJzID0+IF92YXJzOwoKICBAb3ZlcnJpZGUKICBzZXQgdmFycyhNYXA8U3RyaW5nLCBkeW5hbWljPiB2YWx1ZSkgPT4gX3ZhcnMgPSB2YWx1ZTsKCiAgQG92ZXJyaWRlCiAgTG9nZ2VyIGdldCBsb2dnZXIgPT4gX2xvZ2dlcjsKfQoKY2xhc3MgX01vY2tMb2dnZXIgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgTG9nZ2VyIHt9CgpjbGFzcyBfTW9ja1Byb2dyZXNzIGV4dGVuZHMgTW9jayBpbXBsZW1lbnRzIFByb2dyZXNzIHt9Cgp2b2lkIG1haW4oKSB7CiAgZ3JvdXAoJ2RhcnRQdWJHZXQnLCAoKSB7CiAgICBsYXRlIEhvb2tDb250ZXh0IGNvbnRleHQ7CiAgICBsYXRlIExvZ2dlciBsb2dnZXI7CgogICAgY29uc3QgcHJvY2Vzc0lkID0gNDI7CiAgICBmaW5hbCBwcm9jZXNzUmVzdWx0ID0gUHJvY2Vzc1Jlc3VsdCgKICAgICAgcHJvY2Vzc0lkLAogICAgICBFeGl0Q29kZS5zdWNjZXNzLmNvZGUsCiAgICAgICcnLAogICAgICAnJywKICAgICk7CgogICAgc2V0VXAoKCkgewogICAgICBsb2dnZXIgPSBfTW9ja0xvZ2dlcigpOwogICAgICBjb250ZXh0ID0gX0Zha2VIb29rQ29udGV4dChsb2dnZXI6IGxvZ2dlcik7CgogICAgICB3aGVuKCgpID0+IGxvZ2dlci5wcm9ncmVzcyhhbnkoKSkpLnRoZW5SZXR1cm4oX01vY2tQcm9ncmVzcygpKTsKICAgIH0pOwoKICAgIHRlc3QoJ2NvbXBsZXRlcyB3aGVuIHByb2Nlc3Mgc3VjY2VlZHMnLCAoKSBhc3luYyB7CiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CgogICAgICBhd2FpdCBkYXJ0UHViR2V0KAogICAgICAgIGNvbnRleHQsCiAgICAgICAgd29ya2luZ0RpcmVjdG9yeTogJy4nLAogICAgICAgIHJ1blByb2Nlc3M6ICgKICAgICAgICAgIGV4ZWN1dGFibGUsCiAgICAgICAgICBhcmdzLCB7CiAgICAgICAgICBTdHJpbmc/IHdvcmtpbmdEaXJlY3RvcnksCiAgICAgICAgICBib29sPyBydW5JblNoZWxsLAogICAgICAgIH0pIGFzeW5jIHsKICAgICAgICAgIGV4cGVjdChleGVjdXRhYmxlLCBlcXVhbHMoJ2RhcnQnKSk7CiAgICAgICAgICBleHBlY3QoYXJncywgZXF1YWxzKFsncHViJywgJ2dldCddKSk7CiAgICAgICAgICBleHBlY3Qod29ya2luZ0RpcmVjdG9yeSwgZXF1YWxzKCcuJykpOwogICAgICAgICAgZXhwZWN0KHJ1bkluU2hlbGwsIGlzVHJ1ZSk7CiAgICAgICAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdDsKICAgICAgICB9LAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICk7CiAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGlzRW1wdHkpOwogICAgICB2ZXJpZnlOZXZlcigoKSA9PiBsb2dnZXIuZXJyKGFueSgpKSk7CiAgICB9KTsKCiAgICB0ZXN0KCdleGl0cyB3aGVuIHByb2Nlc3MgZmFpbHMnLCAoKSBhc3luYyB7CiAgICAgIGNvbnN0IGVycm9yID0gJ29vcHMgc29tZXRoaW5nIHdlbnQgd3JvbmcnOwogICAgICBmaW5hbCBleGl0Q2FsbHMgPSA8aW50PltdOwoKICAgICAgZmluYWwgcHJvY2Vzc1Jlc3VsdCA9IFByb2Nlc3NSZXN1bHQoCiAgICAgICAgcHJvY2Vzc0lkLAogICAgICAgIEV4aXRDb2RlLnNvZnR3YXJlLmNvZGUsCiAgICAgICAgJycsCiAgICAgICAgZXJyb3IsCiAgICAgICk7CgogICAgICBhd2FpdCBkYXJ0UHViR2V0KAogICAgICAgIGNvbnRleHQsCiAgICAgICAgd29ya2luZ0RpcmVjdG9yeTogJy4nLAogICAgICAgIHJ1blByb2Nlc3M6ICgKICAgICAgICAgIGV4ZWN1dGFibGUsCiAgICAgICAgICBhcmdzLCB7CiAgICAgICAgICBTdHJpbmc/IHdvcmtpbmdEaXJlY3RvcnksCiAgICAgICAgICBib29sPyBydW5JblNoZWxsLAogICAgICAgIH0pIGFzeW5jIHsKICAgICAgICAgIHJldHVybiBwcm9jZXNzUmVzdWx0OwogICAgICAgIH0sCiAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgZXF1YWxzKFtFeGl0Q29kZS5zb2Z0d2FyZS5jb2RlXSkpOwogICAgICB2ZXJpZnkoKCkgPT4gbG9nZ2VyLmVycihlcnJvcikpLmNhbGxlZCgxKTsKICAgIH0pOwoKICAgIHRlc3QoJ2V4aXRzIHdoZW4gUHJvY2Vzc0V4Y2VwdGlvbiBvY2N1cnMnLCAoKSBhc3luYyB7CiAgICAgIGNvbnN0IGVycm9yID0gJ29vcHMgc29tZXRoaW5nIHdlbnQgd3JvbmcnOwogICAgICBmaW5hbCBleGl0Q2FsbHMgPSA8aW50PltdOwogICAgICBhd2FpdCBkYXJ0UHViR2V0KAogICAgICAgIGNvbnRleHQsCiAgICAgICAgd29ya2luZ0RpcmVjdG9yeTogJy4nLAogICAgICAgIHJ1blByb2Nlc3M6ICgKICAgICAgICAgIGV4ZWN1dGFibGUsCiAgICAgICAgICBhcmdzLCB7CiAgICAgICAgICBTdHJpbmc/IHdvcmtpbmdEaXJlY3RvcnksCiAgICAgICAgICBib29sPyBydW5JblNoZWxsLAogICAgICAgIH0pIGFzeW5jIHsKICAgICAgICAgIHRocm93IFByb2Nlc3NFeGNlcHRpb24oCiAgICAgICAgICAgICdkYXJ0JywKICAgICAgICAgICAgWydwdWInLCAnZ2V0J10sCiAgICAgICAgICAgIGVycm9yLAogICAgICAgICAgICBFeGl0Q29kZS5zb2Z0d2FyZS5jb2RlLAogICAgICAgICAgKTsKICAgICAgICB9LAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICk7CiAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGVxdWFscyhbRXhpdENvZGUuc29mdHdhcmUuY29kZV0pKTsKICAgICAgdmVyaWZ5KCgpID0+IGxvZ2dlci5lcnIoZXJyb3IpKS5jYWxsZWQoMSk7CiAgICB9KTsKICB9KTsKfQo=", - "type": "text" - }, - { - "path": "test/src/exit_overrides_test.dart", - "data": - "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CgppbXBvcnQgJy4uLy4uL3NyYy9leGl0X292ZXJyaWRlcy5kYXJ0JzsKCnZvaWQgbWFpbigpIHsKICBncm91cCgnRXhpdE92ZXJyaWRlcycsICgpIHsKICAgIGdyb3VwKCdydW5ab25lZCcsICgpIHsKICAgICAgdGVzdCgndXNlcyBkZWZhdWx0IGV4aXQgd2hlbiBub3Qgc3BlY2lmaWVkJywgKCkgewogICAgICAgIEV4aXRPdmVycmlkZXMucnVuWm9uZWQoKCkgewogICAgICAgICAgZmluYWwgb3ZlcnJpZGVzID0gRXhpdE92ZXJyaWRlcy5jdXJyZW50OwogICAgICAgICAgZXhwZWN0KG92ZXJyaWRlcyEuZXhpdCwgZXF1YWxzKGV4aXQpKTsKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICB0ZXN0KCd1c2VzIGN1c3RvbSBleGl0IHdoZW4gc3BlY2lmaWVkJywgKCkgewogICAgICAgIEV4aXRPdmVycmlkZXMucnVuWm9uZWQoCiAgICAgICAgICAoKSB7CiAgICAgICAgICAgIGZpbmFsIG92ZXJyaWRlcyA9IEV4aXRPdmVycmlkZXMuY3VycmVudDsKICAgICAgICAgICAgZXhwZWN0KG92ZXJyaWRlcyEuZXhpdCwgaXNOb3QoZXF1YWxzKGV4aXQpKSk7CiAgICAgICAgICB9LAogICAgICAgICAgZXhpdDogKF8pIHt9LAogICAgICAgICk7CiAgICAgIH0pOwogICAgfSk7CiAgfSk7Cn0K", - "type": "text" - }, - { - "path": "test/src/get_internal_path_dependencies_test.dart", - "data": - "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKCmltcG9ydCAnLi4vLi4vc3JjL2dldF9pbnRlcm5hbF9wYXRoX2RlcGVuZGVuY2llcy5kYXJ0JzsKCnZvaWQgbWFpbigpIHsKICBncm91cCgnZ2V0UGF0aERlcGVuZGVuY2llcycsICgpIHsKICAgIHRlc3QoJ3JldHVybnMgbm90aGluZyB3aGVuIHRoZXJlIGFyZSBubyBwYXRoIGRlcGVuZGVuY2llcycsICgpIHsKICAgICAgZmluYWwgZGlyZWN0b3J5ID0gRGlyZWN0b3J5LnN5c3RlbVRlbXAuY3JlYXRlVGVtcFN5bmMoKTsKICAgICAgRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LnBhdGgsICdwdWJzcGVjLmxvY2snKSkud3JpdGVBc1N0cmluZ1N5bmMoCiAgICAgICAgJycnCnBhY2thZ2VzOgogIHRlc3Q6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogYW5hbHl6ZXIKICAgICAgc2hhMjU2OiBmODU1NjZlYzdiM2QyNWNiZWE2MGY3ZGQ0ZjE1N2M1MDI1ZjJmMTkyMzNjYTRmZWVlZDMzYjYxNmM3OGEyNmEzCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiNi4xLjAiCiAgbWFzb246CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogYW5hbHl6ZXIKICAgICAgc2hhMjU2OiBmODU1NjZlYzdiM2QyNWNiZWE2MGY3ZGQ0ZjE1N2M1MDI1ZjJmMTkyMzNjYTRmZWVlZDMzYjYxNmM3OGEyNmEzCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiNi4xLjAiCicnJywKICAgICAgKTsKICAgICAgZXhwZWN0KGdldEludGVybmFsUGF0aERlcGVuZGVuY2llcyhkaXJlY3RvcnkpLCBjb21wbGV0aW9uKGlzRW1wdHkpKTsKICAgICAgZGlyZWN0b3J5LmRlbGV0ZShyZWN1cnNpdmU6IHRydWUpLmlnbm9yZSgpOwogICAgfSk7CgogICAgdGVzdCgncmV0dXJucyBjb3JyZWN0IHBhdGggZGVwZW5kZW5jaWVzJywgKCkgewogICAgICBmaW5hbCBkaXJlY3RvcnkgPSBEaXJlY3Rvcnkuc3lzdGVtVGVtcC5jcmVhdGVUZW1wU3luYygpOwogICAgICBGaWxlKHBhdGguam9pbihkaXJlY3RvcnkucGF0aCwgJ3B1YnNwZWMubG9jaycpKS53cml0ZUFzU3RyaW5nU3luYygKICAgICAgICAnJycKcGFja2FnZXM6CiAgZGFydF9mcm9nOgogICAgZGVwZW5kZW5jeTogImRpcmVjdCBtYWluIgogICAgZGVzY3JpcHRpb246CiAgICAgIHBhdGg6ICJwYXRoL3RvL2RhcnRfZnJvZyIKICAgICAgcmVsYXRpdmU6IHRydWUKICAgIHNvdXJjZTogcGF0aAogICAgdmVyc2lvbjogIjAuMC4wIgogIGRhcnRfZnJvZ19nZW46CiAgICBkZXBlbmRlbmN5OiAiZGlyZWN0IG1haW4iCiAgICBkZXNjcmlwdGlvbjoKICAgICAgcGF0aDogInBhdGgvdG8vZGFydF9mcm9nX2dlbiIKICAgICAgcmVsYXRpdmU6IHRydWUKICAgIHNvdXJjZTogcGF0aAogICAgdmVyc2lvbjogIjAuMC4wIgonJycsCiAgICAgICk7CiAgICAgIGV4cGVjdCgKICAgICAgICBnZXRJbnRlcm5hbFBhdGhEZXBlbmRlbmNpZXMoZGlyZWN0b3J5KSwKICAgICAgICBjb21wbGV0aW9uKAogICAgICAgICAgZXF1YWxzKFsncGF0aC90by9kYXJ0X2Zyb2cnLCAncGF0aC90by9kYXJ0X2Zyb2dfZ2VuJ10pLAogICAgICAgICksCiAgICAgICk7CiAgICAgIGRpcmVjdG9yeS5kZWxldGUocmVjdXJzaXZlOiB0cnVlKS5pZ25vcmUoKTsKICAgIH0pOwogIH0pOwp9Cg==", - "type": "text" - } - ], - "name": "dart_frog_prod_server", - "description": "A dart_frog prod server", - "version": "0.1.0+1", - "environment": {"mason": ">=0.1.0-dev <0.1.0"}, - "readme": { - "path": "README.md", - "data": - "IyBkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXIKClshW1Bvd2VyZWQgYnkgTWFzb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZW5kcG9pbnQ/dXJsPWh0dHBzJTNBJTJGJTJGdGlueXVybC5jb20lMkZtYXNvbi1iYWRnZSldKGh0dHBzOi8vZ2l0aHViLmNvbS9mZWxhbmdlbC9tYXNvbikKCkEgYGRhcnRfZnJvZ2AgcHJvZHVjdGlvbiBzZXJ2ZXIuCgpfR2VuZXJhdGVkIGJ5IFttYXNvbl1bMV0g8J+nsV8KClsxXTogaHR0cHM6Ly9naXRodWIuY29tL2ZlbGFuZ2VsL21hc29uCg==", - "type": "text" - }, - "changelog": { - "path": "CHANGELOG.md", - "data": - "IyAwLjEuMCsxCgotIGZlYXQ6IGJhc2ljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZGFydCBmcm9nIHByb2R1Y3Rpb24gc2VydmVyCg==", - "type": "text" - }, - "license": { - "path": "LICENSE", - "data": - "TUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgMjAyMiBWZXJ5IEdvb2QgVmVudHVyZXMKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCg==", - "type": "text" - }, - "vars": { - "dartVersion": { - "type": "string", - "description": "Dart version to be used in the generated Dockerfile.", - "default": "stable", - "prompt": "Dart version?" - } - } -}); diff --git a/packages/dart_frog_cli/lib/src/commands/commands.dart b/packages/dart_frog_cli/lib/src/commands/commands.dart index db0875a58..439836dbc 100644 --- a/packages/dart_frog_cli/lib/src/commands/commands.dart +++ b/packages/dart_frog_cli/lib/src/commands/commands.dart @@ -1,5 +1,3 @@ -import 'package:mason/mason.dart'; - export 'build/build.dart'; export 'create/create.dart'; export 'daemon/daemon.dart'; @@ -7,6 +5,3 @@ export 'dev/dev.dart'; export 'list/list.dart'; export 'new/new.dart'; export 'uninstall/uninstall.dart'; - -/// A method which returns a [Future] given a [MasonBundle]. -typedef GeneratorBuilder = Future Function(MasonBundle); diff --git a/packages/dart_frog_cli/lib/src/commands/create/create.dart b/packages/dart_frog_cli/lib/src/commands/create/create.dart index d8ea9497b..09ddb2027 100644 --- a/packages/dart_frog_cli/lib/src/commands/create/create.dart +++ b/packages/dart_frog_cli/lib/src/commands/create/create.dart @@ -2,8 +2,9 @@ import 'dart:io'; import 'package:args/command_runner.dart'; import 'package:dart_frog_cli/src/command.dart'; -import 'package:dart_frog_cli/src/commands/commands.dart'; import 'package:dart_frog_cli/src/commands/create/templates/create_dart_frog_bundle.dart'; +import 'package:dart_frog_gen/dart_frog_gen.dart'; +// ignore: depend_on_referenced_packages import 'package:mason/mason.dart'; import 'package:path/path.dart' as path; diff --git a/packages/dart_frog_cli/lib/src/commands/dev/dev.dart b/packages/dart_frog_cli/lib/src/commands/dev/dev.dart index 884fcb4ad..5298fca4f 100644 --- a/packages/dart_frog_cli/lib/src/commands/dev/dev.dart +++ b/packages/dart_frog_cli/lib/src/commands/dev/dev.dart @@ -2,11 +2,7 @@ import 'dart:async'; import 'dart:io' as io; import 'package:dart_frog_cli/src/command.dart'; -import 'package:dart_frog_cli/src/commands/commands.dart'; -import 'package:dart_frog_cli/src/commands/dev/templates/dart_frog_dev_server_bundle.dart'; -import 'package:dart_frog_cli/src/dev_server_runner/dev_server_runner.dart'; -import 'package:dart_frog_cli/src/runtime_compatibility.dart' - as runtime_compatibility; +import 'package:dart_frog_gen/dart_frog_gen.dart'; import 'package:mason/mason.dart'; /// {@template dev_command} @@ -16,13 +12,10 @@ class DevCommand extends DartFrogCommand { /// {@macro dev_command} DevCommand({ super.logger, - GeneratorBuilder? generator, DevServerRunnerBuilder? devServerRunnerBuilder, - runtime_compatibility.RuntimeCompatibilityCallback? - ensureRuntimeCompatibility, - }) : _ensureRuntimeCompatibility = ensureRuntimeCompatibility ?? - runtime_compatibility.ensureRuntimeCompatibility, - _generator = generator ?? MasonGenerator.fromBundle, + RuntimeCompatibilityCallback? runtimeCompatibility, + }) : _ensureRuntimeCompatibility = + runtimeCompatibility ?? ensureRuntimeCompatibility, _devServerRunnerBuilder = devServerRunnerBuilder ?? DevServerRunner.new { argParser @@ -42,10 +35,8 @@ class DevCommand extends DartFrogCommand { static const _defaultDartVmServicePort = '8181'; - final GeneratorBuilder _generator; final DevServerRunnerBuilder _devServerRunnerBuilder; - final runtime_compatibility.RuntimeCompatibilityCallback - _ensureRuntimeCompatibility; + final RuntimeCompatibilityCallback _ensureRuntimeCompatibility; @override final String description = 'Run a local development server.'; @@ -108,10 +99,8 @@ class DevCommand extends DartFrogCommand { final port = io.Platform.environment['PORT'] ?? results['port'] as String; final dartVmServicePort = (results['dart-vm-service-port'] as String?) ?? _defaultDartVmServicePort; - final generator = await _generator(dartFrogDevServerBundle); _devServerRunner = _devServerRunnerBuilder( - devServerBundleGenerator: generator, logger: logger, workingDirectory: cwd, port: port, diff --git a/packages/dart_frog_cli/lib/src/commands/dev/templates/dart_frog_dev_server_bundle.dart b/packages/dart_frog_cli/lib/src/commands/dev/templates/dart_frog_dev_server_bundle.dart deleted file mode 100644 index 147e882b8..000000000 --- a/packages/dart_frog_cli/lib/src/commands/dev/templates/dart_frog_dev_server_bundle.dart +++ /dev/null @@ -1,70 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint, implicit_dynamic_list_literal, implicit_dynamic_map_literal, inference_failure_on_collection_literal - -import 'package:mason/mason.dart'; - -final dartFrogDevServerBundle = MasonBundle.fromJson({ - "files": [ - { - "path": "server.dart", - "data": - "Ly8gR0VORVJBVEVEIENPREUgLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKLy8gaWdub3JlX2Zvcl9maWxlOiB0eXBlPWxpbnQsIGltcGxpY2l0X2R5bmFtaWNfbGlzdF9saXRlcmFsCgppbXBvcnQgJ2RhcnQ6aW8nOwoKaW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZy9kYXJ0X2Zyb2cuZGFydCc7Cgp7eyNpbnZva2VDdXN0b21FbnRyeXBvaW50fX1pbXBvcnQgJy4uL21haW4uZGFydCcgYXMgZW50cnlwb2ludDt7ey9pbnZva2VDdXN0b21FbnRyeXBvaW50fX0Ke3sjcm91dGVzfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Owp7ey9yb3V0ZXN9fQp7eyNtaWRkbGV3YXJlfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Owp7ey9taWRkbGV3YXJlfX0Kdm9pZCBtYWluKCkgYXN5bmMgewogIGZpbmFsIGFkZHJlc3MgPSBJbnRlcm5ldEFkZHJlc3MuYW55SVB2NjsKICBmaW5hbCBwb3J0ID0gaW50LnRyeVBhcnNlKFBsYXRmb3JtLmVudmlyb25tZW50WydQT1JUJ10gPz8gJ3t7e3BvcnR9fX0nKSA/PyB7e3twb3J0fX19O3t7I2ludm9rZUN1c3RvbUluaXR9fQogIGF3YWl0IGVudHJ5cG9pbnQuaW5pdChhZGRyZXNzLCBwb3J0KTt7ey9pbnZva2VDdXN0b21Jbml0fX0KICBob3RSZWxvYWQoKCkgPT4gY3JlYXRlU2VydmVyKGFkZHJlc3MsIHBvcnQpKTsKfQoKRnV0dXJlPEh0dHBTZXJ2ZXI+IGNyZWF0ZVNlcnZlcihJbnRlcm5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnQpIHsKICBmaW5hbCBoYW5kbGVyID0gQ2FzY2FkZSgpe3sjc2VydmVTdGF0aWNGaWxlc319LmFkZChjcmVhdGVTdGF0aWNGaWxlSGFuZGxlcigpKXt7L3NlcnZlU3RhdGljRmlsZXN9fS5hZGQoYnVpbGRSb290SGFuZGxlcigpKS5oYW5kbGVyOwogIHt7I2ludm9rZUN1c3RvbUVudHJ5cG9pbnR9fXJldHVybiBlbnRyeXBvaW50LnJ1bihoYW5kbGVyLCBhZGRyZXNzLCBwb3J0KTt7ey9pbnZva2VDdXN0b21FbnRyeXBvaW50fX17e15pbnZva2VDdXN0b21FbnRyeXBvaW50fX1yZXR1cm4gc2VydmUoaGFuZGxlciwgYWRkcmVzcywgcG9ydCk7e3svaW52b2tlQ3VzdG9tRW50cnlwb2ludH19Cn0KCkhhbmRsZXIgYnVpbGRSb290SGFuZGxlcigpIHsKICBmaW5hbCBwaXBlbGluZSA9IGNvbnN0IFBpcGVsaW5lKCl7eyNnbG9iYWxNaWRkbGV3YXJlfX0uYWRkTWlkZGxld2FyZSh7eyNzbmFrZUNhc2V9fXt7e25hbWV9fX17ey9zbmFrZUNhc2V9fS5taWRkbGV3YXJlKXt7L2dsb2JhbE1pZGRsZXdhcmV9fTsKICBmaW5hbCByb3V0ZXIgPSBSb3V0ZXIoKXt7I2RpcmVjdG9yaWVzfX0KICAgIC4ubW91bnQoJ3t7e3JvdXRlfX19JywgKGNvbnRleHR7eyNkaXJlY3RvcnlfcGFyYW1zLjB9fSx7eyNkaXJlY3RvcnlfcGFyYW1zfX17ey59fSx7ey9kaXJlY3RvcnlfcGFyYW1zfX17ey9kaXJlY3RvcnlfcGFyYW1zLjB9fSkgPT4gYnVpbGR7eyNwYXNjYWxDYXNlfX17e3tuYW1lfX19e3svcGFzY2FsQ2FzZX19SGFuZGxlcih7eyNkaXJlY3RvcnlfcGFyYW1zfX17ey59fSx7ey9kaXJlY3RvcnlfcGFyYW1zfX0pKGNvbnRleHQpKXt7L2RpcmVjdG9yaWVzfX07CiAgcmV0dXJuIHBpcGVsaW5lLmFkZEhhbmRsZXIocm91dGVyKTsKfQp7eyNkaXJlY3Rvcmllc319CkhhbmRsZXIgYnVpbGR7eyNwYXNjYWxDYXNlfX17e3tuYW1lfX19e3svcGFzY2FsQ2FzZX19SGFuZGxlcih7eyNkaXJlY3RvcnlfcGFyYW1zfX1TdHJpbmcge3sufX0se3svZGlyZWN0b3J5X3BhcmFtc319KSB7CiAgZmluYWwgcGlwZWxpbmUgPSBjb25zdCBQaXBlbGluZSgpe3sjbWlkZGxld2FyZS4wfX17eyNtaWRkbGV3YXJlfX0uYWRkTWlkZGxld2FyZSh7eyNzbmFrZUNhc2V9fXt7e25hbWV9fX17ey9zbmFrZUNhc2V9fS5taWRkbGV3YXJlKXt7L21pZGRsZXdhcmV9fXt7L21pZGRsZXdhcmUuMH19OwogIGZpbmFsIHJvdXRlciA9IFJvdXRlcigpCiAgICB7eyNmaWxlc319e3sjd2lsZGNhcmR9fS4ubW91bnQoJ3t7e3JvdXRlfX19JywgKGNvbnRleHQpID0+IHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Lm9uUmVxdWVzdChjb250ZXh0LGNvbnRleHQucmVxdWVzdC51cmwucGF0aCkpe3svd2lsZGNhcmR9fXt7XndpbGRjYXJkfX0uLmFsbCgne3t7cm91dGV9fX0nLCAoY29udGV4dHt7I2ZpbGVfcGFyYW1zLjB9fSx7eyNmaWxlX3BhcmFtc319e3sufX0se3svZmlsZV9wYXJhbXN9fXt7L2ZpbGVfcGFyYW1zLjB9fSkgPT4ge3sjc25ha2VDYXNlfX17e3tuYW1lfX19e3svc25ha2VDYXNlfX0ub25SZXF1ZXN0KGNvbnRleHQse3sjZGlyZWN0b3J5X3BhcmFtc319e3sufX0se3svZGlyZWN0b3J5X3BhcmFtc319e3sjZmlsZV9wYXJhbXN9fXt7Ln19LHt7L2ZpbGVfcGFyYW1zfX0pKXt7L3dpbGRjYXJkfX17ey9maWxlc319OwogIHJldHVybiBwaXBlbGluZS5hZGRIYW5kbGVyKHJvdXRlcik7Cn0Ke3svZGlyZWN0b3JpZXN9fQo=", - "type": "text" - } - ], - "hooks": [ - { - "path": "pre_gen.dart", - "data": - "aW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfZ2VuL2RhcnRfZnJvZ19nZW4uZGFydCc7CmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JwogICAgc2hvdyBIb29rQ29udGV4dCwgZGVmYXVsdEZvcmVncm91bmQsIGxpZ2h0Q3lhbjsKCmltcG9ydCAnc3JjL2V4aXRfb3ZlcnJpZGVzLmRhcnQnOwoKdHlwZWRlZiBSb3V0ZUNvbmZpZ3VyYXRpb25CdWlsZGVyID0gUm91dGVDb25maWd1cmF0aW9uIEZ1bmN0aW9uKAogIGlvLkRpcmVjdG9yeSBkaXJlY3RvcnksCik7Cgp2b2lkIF9kZWZhdWx0RXhpdChpbnQgY29kZSkgPT4gRXhpdE92ZXJyaWRlcy5jdXJyZW50Py5leGl0ID8/IGlvLmV4aXQ7CgpGdXR1cmU8dm9pZD4gcnVuKEhvb2tDb250ZXh0IGNvbnRleHQpIGFzeW5jID0+IHByZUdlbihjb250ZXh0KTsKCkZ1dHVyZTx2b2lkPiBwcmVHZW4oCiAgSG9va0NvbnRleHQgY29udGV4dCwgewogIFJvdXRlQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRDb25maWd1cmF0aW9uID0gYnVpbGRSb3V0ZUNvbmZpZ3VyYXRpb24sCiAgdm9pZCBGdW5jdGlvbihpbnQgZXhpdENvZGUpIGV4aXQgPSBfZGVmYXVsdEV4aXQsCn0pIGFzeW5jIHsKICBmaW5hbCBSb3V0ZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKICB0cnkgewogICAgY29uZmlndXJhdGlvbiA9IGJ1aWxkQ29uZmlndXJhdGlvbihpby5EaXJlY3RvcnkuY3VycmVudCk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGNvbnRleHQubG9nZ2VyLmVycignJGVycm9yJyk7CiAgICByZXR1cm4gZXhpdCgxKTsKICB9CgogIHJlcG9ydFJvdXRlQ29uZmxpY3RzKAogICAgY29uZmlndXJhdGlvbiwKICAgIG9uVmlvbGF0aW9uU3RhcnQ6ICgpIHsKICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygnJyk7CiAgICB9LAogICAgb25Sb3V0ZUNvbmZsaWN0OiAoCiAgICAgIG9yaWdpbmFsRmlsZVBhdGgsCiAgICAgIGNvbmZsaWN0aW5nRmlsZVBhdGgsCiAgICAgIGNvbmZsaWN0aW5nRW5kcG9pbnQsCiAgICApIHsKICAgICAgY29udGV4dC5sb2dnZXIuZXJyKAogICAgICAgICcnJ1JvdXRlIGNvbmZsaWN0IGRldGVjdGVkLiAke2xpZ2h0Q3lhbi53cmFwKG9yaWdpbmFsRmlsZVBhdGgpfSBhbmQgJHtsaWdodEN5YW4ud3JhcChjb25mbGljdGluZ0ZpbGVQYXRoKX0gYm90aCByZXNvbHZlIHRvICR7bGlnaHRDeWFuLndyYXAoY29uZmxpY3RpbmdFbmRwb2ludCl9LicnJywKICAgICAgKTsKICAgIH0sCiAgKTsKICByZXBvcnRSb2d1ZVJvdXRlcygKICAgIGNvbmZpZ3VyYXRpb24sCiAgICBvblZpb2xhdGlvblN0YXJ0OiAoKSB7CiAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oJycpOwogICAgfSwKICAgIG9uUm9ndWVSb3V0ZTogKGZpbGVQYXRoLCBpZGVhbFBhdGgpIHsKICAgICAgY29udGV4dC5sb2dnZXIuZXJyKAogICAgICAgICcnJ1JvZ3VlIHJvdXRlIGRldGVjdGVkLiR7ZGVmYXVsdEZvcmVncm91bmQud3JhcCgnICcpfVJlbmFtZSAke2xpZ2h0Q3lhbi53cmFwKGZpbGVQYXRoKX0gdG8gJHtsaWdodEN5YW4ud3JhcChpZGVhbFBhdGgpfS4nJycsCiAgICAgICk7CiAgICB9LAogICk7CgogIGNvbnRleHQudmFycyA9IHsKICAgICdwb3J0JzogY29udGV4dC52YXJzWydwb3J0J10gPz8gJzgwODAnLAogICAgJ2RpcmVjdG9yaWVzJzogY29uZmlndXJhdGlvbi5kaXJlY3RvcmllcwogICAgICAgIC5tYXAoKGMpID0+IGMudG9Kc29uKCkpCiAgICAgICAgLnRvTGlzdCgpCiAgICAgICAgLnJldmVyc2VkCiAgICAgICAgLnRvTGlzdCgpLAogICAgJ3JvdXRlcyc6IGNvbmZpZ3VyYXRpb24ucm91dGVzLm1hcCgocikgPT4gci50b0pzb24oKSkudG9MaXN0KCksCiAgICAnbWlkZGxld2FyZSc6IGNvbmZpZ3VyYXRpb24ubWlkZGxld2FyZS5tYXAoKG0pID0+IG0udG9Kc29uKCkpLnRvTGlzdCgpLAogICAgJ2dsb2JhbE1pZGRsZXdhcmUnOiBjb25maWd1cmF0aW9uLmdsb2JhbE1pZGRsZXdhcmUgIT0gbnVsbAogICAgICAgID8gY29uZmlndXJhdGlvbi5nbG9iYWxNaWRkbGV3YXJlIS50b0pzb24oKQogICAgICAgIDogZmFsc2UsCiAgICAnc2VydmVTdGF0aWNGaWxlcyc6IGNvbmZpZ3VyYXRpb24uc2VydmVTdGF0aWNGaWxlcywKICAgICdpbnZva2VDdXN0b21FbnRyeXBvaW50JzogY29uZmlndXJhdGlvbi5pbnZva2VDdXN0b21FbnRyeXBvaW50LAogICAgJ2ludm9rZUN1c3RvbUluaXQnOiBjb25maWd1cmF0aW9uLmludm9rZUN1c3RvbUluaXQsCiAgfTsKfQo=", - "type": "text" - }, - { - "path": "pubspec.yaml", - "data": - "bmFtZTogZGFydF9mcm9nX2Rldl9zZXJ2ZXJfaG9va3MKcHVibGlzaF90bzogbm9uZQoKZW52aXJvbm1lbnQ6CiAgc2RrOiAiPj0zLjAuMCA8NC4wLjAiCgpkZXBlbmRlbmNpZXM6CiAgZGFydF9mcm9nX2dlbjogXjIuMC4wCiAgbWFzb246IF4wLjEuMC1kZXYuMzkKICBwdWJzcGVjX3BhcnNlOiBeMS4yLjAKCmRldl9kZXBlbmRlbmNpZXM6CiAgbW9ja3RhaWw6IF4xLjAuMAogIHBhdGg6IF4xLjguMgogIHRlc3Q6IF4xLjE5LjIKICB2ZXJ5X2dvb2RfYW5hbHlzaXM6IF41LjEuMAo=", - "type": "text" - }, - { - "path": "src/exit_overrides.dart", - "data": - "aW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmNvbnN0IF9hc3luY1J1blpvbmVkID0gcnVuWm9uZWQ7CgphYnN0cmFjdCBjbGFzcyBFeGl0T3ZlcnJpZGVzIHsKICBzdGF0aWMgZmluYWwgX3Rva2VuID0gT2JqZWN0KCk7CgogIHN0YXRpYyBFeGl0T3ZlcnJpZGVzPyBnZXQgY3VycmVudCB7CiAgICByZXR1cm4gWm9uZS5jdXJyZW50W190b2tlbl0gYXMgRXhpdE92ZXJyaWRlcz87CiAgfQoKICBzdGF0aWMgUiBydW5ab25lZDxSPihSIEZ1bmN0aW9uKCkgYm9keSwge3ZvaWQgRnVuY3Rpb24oaW50KT8gZXhpdH0pIHsKICAgIGZpbmFsIG92ZXJyaWRlcyA9IF9FeGl0T3ZlcnJpZGVzU2NvcGUoZXhpdCk7CiAgICByZXR1cm4gX2FzeW5jUnVuWm9uZWQoYm9keSwgem9uZVZhbHVlczoge190b2tlbjogb3ZlcnJpZGVzfSk7CiAgfQoKICB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSkgZ2V0IGV4aXQgPT4gaW8uZXhpdDsKfQoKY2xhc3MgX0V4aXRPdmVycmlkZXNTY29wZSBleHRlbmRzIEV4aXRPdmVycmlkZXMgewogIF9FeGl0T3ZlcnJpZGVzU2NvcGUodGhpcy5fZXhpdCk7CgogIGZpbmFsIEV4aXRPdmVycmlkZXM/IF9wcmV2aW91cyA9IEV4aXRPdmVycmlkZXMuY3VycmVudDsKICBmaW5hbCB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSk/IF9leGl0OwoKICBAb3ZlcnJpZGUKICB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSkgZ2V0IGV4aXQgewogICAgcmV0dXJuIF9leGl0ID8/IF9wcmV2aW91cz8uZXhpdCA/PyBzdXBlci5leGl0OwogIH0KfQo=", - "type": "text" - }, - { - "path": "test/pre_gen_test.dart", - "data": - "aW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZ19nZW4vZGFydF9mcm9nX2dlbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOm1hc29uL21hc29uLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6bW9ja3RhaWwvbW9ja3RhaWwuZGFydCc7CmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CgppbXBvcnQgJy4uL3ByZV9nZW4uZGFydCc7CmltcG9ydCAnLi4vc3JjL2V4aXRfb3ZlcnJpZGVzLmRhcnQnOwoKY2xhc3MgX0Zha2VIb29rQ29udGV4dCBleHRlbmRzIEZha2UgaW1wbGVtZW50cyBIb29rQ29udGV4dCB7CiAgX0Zha2VIb29rQ29udGV4dCh7TG9nZ2VyPyBsb2dnZXJ9KSA6IF9sb2dnZXIgPSBsb2dnZXIgPz8gX01vY2tMb2dnZXIoKTsKCiAgZmluYWwgTG9nZ2VyIF9sb2dnZXI7CgogIHZhciBfdmFycyA9IDxTdHJpbmcsIGR5bmFtaWM+e307CgogIEBvdmVycmlkZQogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldCB2YXJzID0+IF92YXJzOwoKICBAb3ZlcnJpZGUKICBzZXQgdmFycyhNYXA8U3RyaW5nLCBkeW5hbWljPiB2YWx1ZSkgPT4gX3ZhcnMgPSB2YWx1ZTsKCiAgQG92ZXJyaWRlCiAgTG9nZ2VyIGdldCBsb2dnZXIgPT4gX2xvZ2dlcjsKfQoKY2xhc3MgX01vY2tMb2dnZXIgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgTG9nZ2VyIHt9Cgp2b2lkIG1haW4oKSB7CiAgZ3JvdXAoJ3ByZUdlbicsICgpIHsKICAgIGxhdGUgSG9va0NvbnRleHQgY29udGV4dDsKICAgIGxhdGUgTG9nZ2VyIGxvZ2dlcjsKCiAgICBzZXRVcCgoKSB7CiAgICAgIGxvZ2dlciA9IF9Nb2NrTG9nZ2VyKCk7CiAgICAgIGNvbnRleHQgPSBfRmFrZUhvb2tDb250ZXh0KGxvZ2dlcjogbG9nZ2VyKTsKICAgIH0pOwoKICAgIHRlc3QoJ3J1biBjb21wbGV0ZXMnLCAoKSB7CiAgICAgIGV4cGVjdCgKICAgICAgICBFeGl0T3ZlcnJpZGVzLnJ1blpvbmVkKAogICAgICAgICAgKCkgPT4gcnVuKF9GYWtlSG9va0NvbnRleHQoKSksCiAgICAgICAgICBleGl0OiAoXykge30sCiAgICAgICAgKSwKICAgICAgICBjb21wbGV0ZXMsCiAgICAgICk7CiAgICB9KTsKCiAgICB0ZXN0KCdleGl0KDEpIGlmIGJ1aWxkUm91dGVDb25maWd1cmF0aW9uIHRocm93cycsICgpIGFzeW5jIHsKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgZmluYWwgZXhjZXB0aW9uID0gRXhjZXB0aW9uKCdvb3BzJyk7CiAgICAgIGF3YWl0IHByZUdlbigKICAgICAgICBjb250ZXh0LAogICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IHRocm93IGV4Y2VwdGlvbiwKICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICApOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBlcXVhbHMoWzFdKSk7CiAgICAgIHZlcmlmeSgoKSA9PiBsb2dnZXIuZXJyKGV4Y2VwdGlvbi50b1N0cmluZygpKSkuY2FsbGVkKDEpOwogICAgfSk7CgogICAgdGVzdCgnY29tcGxhaW5zIGFib3V0IHJvdXRlIGNvbmZsaWN0cycsICgpIGFzeW5jIHsKICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9IFJvdXRlQ29uZmlndXJhdGlvbigKICAgICAgICBtaWRkbGV3YXJlOiBbXSwKICAgICAgICBkaXJlY3RvcmllczogW10sCiAgICAgICAgcm91dGVzOiBbXSwKICAgICAgICByb2d1ZVJvdXRlczogW10sCiAgICAgICAgZW5kcG9pbnRzOiB7CiAgICAgICAgICAnLyc6IFsKICAgICAgICAgICAgUm91dGVGaWxlKAogICAgICAgICAgICAgIG5hbWU6ICdpbmRleCcsCiAgICAgICAgICAgICAgcGF0aDogJ2luZGV4LmRhcnQnLAogICAgICAgICAgICAgIHJvdXRlOiAnLycsCiAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICksCiAgICAgICAgICBdLAogICAgICAgICAgJy9oZWxsbyc6IFsKICAgICAgICAgICAgUm91dGVGaWxlKAogICAgICAgICAgICAgIG5hbWU6ICdoZWxsbycsCiAgICAgICAgICAgICAgcGF0aDogJ2hlbGxvLmRhcnQnLAogICAgICAgICAgICAgIHJvdXRlOiAnL2hlbGxvJywKICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgUm91dGVGaWxlKAogICAgICAgICAgICAgIG5hbWU6ICdoZWxsb19pbmRleCcsCiAgICAgICAgICAgICAgcGF0aDogJ2hlbGxvL2luZGV4LmRhcnQnLAogICAgICAgICAgICAgIHJvdXRlOiAnLycsCiAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICksCiAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICk7CgogICAgICBmaW5hbCBleGl0Q2FsbHMgPSA8aW50PltdOwogICAgICBhd2FpdCBwcmVHZW4oCiAgICAgICAgY29udGV4dCwKICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiBjb25maWd1cmF0aW9uLAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICk7CgogICAgICB2ZXJpZnkoCiAgICAgICAgKCkgPT4gbG9nZ2VyLmVycigKICAgICAgICAgICcnJ1JvdXRlIGNvbmZsaWN0IGRldGVjdGVkLiAke2xpZ2h0Q3lhbi53cmFwKCdyb3V0ZXMvaGVsbG8uZGFydCcpfSBhbmQgJHtsaWdodEN5YW4ud3JhcCgncm91dGVzL2hlbGxvL2luZGV4LmRhcnQnKX0gYm90aCByZXNvbHZlIHRvICR7bGlnaHRDeWFuLndyYXAoJy9oZWxsbycpfS4nJycsCiAgICAgICAgKSwKICAgICAgKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgaXNFbXB0eSk7CiAgICB9KTsKCiAgICB0ZXN0KCdjb21wbGFpbnMgYWJvdXQgcm9ndWUgcm91dGVzJywgKCkgYXN5bmMgewogICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gUm91dGVDb25maWd1cmF0aW9uKAogICAgICAgIG1pZGRsZXdhcmU6IFtdLAogICAgICAgIGRpcmVjdG9yaWVzOiBbXSwKICAgICAgICByb3V0ZXM6IFtdLAogICAgICAgIHJvZ3VlUm91dGVzOiBbCiAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgIG5hbWU6ICdoZWxsbycsCiAgICAgICAgICAgIHBhdGg6ICdoZWxsby5kYXJ0JywKICAgICAgICAgICAgcm91dGU6ICcvaGVsbG8nLAogICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICApLAogICAgICAgIF0sCiAgICAgICAgZW5kcG9pbnRzOiB7fSwKICAgICAgKTsKCiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGF3YWl0IHByZUdlbigKICAgICAgICBjb250ZXh0LAogICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IGNvbmZpZ3VyYXRpb24sCiAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgKTsKCiAgICAgIHZlcmlmeSgKICAgICAgICAoKSA9PiBsb2dnZXIuZXJyKAogICAgICAgICAgJycnUm9ndWUgcm91dGUgZGV0ZWN0ZWQuJHtkZWZhdWx0Rm9yZWdyb3VuZC53cmFwKCcgJyl9UmVuYW1lICR7bGlnaHRDeWFuLndyYXAoJ3JvdXRlcy9oZWxsby5kYXJ0Jyl9IHRvICR7bGlnaHRDeWFuLndyYXAoJ3JvdXRlcy9oZWxsby9pbmRleC5kYXJ0Jyl9LicnJywKICAgICAgICApLAogICAgICApOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBpc0VtcHR5KTsKICAgIH0pOwoKICAgIHRlc3QoJ3JldGFpbnMgY3VzdG9tIHBvcnQgaWYgc3BlY2lmaWVkJywgKCkgYXN5bmMgewogICAgICBjb25zdCBjdXN0b21Qb3J0ID0gJzgwODEnOwogICAgICBjb250ZXh0LnZhcnNbJ3BvcnQnXSA9IGN1c3RvbVBvcnQ7CiAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBSb3V0ZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgbWlkZGxld2FyZTogW10sCiAgICAgICAgZGlyZWN0b3JpZXM6IFtdLAogICAgICAgIHJvdXRlczogW10sCiAgICAgICAgcm9ndWVSb3V0ZXM6IFtdLAogICAgICAgIGVuZHBvaW50czoge30sCiAgICAgICk7CiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGF3YWl0IHByZUdlbigKICAgICAgICBjb250ZXh0LAogICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IGNvbmZpZ3VyYXRpb24sCiAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgaXNFbXB0eSk7CiAgICAgIHZlcmlmeU5ldmVyKCgpID0+IGxvZ2dlci5lcnIoYW55KCkpKTsKICAgICAgZXhwZWN0KAogICAgICAgIGNvbnRleHQudmFycywKICAgICAgICBlcXVhbHMoCiAgICAgICAgICB7CiAgICAgICAgICAgICdwb3J0JzogY3VzdG9tUG9ydCwKICAgICAgICAgICAgJ2RpcmVjdG9yaWVzJzogPFJvdXRlRGlyZWN0b3J5PltdLAogICAgICAgICAgICAncm91dGVzJzogPFJvdXRlRmlsZT5bXSwKICAgICAgICAgICAgJ21pZGRsZXdhcmUnOiA8TWlkZGxld2FyZUZpbGU+W10sCiAgICAgICAgICAgICdnbG9iYWxNaWRkbGV3YXJlJzogZmFsc2UsCiAgICAgICAgICAgICdzZXJ2ZVN0YXRpY0ZpbGVzJzogZmFsc2UsCiAgICAgICAgICAgICdpbnZva2VDdXN0b21FbnRyeXBvaW50JzogZmFsc2UsCiAgICAgICAgICAgICdpbnZva2VDdXN0b21Jbml0JzogZmFsc2UsCiAgICAgICAgICB9LAogICAgICAgICksCiAgICAgICk7CiAgICB9KTsKCiAgICB0ZXN0KCdyZXRhaW5zIGludm9rZUN1c3RvbUVudHJ5cG9pbnQgKHRydWUpJywgKCkgYXN5bmMgewogICAgICBjb25zdCBjdXN0b21Qb3J0ID0gJzgwODEnOwogICAgICBjb250ZXh0LnZhcnNbJ3BvcnQnXSA9IGN1c3RvbVBvcnQ7CiAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBSb3V0ZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgbWlkZGxld2FyZTogW10sCiAgICAgICAgZGlyZWN0b3JpZXM6IFtdLAogICAgICAgIHJvdXRlczogW10sCiAgICAgICAgcm9ndWVSb3V0ZXM6IFtdLAogICAgICAgIGVuZHBvaW50czoge30sCiAgICAgICAgaW52b2tlQ3VzdG9tRW50cnlwb2ludDogdHJ1ZSwKICAgICAgKTsKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgYXdhaXQgcHJlR2VuKAogICAgICAgIGNvbnRleHQsCiAgICAgICAgYnVpbGRDb25maWd1cmF0aW9uOiAoXykgPT4gY29uZmlndXJhdGlvbiwKICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICApOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBpc0VtcHR5KTsKICAgICAgdmVyaWZ5TmV2ZXIoKCkgPT4gbG9nZ2VyLmVycihhbnkoKSkpOwogICAgICBleHBlY3QoCiAgICAgICAgY29udGV4dC52YXJzLAogICAgICAgIGVxdWFscygKICAgICAgICAgIHsKICAgICAgICAgICAgJ3BvcnQnOiBjdXN0b21Qb3J0LAogICAgICAgICAgICAnZGlyZWN0b3JpZXMnOiA8Um91dGVEaXJlY3Rvcnk+W10sCiAgICAgICAgICAgICdyb3V0ZXMnOiA8Um91dGVGaWxlPltdLAogICAgICAgICAgICAnbWlkZGxld2FyZSc6IDxNaWRkbGV3YXJlRmlsZT5bXSwKICAgICAgICAgICAgJ2dsb2JhbE1pZGRsZXdhcmUnOiBmYWxzZSwKICAgICAgICAgICAgJ3NlcnZlU3RhdGljRmlsZXMnOiBmYWxzZSwKICAgICAgICAgICAgJ2ludm9rZUN1c3RvbUVudHJ5cG9pbnQnOiB0cnVlLAogICAgICAgICAgICAnaW52b2tlQ3VzdG9tSW5pdCc6IGZhbHNlLAogICAgICAgICAgfSwKICAgICAgICApLAogICAgICApOwogICAgfSk7CgogICAgdGVzdCgncmV0YWlucyBpbnZva2VDdXN0b21Jbml0ICh0cnVlKScsICgpIGFzeW5jIHsKICAgICAgY29uc3QgY3VzdG9tUG9ydCA9ICc4MDgxJzsKICAgICAgY29udGV4dC52YXJzWydwb3J0J10gPSBjdXN0b21Qb3J0OwogICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gUm91dGVDb25maWd1cmF0aW9uKAogICAgICAgIG1pZGRsZXdhcmU6IFtdLAogICAgICAgIGRpcmVjdG9yaWVzOiBbXSwKICAgICAgICByb3V0ZXM6IFtdLAogICAgICAgIHJvZ3VlUm91dGVzOiBbXSwKICAgICAgICBlbmRwb2ludHM6IHt9LAogICAgICAgIGludm9rZUN1c3RvbUluaXQ6IHRydWUsCiAgICAgICk7CiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGF3YWl0IHByZUdlbigKICAgICAgICBjb250ZXh0LAogICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IGNvbmZpZ3VyYXRpb24sCiAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgaXNFbXB0eSk7CiAgICAgIHZlcmlmeU5ldmVyKCgpID0+IGxvZ2dlci5lcnIoYW55KCkpKTsKICAgICAgZXhwZWN0KAogICAgICAgIGNvbnRleHQudmFycywKICAgICAgICBlcXVhbHMoCiAgICAgICAgICB7CiAgICAgICAgICAgICdwb3J0JzogY3VzdG9tUG9ydCwKICAgICAgICAgICAgJ2RpcmVjdG9yaWVzJzogPFJvdXRlRGlyZWN0b3J5PltdLAogICAgICAgICAgICAncm91dGVzJzogPFJvdXRlRmlsZT5bXSwKICAgICAgICAgICAgJ21pZGRsZXdhcmUnOiA8TWlkZGxld2FyZUZpbGU+W10sCiAgICAgICAgICAgICdnbG9iYWxNaWRkbGV3YXJlJzogZmFsc2UsCiAgICAgICAgICAgICdzZXJ2ZVN0YXRpY0ZpbGVzJzogZmFsc2UsCiAgICAgICAgICAgICdpbnZva2VDdXN0b21FbnRyeXBvaW50JzogZmFsc2UsCiAgICAgICAgICAgICdpbnZva2VDdXN0b21Jbml0JzogdHJ1ZSwKICAgICAgICAgIH0sCiAgICAgICAgKSwKICAgICAgKTsKICAgIH0pOwoKICAgIHRlc3QoJ3VwZGF0ZXMgY29udGV4dC52YXJzIHdoZW4gYnVpbGRSb3V0ZUNvbmZpZ3VyYXRpb24gc3VjY2VlZHMnLAogICAgICAgICgpIGFzeW5jIHsKICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9IFJvdXRlQ29uZmlndXJhdGlvbigKICAgICAgICBnbG9iYWxNaWRkbGV3YXJlOiBNaWRkbGV3YXJlRmlsZSgKICAgICAgICAgIG5hbWU6ICdtaWRkbGV3YXJlJywKICAgICAgICAgIHBhdGg6ICdtaWRkbGV3YXJlLmRhcnQnLAogICAgICAgICksCiAgICAgICAgbWlkZGxld2FyZTogWwogICAgICAgICAgTWlkZGxld2FyZUZpbGUoCiAgICAgICAgICAgIG5hbWU6ICdoZWxsb19taWRkbGV3YXJlJywKICAgICAgICAgICAgcGF0aDogJ2hlbGxvL21pZGRsZXdhcmUuZGFydCcsCiAgICAgICAgICApLAogICAgICAgIF0sCiAgICAgICAgZGlyZWN0b3JpZXM6IFsKICAgICAgICAgIFJvdXRlRGlyZWN0b3J5KAogICAgICAgICAgICBuYW1lOiAnXycsCiAgICAgICAgICAgIHJvdXRlOiAnLycsCiAgICAgICAgICAgIG1pZGRsZXdhcmU6IFtdLAogICAgICAgICAgICBmaWxlczogWwogICAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICAgIG5hbWU6ICdpbmRleCcsCiAgICAgICAgICAgICAgICBwYXRoOiAnaW5kZXguZGFydCcsCiAgICAgICAgICAgICAgICByb3V0ZTogJy8nLAogICAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgICApLAogICAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICAgIG5hbWU6ICdoZWxsbycsCiAgICAgICAgICAgICAgICBwYXRoOiAnaGVsbG8uZGFydCcsCiAgICAgICAgICAgICAgICByb3V0ZTogJy9oZWxsbycsCiAgICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICAgICksCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICApLAogICAgICAgIF0sCiAgICAgICAgcm91dGVzOiBbCiAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgIG5hbWU6ICdpbmRleCcsCiAgICAgICAgICAgIHBhdGg6ICdpbmRleC5kYXJ0JywKICAgICAgICAgICAgcm91dGU6ICcvJywKICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgKSwKICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgbmFtZTogJ2hlbGxvJywKICAgICAgICAgICAgcGF0aDogJ2hlbGxvLmRhcnQnLAogICAgICAgICAgICByb3V0ZTogJy9oZWxsbycsCiAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICksCiAgICAgICAgXSwKICAgICAgICBlbmRwb2ludHM6IHsKICAgICAgICAgICcvJzogWwogICAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgbmFtZTogJ2luZGV4JywKICAgICAgICAgICAgICBwYXRoOiAnaW5kZXguZGFydCcsCiAgICAgICAgICAgICAgcm91dGU6ICcvJywKICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgKSwKICAgICAgICAgIF0sCiAgICAgICAgICAnL2hlbGxvJzogWwogICAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgbmFtZTogJ2hlbGxvJywKICAgICAgICAgICAgICBwYXRoOiAnaGVsbG8uZGFydCcsCiAgICAgICAgICAgICAgcm91dGU6ICcvaGVsbG8nLAogICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICApLAogICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIHJvZ3VlUm91dGVzOiBbXSwKICAgICAgICBzZXJ2ZVN0YXRpY0ZpbGVzOiB0cnVlLAogICAgICApOwogICAgICBmaW5hbCBleGl0Q2FsbHMgPSA8aW50PltdOwogICAgICBhd2FpdCBwcmVHZW4oCiAgICAgICAgY29udGV4dCwKICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiBjb25maWd1cmF0aW9uLAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICk7CiAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGlzRW1wdHkpOwogICAgICB2ZXJpZnlOZXZlcigoKSA9PiBsb2dnZXIuZXJyKGFueSgpKSk7CiAgICAgIGV4cGVjdCgKICAgICAgICBjb250ZXh0LnZhcnMsCiAgICAgICAgZXF1YWxzKAogICAgICAgICAgewogICAgICAgICAgICAncG9ydCc6ICc4MDgwJywKICAgICAgICAgICAgJ2RpcmVjdG9yaWVzJzogWwogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICduYW1lJzogJ18nLAogICAgICAgICAgICAgICAgJ3JvdXRlJzogJy8nLAogICAgICAgICAgICAgICAgJ21pZGRsZXdhcmUnOiA8TWFwPFN0cmluZywgZHluYW1pYz4+W10sCiAgICAgICAgICAgICAgICAnZmlsZXMnOiBbCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdpbmRleCcsCiAgICAgICAgICAgICAgICAgICAgJ3BhdGgnOiAnaW5kZXguZGFydCcsCiAgICAgICAgICAgICAgICAgICAgJ3JvdXRlJzogJy8nLAogICAgICAgICAgICAgICAgICAgICdmaWxlX3BhcmFtcyc6IDxTdHJpbmc+W10sCiAgICAgICAgICAgICAgICAgICAgJ3dpbGRjYXJkJzogZmFsc2UsCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdoZWxsbycsCiAgICAgICAgICAgICAgICAgICAgJ3BhdGgnOiAnaGVsbG8uZGFydCcsCiAgICAgICAgICAgICAgICAgICAgJ3JvdXRlJzogJy9oZWxsbycsCiAgICAgICAgICAgICAgICAgICAgJ2ZpbGVfcGFyYW1zJzogPFN0cmluZz5bXSwKICAgICAgICAgICAgICAgICAgICAnd2lsZGNhcmQnOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICdkaXJlY3RvcnlfcGFyYW1zJzogPFN0cmluZz5bXSwKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICdyb3V0ZXMnOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJ25hbWUnOiAnaW5kZXgnLAogICAgICAgICAgICAgICAgJ3BhdGgnOiAnaW5kZXguZGFydCcsCiAgICAgICAgICAgICAgICAncm91dGUnOiAnLycsCiAgICAgICAgICAgICAgICAnZmlsZV9wYXJhbXMnOiBjb25zdCA8U3RyaW5nPltdLAogICAgICAgICAgICAgICAgJ3dpbGRjYXJkJzogZmFsc2UsCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAnbmFtZSc6ICdoZWxsbycsCiAgICAgICAgICAgICAgICAncGF0aCc6ICdoZWxsby5kYXJ0JywKICAgICAgICAgICAgICAgICdyb3V0ZSc6ICcvaGVsbG8nLAogICAgICAgICAgICAgICAgJ2ZpbGVfcGFyYW1zJzogY29uc3QgPFN0cmluZz5bXSwKICAgICAgICAgICAgICAgICd3aWxkY2FyZCc6IGZhbHNlLAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgJ21pZGRsZXdhcmUnOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJ25hbWUnOiAnaGVsbG9fbWlkZGxld2FyZScsCiAgICAgICAgICAgICAgICAncGF0aCc6ICdoZWxsby9taWRkbGV3YXJlLmRhcnQnLAogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICdnbG9iYWxNaWRkbGV3YXJlJzogewogICAgICAgICAgICAgICduYW1lJzogJ21pZGRsZXdhcmUnLAogICAgICAgICAgICAgICdwYXRoJzogJ21pZGRsZXdhcmUuZGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdzZXJ2ZVN0YXRpY0ZpbGVzJzogdHJ1ZSwKICAgICAgICAgICAgJ2ludm9rZUN1c3RvbUVudHJ5cG9pbnQnOiBmYWxzZSwKICAgICAgICAgICAgJ2ludm9rZUN1c3RvbUluaXQnOiBmYWxzZSwKICAgICAgICAgIH0sCiAgICAgICAgKSwKICAgICAgKTsKICAgIH0pOwogIH0pOwp9Cg==", - "type": "text" - }, - { - "path": "test/src/exit_overrides_test.dart", - "data": - "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CgppbXBvcnQgJy4uLy4uL3NyYy9leGl0X292ZXJyaWRlcy5kYXJ0JzsKCnZvaWQgbWFpbigpIHsKICBncm91cCgnRXhpdE92ZXJyaWRlcycsICgpIHsKICAgIGdyb3VwKCdydW5ab25lZCcsICgpIHsKICAgICAgdGVzdCgndXNlcyBkZWZhdWx0IGV4aXQgd2hlbiBub3Qgc3BlY2lmaWVkJywgKCkgewogICAgICAgIEV4aXRPdmVycmlkZXMucnVuWm9uZWQoKCkgewogICAgICAgICAgZmluYWwgb3ZlcnJpZGVzID0gRXhpdE92ZXJyaWRlcy5jdXJyZW50OwogICAgICAgICAgZXhwZWN0KG92ZXJyaWRlcyEuZXhpdCwgZXF1YWxzKGV4aXQpKTsKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICB0ZXN0KCd1c2VzIGN1c3RvbSBleGl0IHdoZW4gc3BlY2lmaWVkJywgKCkgewogICAgICAgIEV4aXRPdmVycmlkZXMucnVuWm9uZWQoCiAgICAgICAgICAoKSB7CiAgICAgICAgICAgIGZpbmFsIG92ZXJyaWRlcyA9IEV4aXRPdmVycmlkZXMuY3VycmVudDsKICAgICAgICAgICAgZXhwZWN0KG92ZXJyaWRlcyEuZXhpdCwgaXNOb3QoZXF1YWxzKGV4aXQpKSk7CiAgICAgICAgICB9LAogICAgICAgICAgZXhpdDogKF8pIHt9LAogICAgICAgICk7CiAgICAgIH0pOwogICAgfSk7CiAgfSk7Cn0K", - "type": "text" - } - ], - "name": "dart_frog_dev_server", - "description": "A dart_frog dev server", - "version": "0.1.0+1", - "environment": {"mason": ">=0.1.0-dev <0.1.0"}, - "readme": { - "path": "README.md", - "data": - "IyBkYXJ0X2Zyb2dfZGV2X3NlcnZlcgoKWyFbUG93ZXJlZCBieSBNYXNvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZ0aW55dXJsLmNvbSUyRm1hc29uLWJhZGdlKV0oaHR0cHM6Ly9naXRodWIuY29tL2ZlbGFuZ2VsL21hc29uKQoKQSBkYXJ0X2Zyb2cgZGV2IHNlcnZlcgoKX0dlbmVyYXRlZCBieSBbbWFzb25dWzFdIPCfp7FfCgpbMV06IGh0dHBzOi8vZ2l0aHViLmNvbS9mZWxhbmdlbC9tYXNvbgo=", - "type": "text" - }, - "changelog": { - "path": "CHANGELOG.md", - "data": - "IyAwLjEuMCsxCgotIGZlYXQ6IGJhc2ljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZGFydCBmcm9nIGRldiBzZXJ2ZXIK", - "type": "text" - }, - "license": { - "path": "LICENSE", - "data": - "TUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgMjAyMiBWZXJ5IEdvb2QgVmVudHVyZXMKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCg==", - "type": "text" - }, - "vars": {} -}); diff --git a/packages/dart_frog_cli/lib/src/commands/new/new.dart b/packages/dart_frog_cli/lib/src/commands/new/new.dart index b8a9855d0..7028fda18 100644 --- a/packages/dart_frog_cli/lib/src/commands/new/new.dart +++ b/packages/dart_frog_cli/lib/src/commands/new/new.dart @@ -3,8 +3,9 @@ import 'dart:io'; import 'package:args/args.dart'; import 'package:args/command_runner.dart'; import 'package:dart_frog_cli/src/command.dart'; -import 'package:dart_frog_cli/src/commands/commands.dart'; import 'package:dart_frog_cli/src/commands/new/templates/dart_frog_new_bundle.dart'; +import 'package:dart_frog_gen/dart_frog_gen.dart'; +// ignore: depend_on_referenced_packages import 'package:mason/mason.dart'; import 'package:meta/meta.dart'; import 'package:path/path.dart' as path; diff --git a/packages/dart_frog_cli/lib/src/commands/uninstall/uninstall.dart b/packages/dart_frog_cli/lib/src/commands/uninstall/uninstall.dart index 860a968e5..5f503dac0 100644 --- a/packages/dart_frog_cli/lib/src/commands/uninstall/uninstall.dart +++ b/packages/dart_frog_cli/lib/src/commands/uninstall/uninstall.dart @@ -1,6 +1,6 @@ import 'package:args/command_runner.dart'; import 'package:dart_frog_cli/src/command_runner.dart'; -import 'package:mason/mason.dart' hide packageVersion; +import 'package:mason/mason.dart'; /// {@template uninstall_command} /// `dart_frog uninstall` command which explains how to uninstall diff --git a/packages/dart_frog_cli/lib/src/daemon/domain/dev_server_domain.dart b/packages/dart_frog_cli/lib/src/daemon/domain/dev_server_domain.dart index 2eebacc8e..adcd191d3 100644 --- a/packages/dart_frog_cli/lib/src/daemon/domain/dev_server_domain.dart +++ b/packages/dart_frog_cli/lib/src/daemon/domain/dev_server_domain.dart @@ -1,10 +1,7 @@ import 'dart:io'; -import 'package:dart_frog_cli/src/commands/commands.dart'; -import 'package:dart_frog_cli/src/commands/dev/templates/dart_frog_dev_server_bundle.dart'; import 'package:dart_frog_cli/src/daemon/daemon.dart'; -import 'package:dart_frog_cli/src/dev_server_runner/dev_server_runner.dart'; -import 'package:mason/mason.dart'; +import 'package:dart_frog_gen/dart_frog_gen.dart'; import 'package:meta/meta.dart'; /// {@template dev_server_domain} @@ -16,11 +13,8 @@ class DevServerDomain extends DomainBase { DevServerDomain( super.daemon, { @visibleForTesting super.getId, - @visibleForTesting GeneratorBuilder? generator, @visibleForTesting DevServerRunnerBuilder? devServerRunnerBuilder, - }) : _generator = generator ?? MasonGenerator.fromBundle, - _devServerRunnerBuilder = - devServerRunnerBuilder ?? DevServerRunner.new { + }) : _devServerRunnerBuilder = devServerRunnerBuilder ?? DevServerRunner.new { addHandler('start', _start); addHandler('reload', _reload); addHandler('stop', _stop); @@ -31,7 +25,6 @@ class DevServerDomain extends DomainBase { final _devServerRunners = {}; - final GeneratorBuilder _generator; final DevServerRunnerBuilder _devServerRunnerBuilder; /// Starts a [DevServerRunner] for the given [request]. @@ -55,8 +48,6 @@ class DevServerDomain extends DomainBase { ), ); - final devServerBundleGenerator = await _generator(dartFrogDevServerBundle); - final logger = DaemonLogger( domain: domainName, params: { @@ -71,7 +62,6 @@ class DevServerDomain extends DomainBase { final devServerRunner = _devServerRunnerBuilder( logger: logger, port: '$port', - devServerBundleGenerator: devServerBundleGenerator, dartVmServicePort: '$dartVmServicePort', workingDirectory: Directory(workingDirectory), ); diff --git a/packages/dart_frog_cli/lib/src/daemon/domain/route_configuration_domain.dart b/packages/dart_frog_cli/lib/src/daemon/domain/route_configuration_domain.dart index 131eb2d0d..1f715aef3 100644 --- a/packages/dart_frog_cli/lib/src/daemon/domain/route_configuration_domain.dart +++ b/packages/dart_frog_cli/lib/src/daemon/domain/route_configuration_domain.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'dart:io' as io; import 'package:dart_frog_cli/src/daemon/daemon.dart'; -import 'package:dart_frog_cli/src/route_configuration_watcher/route_configuration_watcher.dart'; +import 'package:dart_frog_gen/dart_frog_gen.dart'; import 'package:meta/meta.dart'; /// {@template route_configuration_domain} diff --git a/packages/dart_frog_cli/lib/src/plugin_runner/plugin_runner.dart b/packages/dart_frog_cli/lib/src/plugin_runner/plugin_runner.dart new file mode 100644 index 000000000..3f368eacd --- /dev/null +++ b/packages/dart_frog_cli/lib/src/plugin_runner/plugin_runner.dart @@ -0,0 +1,19 @@ + +import 'package:build_runner_core/build_runner_core.dart'; +import 'package:dart_frog_gen/dart_frog_gen.dart'; + +class _DevServerCallbacks extends DevServerCallbacks {} + +class PluginRunner { + + + Future discoverPlugins() async { + final graph = await PackageGraph.forThisPackage(); + graph.allPackages.forEach((key, value) { + print('key: $key, value: $value'); + }); + } + + + +} \ No newline at end of file diff --git a/packages/dart_frog_cli/pubspec.yaml b/packages/dart_frog_cli/pubspec.yaml index bfe913789..6001a399a 100644 --- a/packages/dart_frog_cli/pubspec.yaml +++ b/packages/dart_frog_cli/pubspec.yaml @@ -16,16 +16,17 @@ environment: dependencies: args: ^2.1.0 - cli_completion: ">=0.3.0 <0.5.0" + build_runner_core: ^7.2.11 + cli_completion: ^0.4.0 dart_frog_gen: ^2.0.0 equatable: ^2.0.5 - mason: 0.1.0-dev.50 + mason: ^0.1.0-dev.51 meta: ^1.7.0 path: ^1.8.1 pub_updater: ^0.3.1 pubspec_parse: ^1.2.0 stream_transform: ^2.0.0 - uuid: ^4.0.0 + uuid: ^4.1.0 watcher: ^1.0.1 dev_dependencies: @@ -38,3 +39,8 @@ dev_dependencies: executables: dart_frog: + + +dependency_overrides: + dart_frog_gen: + path: ../dart_frog_gen \ No newline at end of file diff --git a/packages/dart_frog_cli/test/src/commands/build/build_test.dart b/packages/dart_frog_cli/test/src/commands/build/build_test.dart index c3a092259..b95153c52 100644 --- a/packages/dart_frog_cli/test/src/commands/build/build_test.dart +++ b/packages/dart_frog_cli/test/src/commands/build/build_test.dart @@ -1,6 +1,6 @@ import 'package:args/args.dart'; import 'package:dart_frog_cli/src/commands/commands.dart'; -import 'package:dart_frog_cli/src/runtime_compatibility.dart'; +import 'package:dart_frog_cli/src/runtime_compatibility/runtime_compatibility.dart'; import 'package:mason/mason.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; diff --git a/packages/dart_frog_cli/test/src/commands/dev/dev_test.dart b/packages/dart_frog_cli/test/src/commands/dev/dev_test.dart index 0c30ee854..87c9b07e0 100644 --- a/packages/dart_frog_cli/test/src/commands/dev/dev_test.dart +++ b/packages/dart_frog_cli/test/src/commands/dev/dev_test.dart @@ -4,7 +4,7 @@ import 'dart:io'; import 'package:args/args.dart'; import 'package:dart_frog_cli/src/commands/commands.dart'; import 'package:dart_frog_cli/src/dev_server_runner/dev_server_runner.dart'; -import 'package:dart_frog_cli/src/runtime_compatibility.dart'; +import 'package:dart_frog_cli/src/runtime_compatibility/runtime_compatibility.dart'; import 'package:mason/mason.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; diff --git a/packages/dart_frog_cli/test/src/runtime_compatibility_test.dart b/packages/dart_frog_cli/test/src/runtime_compatibility_test.dart index 387ae1367..6358c7145 100644 --- a/packages/dart_frog_cli/test/src/runtime_compatibility_test.dart +++ b/packages/dart_frog_cli/test/src/runtime_compatibility_test.dart @@ -2,7 +2,7 @@ import 'dart:io'; -import 'package:dart_frog_cli/src/runtime_compatibility.dart'; +import 'package:dart_frog_cli/src/runtime_compatibility/runtime_compatibility.dart'; import 'package:mason/mason.dart'; import 'package:path/path.dart' as path; import 'package:test/test.dart'; diff --git a/packages/dart_frog_gen/analysis_options.yaml b/packages/dart_frog_gen/analysis_options.yaml index f8c1a7f55..c2b9b6eb7 100644 --- a/packages/dart_frog_gen/analysis_options.yaml +++ b/packages/dart_frog_gen/analysis_options.yaml @@ -1 +1,4 @@ -include: package:very_good_analysis/analysis_options.5.1.0.yaml \ No newline at end of file +include: package:very_good_analysis/analysis_options.5.1.0.yaml + +# ignore test + diff --git a/packages/dart_frog_gen/lib/dart_frog_gen.dart b/packages/dart_frog_gen/lib/dart_frog_gen.dart index 9d75cd5a1..12a397481 100644 --- a/packages/dart_frog_gen/lib/dart_frog_gen.dart +++ b/packages/dart_frog_gen/lib/dart_frog_gen.dart @@ -1,5 +1,6 @@ /// Code generation tooling for package:dart_frog library dart_frog_gen; -export 'src/build_route_configuration.dart'; -export 'src/validate_route_configuration/validate_route_configuration.dart'; +export 'src/codegen/codegen.dart'; +export 'src/route_configuration/route_configuration.dart'; +export 'src/runtime_compatibility/runtime_compatibility.dart'; diff --git a/packages/dart_frog_gen/lib/src/codegen/bundles/dart_frog_dev_server_bundle.dart b/packages/dart_frog_gen/lib/src/codegen/bundles/dart_frog_dev_server_bundle.dart new file mode 100644 index 000000000..a14c41d32 --- /dev/null +++ b/packages/dart_frog_gen/lib/src/codegen/bundles/dart_frog_dev_server_bundle.dart @@ -0,0 +1,21 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint, implicit_dynamic_list_literal, implicit_dynamic_map_literal, inference_failure_on_collection_literal + +import 'package:mason/mason.dart'; + +final dartFrogDevServerBundle = MasonBundle.fromJson({ + "files": [ + { + "path": "server.dart", + "data": + "Ly8gR0VORVJBVEVEIENPREUgLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKLy8gaWdub3JlX2Zvcl9maWxlOiB0eXBlPWxpbnQsIGltcGxpY2l0X2R5bmFtaWNfbGlzdF9saXRlcmFsCgppbXBvcnQgJ2RhcnQ6aW8nOwoKaW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZy9kYXJ0X2Zyb2cuZGFydCc7Cgp7eyNpbnZva2VDdXN0b21FbnRyeXBvaW50fX1pbXBvcnQgJy4uL21haW4uZGFydCcgYXMgZW50cnlwb2ludDt7ey9pbnZva2VDdXN0b21FbnRyeXBvaW50fX0Ke3sjcm91dGVzfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Owp7ey9yb3V0ZXN9fQp7eyNtaWRkbGV3YXJlfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Owp7ey9taWRkbGV3YXJlfX0Kdm9pZCBtYWluKCkgYXN5bmMgewogIGZpbmFsIGFkZHJlc3MgPSBJbnRlcm5ldEFkZHJlc3MuYW55SVB2NjsKICBmaW5hbCBwb3J0ID0gaW50LnRyeVBhcnNlKFBsYXRmb3JtLmVudmlyb25tZW50WydQT1JUJ10gPz8gJ3t7e3BvcnR9fX0nKSA/PyB7e3twb3J0fX19O3t7I2ludm9rZUN1c3RvbUluaXR9fQogIGF3YWl0IGVudHJ5cG9pbnQuaW5pdChhZGRyZXNzLCBwb3J0KTt7ey9pbnZva2VDdXN0b21Jbml0fX0KICBob3RSZWxvYWQoKCkgPT4gY3JlYXRlU2VydmVyKGFkZHJlc3MsIHBvcnQpKTsKfQoKRnV0dXJlPEh0dHBTZXJ2ZXI+IGNyZWF0ZVNlcnZlcihJbnRlcm5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnQpIHsKICBmaW5hbCBoYW5kbGVyID0gQ2FzY2FkZSgpe3sjc2VydmVTdGF0aWNGaWxlc319LmFkZChjcmVhdGVTdGF0aWNGaWxlSGFuZGxlcigpKXt7L3NlcnZlU3RhdGljRmlsZXN9fS5hZGQoYnVpbGRSb290SGFuZGxlcigpKS5oYW5kbGVyOwogIHt7I2ludm9rZUN1c3RvbUVudHJ5cG9pbnR9fXJldHVybiBlbnRyeXBvaW50LnJ1bihoYW5kbGVyLCBhZGRyZXNzLCBwb3J0KTt7ey9pbnZva2VDdXN0b21FbnRyeXBvaW50fX17e15pbnZva2VDdXN0b21FbnRyeXBvaW50fX1yZXR1cm4gc2VydmUoaGFuZGxlciwgYWRkcmVzcywgcG9ydCk7e3svaW52b2tlQ3VzdG9tRW50cnlwb2ludH19Cn0KCkhhbmRsZXIgYnVpbGRSb290SGFuZGxlcigpIHsKICBmaW5hbCBwaXBlbGluZSA9IGNvbnN0IFBpcGVsaW5lKCl7eyNnbG9iYWxNaWRkbGV3YXJlfX0uYWRkTWlkZGxld2FyZSh7eyNzbmFrZUNhc2V9fXt7e25hbWV9fX17ey9zbmFrZUNhc2V9fS5taWRkbGV3YXJlKXt7L2dsb2JhbE1pZGRsZXdhcmV9fTsKICBmaW5hbCByb3V0ZXIgPSBSb3V0ZXIoKXt7I2RpcmVjdG9yaWVzfX0KICAgIC4ubW91bnQoJ3t7e3JvdXRlfX19JywgKGNvbnRleHR7eyNkaXJlY3RvcnlfcGFyYW1zLjB9fSx7eyNkaXJlY3RvcnlfcGFyYW1zfX17ey59fSx7ey9kaXJlY3RvcnlfcGFyYW1zfX17ey9kaXJlY3RvcnlfcGFyYW1zLjB9fSkgPT4gYnVpbGR7eyNwYXNjYWxDYXNlfX17e3tuYW1lfX19e3svcGFzY2FsQ2FzZX19SGFuZGxlcih7eyNkaXJlY3RvcnlfcGFyYW1zfX17ey59fSx7ey9kaXJlY3RvcnlfcGFyYW1zfX0pKGNvbnRleHQpKXt7L2RpcmVjdG9yaWVzfX07CiAgcmV0dXJuIHBpcGVsaW5lLmFkZEhhbmRsZXIocm91dGVyKTsKfQp7eyNkaXJlY3Rvcmllc319CkhhbmRsZXIgYnVpbGR7eyNwYXNjYWxDYXNlfX17e3tuYW1lfX19e3svcGFzY2FsQ2FzZX19SGFuZGxlcih7eyNkaXJlY3RvcnlfcGFyYW1zfX1TdHJpbmcge3sufX0se3svZGlyZWN0b3J5X3BhcmFtc319KSB7CiAgZmluYWwgcGlwZWxpbmUgPSBjb25zdCBQaXBlbGluZSgpe3sjbWlkZGxld2FyZS4wfX17eyNtaWRkbGV3YXJlfX0uYWRkTWlkZGxld2FyZSh7eyNzbmFrZUNhc2V9fXt7e25hbWV9fX17ey9zbmFrZUNhc2V9fS5taWRkbGV3YXJlKXt7L21pZGRsZXdhcmV9fXt7L21pZGRsZXdhcmUuMH19OwogIGZpbmFsIHJvdXRlciA9IFJvdXRlcigpCiAgICB7eyNmaWxlc319e3sjd2lsZGNhcmR9fS4ubW91bnQoJ3t7e3JvdXRlfX19JywgKGNvbnRleHQpID0+IHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Lm9uUmVxdWVzdChjb250ZXh0LGNvbnRleHQucmVxdWVzdC51cmwucGF0aCkpe3svd2lsZGNhcmR9fXt7XndpbGRjYXJkfX0uLmFsbCgne3t7cm91dGV9fX0nLCAoY29udGV4dHt7I2ZpbGVfcGFyYW1zLjB9fSx7eyNmaWxlX3BhcmFtc319e3sufX0se3svZmlsZV9wYXJhbXN9fXt7L2ZpbGVfcGFyYW1zLjB9fSkgPT4ge3sjc25ha2VDYXNlfX17e3tuYW1lfX19e3svc25ha2VDYXNlfX0ub25SZXF1ZXN0KGNvbnRleHQse3sjZGlyZWN0b3J5X3BhcmFtc319e3sufX0se3svZGlyZWN0b3J5X3BhcmFtc319e3sjZmlsZV9wYXJhbXN9fXt7Ln19LHt7L2ZpbGVfcGFyYW1zfX0pKXt7L3dpbGRjYXJkfX17ey9maWxlc319OwogIHJldHVybiBwaXBlbGluZS5hZGRIYW5kbGVyKHJvdXRlcik7Cn0Ke3svZGlyZWN0b3JpZXN9fQo=", + "type": "text" + } + ], + "hooks": [], + "name": "dart_frog_dev_server", + "description": "A dart_frog dev server", + "version": "0.1.0+1", + "environment": {"mason": ">=0.1.0-dev <0.1.0"}, + "vars": {} +}); diff --git a/packages/dart_frog_gen/lib/src/codegen/bundles/dart_frog_prod_server_bundle.dart b/packages/dart_frog_gen/lib/src/codegen/bundles/dart_frog_prod_server_bundle.dart new file mode 100644 index 000000000..ada2cd0a4 --- /dev/null +++ b/packages/dart_frog_gen/lib/src/codegen/bundles/dart_frog_prod_server_bundle.dart @@ -0,0 +1,40 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint, implicit_dynamic_list_literal, implicit_dynamic_map_literal, inference_failure_on_collection_literal + +import 'package:mason/mason.dart'; + +final dartFrogProdServerBundle = MasonBundle.fromJson({ + "files": [ + { + "path": "build/.dockerignore", + "data": + "LmRvY2tlcmlnbm9yZQpEb2NrZXJmaWxlCmJ1aWxkLwouZGFydF90b29sLwouZ2l0LwouZ2l0aHViLwouZ2l0aWdub3JlCi5pZGVhLwoucGFja2FnZXM=", + "type": "text" + }, + { + "path": "build/bin/server.dart", + "data": + "Ly8gR0VORVJBVEVEIENPREUgLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKLy8gaWdub3JlX2Zvcl9maWxlOiB0eXBlPWxpbnQsIGltcGxpY2l0X2R5bmFtaWNfbGlzdF9saXRlcmFsCgppbXBvcnQgJ2RhcnQ6aW8nOwoKaW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZy9kYXJ0X2Zyb2cuZGFydCc7Cgp7eyNpbnZva2VDdXN0b21FbnRyeXBvaW50fX1pbXBvcnQgJy4uL21haW4uZGFydCcgYXMgZW50cnlwb2ludDt7ey9pbnZva2VDdXN0b21FbnRyeXBvaW50fX0Ke3sjcm91dGVzfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Owp7ey9yb3V0ZXN9fQp7eyNtaWRkbGV3YXJlfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Owp7ey9taWRkbGV3YXJlfX0Kdm9pZCBtYWluKCkgYXN5bmMgewogIGZpbmFsIGFkZHJlc3MgPSBJbnRlcm5ldEFkZHJlc3MuYW55SVB2NjsKICBmaW5hbCBwb3J0ID0gaW50LnRyeVBhcnNlKFBsYXRmb3JtLmVudmlyb25tZW50WydQT1JUJ10gPz8gJzgwODAnKSA/PyA4MDgwO3t7I2ludm9rZUN1c3RvbUluaXR9fQogIGF3YWl0IGVudHJ5cG9pbnQuaW5pdChhZGRyZXNzLCBwb3J0KTt7ey9pbnZva2VDdXN0b21Jbml0fX0KICBjcmVhdGVTZXJ2ZXIoYWRkcmVzcywgcG9ydCk7Cn0KCkZ1dHVyZTxIdHRwU2VydmVyPiBjcmVhdGVTZXJ2ZXIoSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0KSBhc3luYyB7CiAgZmluYWwgaGFuZGxlciA9IENhc2NhZGUoKXt7I3NlcnZlU3RhdGljRmlsZXN9fS5hZGQoY3JlYXRlU3RhdGljRmlsZUhhbmRsZXIoKSl7ey9zZXJ2ZVN0YXRpY0ZpbGVzfX0uYWRkKGJ1aWxkUm9vdEhhbmRsZXIoKSkuaGFuZGxlcjsKICBmaW5hbCBzZXJ2ZXIgPSBhd2FpdCB7eyNpbnZva2VDdXN0b21FbnRyeXBvaW50fX1lbnRyeXBvaW50LnJ1bihoYW5kbGVyLCBhZGRyZXNzLCBwb3J0KXt7L2ludm9rZUN1c3RvbUVudHJ5cG9pbnR9fXt7Xmludm9rZUN1c3RvbUVudHJ5cG9pbnR9fXNlcnZlKGhhbmRsZXIsIGFkZHJlc3MsIHBvcnQpe3svaW52b2tlQ3VzdG9tRW50cnlwb2ludH19OwogIHByaW50KCdceDFCWzkybeKck1x4MUJbMG0gUnVubmluZyBvbiBodHRwOi8vJHtzZXJ2ZXIuYWRkcmVzcy5ob3N0fToke3NlcnZlci5wb3J0fScpOwogIHJldHVybiBzZXJ2ZXI7Cn0KCkhhbmRsZXIgYnVpbGRSb290SGFuZGxlcigpIHsKICBmaW5hbCBwaXBlbGluZSA9IGNvbnN0IFBpcGVsaW5lKCl7eyNnbG9iYWxNaWRkbGV3YXJlfX0uYWRkTWlkZGxld2FyZSh7eyNzbmFrZUNhc2V9fXt7e25hbWV9fX17ey9zbmFrZUNhc2V9fS5taWRkbGV3YXJlKXt7L2dsb2JhbE1pZGRsZXdhcmV9fTsKICBmaW5hbCByb3V0ZXIgPSBSb3V0ZXIoKXt7I2RpcmVjdG9yaWVzfX0KICAgIC4ubW91bnQoJ3t7e3JvdXRlfX19JywgKGNvbnRleHR7eyNkaXJlY3RvcnlfcGFyYW1zLjB9fSx7eyNkaXJlY3RvcnlfcGFyYW1zfX17ey59fSx7ey9kaXJlY3RvcnlfcGFyYW1zfX17ey9kaXJlY3RvcnlfcGFyYW1zLjB9fSkgPT4gYnVpbGR7eyNwYXNjYWxDYXNlfX17e3tuYW1lfX19e3svcGFzY2FsQ2FzZX19SGFuZGxlcih7eyNkaXJlY3RvcnlfcGFyYW1zfX17ey59fSx7ey9kaXJlY3RvcnlfcGFyYW1zfX0pKGNvbnRleHQpKXt7L2RpcmVjdG9yaWVzfX07CiAgcmV0dXJuIHBpcGVsaW5lLmFkZEhhbmRsZXIocm91dGVyKTsKfQp7eyNkaXJlY3Rvcmllc319CkhhbmRsZXIgYnVpbGR7eyNwYXNjYWxDYXNlfX17e3tuYW1lfX19e3svcGFzY2FsQ2FzZX19SGFuZGxlcih7eyNkaXJlY3RvcnlfcGFyYW1zfX1TdHJpbmcge3sufX0se3svZGlyZWN0b3J5X3BhcmFtc319KSB7CiAgZmluYWwgcGlwZWxpbmUgPSBjb25zdCBQaXBlbGluZSgpe3sjbWlkZGxld2FyZS4wfX17eyNtaWRkbGV3YXJlfX0uYWRkTWlkZGxld2FyZSh7eyNzbmFrZUNhc2V9fXt7e25hbWV9fX17ey9zbmFrZUNhc2V9fS5taWRkbGV3YXJlKXt7L21pZGRsZXdhcmV9fXt7L21pZGRsZXdhcmUuMH19OwogIGZpbmFsIHJvdXRlciA9IFJvdXRlcigpCiAgICB7eyNmaWxlc319e3sjd2lsZGNhcmR9fS4ubW91bnQoJ3t7e3JvdXRlfX19JywgKGNvbnRleHQpID0+IHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Lm9uUmVxdWVzdChjb250ZXh0LGNvbnRleHQucmVxdWVzdC51cmwucGF0aCkpe3svd2lsZGNhcmR9fXt7XndpbGRjYXJkfX0uLmFsbCgne3t7cm91dGV9fX0nLCAoY29udGV4dHt7I2ZpbGVfcGFyYW1zLjB9fSx7eyNmaWxlX3BhcmFtc319e3sufX0se3svZmlsZV9wYXJhbXN9fXt7L2ZpbGVfcGFyYW1zLjB9fSkgPT4ge3sjc25ha2VDYXNlfX17e3tuYW1lfX19e3svc25ha2VDYXNlfX0ub25SZXF1ZXN0KGNvbnRleHQse3sjZGlyZWN0b3J5X3BhcmFtc319e3sufX0se3svZGlyZWN0b3J5X3BhcmFtc319e3sjZmlsZV9wYXJhbXN9fXt7Ln19LHt7L2ZpbGVfcGFyYW1zfX0pKXt7L3dpbGRjYXJkfX17ey9maWxlc319OwogIHJldHVybiBwaXBlbGluZS5hZGRIYW5kbGVyKHJvdXRlcik7Cn0Ke3svZGlyZWN0b3JpZXN9fQo=", + "type": "text" + }, + { + "path": "build/{{#addDockerfile}}Dockerfile{{/addDockerfile}}", + "data": + "IyBPZmZpY2lhbCBEYXJ0IGltYWdlOiBodHRwczovL2h1Yi5kb2NrZXIuY29tL18vZGFydAojIFNwZWNpZnkgdGhlIERhcnQgU0RLIGJhc2UgaW1hZ2UgdmVyc2lvbiB1c2luZyBkYXJ0Ojx2ZXJzaW9uPiAoZXg6IGRhcnQ6Mi4xNykKRlJPTSBkYXJ0Ont7ZGFydFZlcnNpb259fSBBUyBidWlsZAoKV09SS0RJUiAvYXBwCnt7I2hhc0V4dGVybmFsRGVwZW5kZW5jaWVzfX0KCiMgQ29weSBleHRlcm5hbCBkZXBlbmRlbmNpZXMKQ09QWSAuLy5kYXJ0X2Zyb2dfcGF0aF9kZXBlbmRlbmNpZXMgIC4vLmRhcnRfZnJvZ19wYXRoX2RlcGVuZGVuY2llcwpDT1BZIC4vcHVic3BlY19vdmVycmlkZXMueWFtbCAuL3B1YnNwZWNfb3ZlcnJpZGVzLnlhbWwKe3svaGFzRXh0ZXJuYWxEZXBlbmRlbmNpZXN9fQojIENvcHkgRGVwZW5kZW5jaWVzCnt7I3BhdGhEZXBlbmRlbmNpZXN9fUNPUFkge3t7Ln19fSAuL3t7ey59fX0Ke3svcGF0aERlcGVuZGVuY2llc319Cnt7Xmhhc0V4dGVybmFsRGVwZW5kZW5jaWVzfX0KIyBJbnN0YWxsIERlcGVuZGVuY2llcwp7eyNwYXRoRGVwZW5kZW5jaWVzfX1SVU4gZGFydCBwdWIgZ2V0IC1DIHt7ey59fX0Ke3svcGF0aERlcGVuZGVuY2llc319Cnt7L2hhc0V4dGVybmFsRGVwZW5kZW5jaWVzfX0KIyBSZXNvbHZlIGFwcCBkZXBlbmRlbmNpZXMuCkNPUFkgcHVic3BlYy4qIC4vClJVTiBkYXJ0IHB1YiBnZXQKCiMgQ29weSBhcHAgc291cmNlIGNvZGUgYW5kIEFPVCBjb21waWxlIGl0LgpDT1BZIC4gLgojIEVuc3VyZSBwYWNrYWdlcyBhcmUgc3RpbGwgdXAtdG8tZGF0ZSBpZiBhbnl0aGluZyBoYXMgY2hhbmdlZApSVU4gZGFydCBwdWIgZ2V0IC0tb2ZmbGluZQpSVU4gZGFydCBjb21waWxlIGV4ZSBiaW4vc2VydmVyLmRhcnQgLW8gYmluL3NlcnZlcgoKIyBCdWlsZCBtaW5pbWFsIHNlcnZpbmcgaW1hZ2UgZnJvbSBBT1QtY29tcGlsZWQgYC9zZXJ2ZXJgIGFuZCByZXF1aXJlZCBzeXN0ZW0KIyBsaWJyYXJpZXMgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMgc3RvcmVkIGluIGAvcnVudGltZS9gIGZyb20gdGhlIGJ1aWxkIHN0YWdlLgpGUk9NIHNjcmF0Y2gKQ09QWSAtLWZyb209YnVpbGQgL3J1bnRpbWUvIC8KQ09QWSAtLWZyb209YnVpbGQgL2FwcC9iaW4vc2VydmVyIC9hcHAvYmluLwp7eyNzZXJ2ZVN0YXRpY0ZpbGVzfX1DT1BZIC0tZnJvbT1idWlsZCAvYXBwL3B1YmxpYyAvcHVibGljL3t7L3NlcnZlU3RhdGljRmlsZXN9fQoKIyBTdGFydCBzZXJ2ZXIuCkNNRCBbIi9hcHAvYmluL3NlcnZlciJdCg==", + "type": "text" + } + ], + "hooks": [], + "name": "dart_frog_prod_server", + "description": "A dart_frog prod server", + "version": "0.1.0+1", + "environment": {"mason": ">=0.1.0-dev <0.1.0"}, + "vars": { + "dartVersion": { + "type": "string", + "description": "Dart version to be used in the generated Dockerfile.", + "default": "stable", + "prompt": "Dart version?" + } + } +}); diff --git a/packages/dart_frog_gen/lib/src/codegen/codegen.dart b/packages/dart_frog_gen/lib/src/codegen/codegen.dart new file mode 100644 index 000000000..c65b1861a --- /dev/null +++ b/packages/dart_frog_gen/lib/src/codegen/codegen.dart @@ -0,0 +1,9 @@ +import 'package:mason/mason.dart'; + +export 'dev_server_runner/dev_server_runner.dart'; +export 'prod_server_builder/prod_server_builder.dart'; +export 'route_configuration_watcher/route_configuration_watcher.dart'; +export 'dev_server_runner/callbacks.dart'; + +/// A method which returns a [Future] given a [MasonBundle]. +typedef GeneratorBuilder = Future Function(MasonBundle); diff --git a/packages/dart_frog_gen/lib/src/codegen/dev_server_runner/callbacks.dart b/packages/dart_frog_gen/lib/src/codegen/dev_server_runner/callbacks.dart new file mode 100644 index 000000000..291f3e01f --- /dev/null +++ b/packages/dart_frog_gen/lib/src/codegen/dev_server_runner/callbacks.dart @@ -0,0 +1,79 @@ +// ignore_for_file: public_member_api_docs + +import 'dart:io'; + +import 'package:dart_frog_gen/dart_frog_gen.dart'; +import 'package:mason/mason.dart'; + +typedef WillStartDevServerContext = ({ + String? port, +}); + +typedef WillBuildRouteConfigContext = ({ + String? port, + Directory projectDirectory, +}); + +typedef DidBuildRouteConfigContext = ({ + String? port, + Directory projectDirectory, + RouteConfiguration routeConfig, +}); + +typedef DidValidateProjectContext = ({ + String? port, + Directory projectDirectory, + RouteConfiguration routeConfig, + // TODO(renancaraujo): define what are those violations as objects + // (route conflict, rogue route, etc) + // List? projectViolations, +}); + +typedef WillStartCodegenContext = ({ + String? port, + Directory projectDirectory, + // TODO(renancaraujo): this should be available here + // RouteConfiguration routeConfig, +}); + +typedef WillGenerateFileContext = ({ + String filePath, + List contents, + OverwriteRule? overwriteRule, +}); + +typedef DidGenerateFileContext = ({ + GeneratedFile generatedFile, +}); + +typedef DidFinishCodegenContext = ({ + String? port, + Directory projectDirectory, + List generatedFiles, + // TODO(renancaraujo): this should be available here + // RouteConfiguration routeConfig, +}); + +typedef DidStartDevServerContext = ({ + String? port, +}); + +abstract class DevServerCallbacks { + void willStartDevServer(WillStartDevServerContext context); + + void willBuildRouteConfig(WillBuildRouteConfigContext context); + + void didBuildRouteConfig(DidBuildRouteConfigContext context); + + void didValidateProject(DidValidateProjectContext exception); + + void willStartCodegen(WillStartCodegenContext context); + + void willGenerateFile(WillGenerateFileContext context); + + void didGenerateFile(DidGenerateFileContext context); + + void didFinishCodegen(DidFinishCodegenContext context); + + void didStartDevServer(DidStartDevServerContext port); +} diff --git a/packages/dart_frog_cli/lib/src/dev_server_runner/dev_server_runner.dart b/packages/dart_frog_gen/lib/src/codegen/dev_server_runner/dev_server_runner.dart similarity index 87% rename from packages/dart_frog_cli/lib/src/dev_server_runner/dev_server_runner.dart rename to packages/dart_frog_gen/lib/src/codegen/dev_server_runner/dev_server_runner.dart index 1f223ac65..87ff006ef 100644 --- a/packages/dart_frog_cli/lib/src/dev_server_runner/dev_server_runner.dart +++ b/packages/dart_frog_gen/lib/src/codegen/dev_server_runner/dev_server_runner.dart @@ -2,7 +2,11 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io' as io; -import 'package:dart_frog_cli/src/dev_server_runner/restorable_directory_generator_target.dart'; +import 'package:dart_frog_gen/src/codegen/bundles/dart_frog_dev_server_bundle.dart'; +import 'package:dart_frog_gen/src/codegen/codegen.dart'; +import 'package:dart_frog_gen/src/codegen/dev_server_runner/callbacks.dart'; +import 'package:dart_frog_gen/src/codegen/dev_server_runner/pre_gen.dart'; +import 'package:dart_frog_gen/src/codegen/dev_server_runner/restorable_directory_generator_target.dart'; import 'package:mason/mason.dart'; import 'package:meta/meta.dart'; import 'package:path/path.dart' as path; @@ -22,11 +26,6 @@ typedef ProcessRun = Future Function( List arguments, ); -/// Typedef for [DirectoryWatcher.new]. -typedef DirectoryWatcherBuilder = DirectoryWatcher Function( - String directory, -); - /// Regex for detecting warnings in the output of `dart run`. final _warningRegex = RegExp(r'^.*:\d+:\d+: Warning: .*', multiLine: true); @@ -41,9 +40,9 @@ final _dartVmServiceAlreadyInUseErrorRegex = RegExp( typedef DevServerRunnerBuilder = DevServerRunner Function({ required Logger logger, required String port, - required MasonGenerator devServerBundleGenerator, required String dartVmServicePort, required io.Directory workingDirectory, + required DevServerCallbacks callbacks, void Function()? onHotReloadEnabled, }); @@ -65,10 +64,11 @@ class DevServerRunner { DevServerRunner({ required this.logger, required this.port, - required this.devServerBundleGenerator, required this.dartVmServicePort, required this.workingDirectory, + required this.callbacks, this.onHotReloadEnabled, + @visibleForTesting GeneratorBuilder? generator, @visibleForTesting DirectoryWatcherBuilder? directoryWatcher, @visibleForTesting RestorableDirectoryGeneratorTargetBuilder? generatorTarget, @@ -83,6 +83,7 @@ class DevServerRunner { _runProcess = runProcess ?? io.Process.run, _generatorTarget = generatorTarget ?? RestorableDirectoryGeneratorTarget.new, + _generator = generator ?? MasonGenerator.fromBundle, assert(port.isNotEmpty, 'port cannot be empty'), assert( dartVmServicePort.isNotEmpty, @@ -98,8 +99,7 @@ class DevServerRunner { /// Which port number the dart vm service should listen on. final String dartVmServicePort; - /// The [MasonGenerator] used to generate the dev server runtime code. - final MasonGenerator devServerBundleGenerator; + final GeneratorBuilder _generator; /// The working directory of the dart_frog project. final io.Directory workingDirectory; @@ -140,21 +140,60 @@ class DevServerRunner { /// under which the dev server ended. Future get exitCode => _exitCodeCompleter.future; + // ignore: public_member_api_docs + final DevServerCallbacks callbacks; + Future _codegen() async { logger.detail('[codegen] running pre-gen...'); - var vars = {'port': port}; - await devServerBundleGenerator.hooks.preGen( - vars: vars, - workingDirectory: workingDirectory.path, - onVarsChanged: (v) => vars = v, + + final devServerBundleGenerator = await _generator(dartFrogDevServerBundle); + + final vars = await preGen( + port: port, + projectDirectory: workingDirectory, ); logger.detail('[codegen] running generate...'); - final _ = await devServerBundleGenerator.generate( + + callbacks.willStartCodegen(( + port: port, + projectDirectory: workingDirectory, + ),); + + _target + ..willCreateFile = ( + String path, + List contents, { + Logger? logger, + OverwriteRule? overwriteRule, + }) { + callbacks.willGenerateFile(( + contents: contents, + filePath: path, + overwriteRule: overwriteRule, + ),); + } + ..didCreateFile = ( + GeneratedFile generatedFile, + ) { + callbacks.didGenerateFile((generatedFile: generatedFile,)); + }; + + final generatedFiles = await devServerBundleGenerator.generate( _target, vars: vars, fileConflictResolution: FileConflictResolution.overwrite, ); + _target + ..willCreateFile = null + ..didCreateFile = null; + + callbacks.didFinishCodegen(( + port: port, + projectDirectory: workingDirectory, + generatedFiles: generatedFiles, + ),); + logger.detail('[codegen] complete.'); } @@ -228,6 +267,8 @@ class DevServerRunner { ); } + callbacks.willStartDevServer((port: port,)); + Future serve() async { var isHotReloadingEnabled = false; final enableVmServiceFlag = '--enable-vm-service=$dartVmServicePort'; @@ -322,6 +363,8 @@ class DevServerRunner { await _codegen(); await serve(); + callbacks.didStartDevServer((port: port,)); + final localhost = link(uri: Uri.parse('http://localhost:$port')); progress.complete('Running on $localhost'); diff --git a/bricks/dart_frog_dev_server/hooks/pre_gen.dart b/packages/dart_frog_gen/lib/src/codegen/dev_server_runner/pre_gen.dart similarity index 60% rename from bricks/dart_frog_dev_server/hooks/pre_gen.dart rename to packages/dart_frog_gen/lib/src/codegen/dev_server_runner/pre_gen.dart index 778ea4c36..75a84299a 100644 --- a/bricks/dart_frog_dev_server/hooks/pre_gen.dart +++ b/packages/dart_frog_gen/lib/src/codegen/dev_server_runner/pre_gen.dart @@ -1,44 +1,51 @@ +// ignore_for_file: public_member_api_docs, only_throw_errors + import 'dart:async'; import 'dart:io' as io; import 'package:dart_frog_gen/dart_frog_gen.dart'; -import 'package:mason/mason.dart' - show HookContext, defaultForeground, lightCyan; - -import 'src/exit_overrides.dart'; - -typedef RouteConfigurationBuilder = RouteConfiguration Function( - io.Directory directory, -); - -void _defaultExit(int code) => ExitOverrides.current?.exit ?? io.exit; - -Future run(HookContext context) async => preGen(context); +import 'package:dart_frog_gen/src/codegen/dev_server_runner/callbacks.dart'; +import 'package:mason/mason.dart'; -Future preGen( - HookContext context, { +Future> preGen({ + required Logger logger, + required String? port, + required io.Directory projectDirectory, + required DevServerCallbacks callbacks, RouteConfigurationBuilder buildConfiguration = buildRouteConfiguration, - void Function(int exitCode) exit = _defaultExit, }) async { final RouteConfiguration configuration; + callbacks.willBuildRouteConfig( + ( + port: port, + projectDirectory: projectDirectory, + ), + ); try { - configuration = buildConfiguration(io.Directory.current); + configuration = buildConfiguration(projectDirectory); } catch (error) { - context.logger.err('$error'); - return exit(1); + logger.err('$error'); + throw 'opsie'; } + callbacks.didBuildRouteConfig( + ( + port: port, + projectDirectory: projectDirectory, + routeConfig: configuration, + ), + ); reportRouteConflicts( configuration, onViolationStart: () { - context.logger.info(''); + logger.info(''); }, onRouteConflict: ( originalFilePath, conflictingFilePath, conflictingEndpoint, ) { - context.logger.err( + logger.err( '''Route conflict detected. ${lightCyan.wrap(originalFilePath)} and ${lightCyan.wrap(conflictingFilePath)} both resolve to ${lightCyan.wrap(conflictingEndpoint)}.''', ); }, @@ -46,17 +53,25 @@ Future preGen( reportRogueRoutes( configuration, onViolationStart: () { - context.logger.info(''); + logger.info(''); }, onRogueRoute: (filePath, idealPath) { - context.logger.err( + logger.err( '''Rogue route detected.${defaultForeground.wrap(' ')}Rename ${lightCyan.wrap(filePath)} to ${lightCyan.wrap(idealPath)}.''', ); }, ); - context.vars = { - 'port': context.vars['port'] ?? '8080', + callbacks.didValidateProject( + ( + port: port, + projectDirectory: projectDirectory, + routeConfig: configuration, + ), + ); + + return { + 'port': port ?? '8080', 'directories': configuration.directories .map((c) => c.toJson()) .toList() diff --git a/packages/dart_frog_cli/lib/src/dev_server_runner/restorable_directory_generator_target.dart b/packages/dart_frog_gen/lib/src/codegen/dev_server_runner/restorable_directory_generator_target.dart similarity index 82% rename from packages/dart_frog_cli/lib/src/dev_server_runner/restorable_directory_generator_target.dart rename to packages/dart_frog_gen/lib/src/codegen/dev_server_runner/restorable_directory_generator_target.dart index 9a3fa9ce6..ed0371d40 100644 --- a/packages/dart_frog_cli/lib/src/dev_server_runner/restorable_directory_generator_target.dart +++ b/packages/dart_frog_gen/lib/src/codegen/dev_server_runner/restorable_directory_generator_target.dart @@ -2,6 +2,7 @@ import 'dart:collection'; import 'dart:io' as io; import 'package:mason/mason.dart'; +import 'package:meta/meta.dart'; /// Signature for the [DirectoryGeneratorTarget.createFile] method. typedef CreateFile = Future Function( @@ -15,10 +16,21 @@ typedef CreateFile = Future Function( typedef RestorableDirectoryGeneratorTargetBuilder = RestorableDirectoryGeneratorTarget Function( io.Directory dir, { - CreateFile? createFile, Logger? logger, }); +// ignore: public_member_api_docs +typedef WillCreateFile = void Function( + String path, + List contents, { + OverwriteRule? overwriteRule, +}); + +// ignore: public_member_api_docs +typedef DidCreateFile = void Function( + GeneratedFile generatedFile, +); + /// {@template cached_file} /// A cached file which consists of the file path and contents. /// {@endtemplate} @@ -41,8 +53,8 @@ class RestorableDirectoryGeneratorTarget extends DirectoryGeneratorTarget { /// {@macro restorable_directory_generator_target} RestorableDirectoryGeneratorTarget( super.dir, { - CreateFile? createFile, Logger? logger, + @visibleForTesting CreateFile? createFile, }) : _cachedSnapshots = Queue(), _createFile = createFile, _logger = logger; @@ -51,6 +63,11 @@ class RestorableDirectoryGeneratorTarget extends DirectoryGeneratorTarget { final Logger? _logger; final Queue _cachedSnapshots; + // ignore: public_member_api_docs + WillCreateFile? willCreateFile; + // ignore: public_member_api_docs + DidCreateFile? didCreateFile; + CachedFile? get _cachedSnapshot { return _cachedSnapshots.isNotEmpty ? _cachedSnapshots.last : null; } @@ -100,13 +117,16 @@ class RestorableDirectoryGeneratorTarget extends DirectoryGeneratorTarget { List contents, { Logger? logger, OverwriteRule? overwriteRule, - }) { + }) async { _latestSnapshot = CachedFile(path: path, contents: contents); - return (_createFile ?? super.createFile)( + willCreateFile?.call(path, contents, overwriteRule: overwriteRule); + final result = await (_createFile ?? super.createFile)( path, contents, logger: logger, overwriteRule: overwriteRule, ); + didCreateFile?.call(result); + return result; } } diff --git a/bricks/dart_frog_prod_server/hooks/src/create_bundle.dart b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/create_bundle.dart similarity index 84% rename from bricks/dart_frog_prod_server/hooks/src/create_bundle.dart rename to packages/dart_frog_gen/lib/src/codegen/prod_server_builder/create_bundle.dart index 50b0bab17..6f22fcb7f 100644 --- a/bricks/dart_frog_prod_server/hooks/src/create_bundle.dart +++ b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/create_bundle.dart @@ -1,3 +1,5 @@ +// ignore_for_file: public_member_api_docs, only_throw_errors + import 'dart:io' as io; import 'package:io/io.dart' show copyPath; @@ -5,15 +7,14 @@ import 'package:mason/mason.dart'; import 'package:path/path.dart' as path; Future createBundle( - HookContext context, + Logger logger, io.Directory projectDirectory, - void Function(int exitCode) exit, ) async { final buildDirectoryPath = path.join(projectDirectory.path, 'build'); final buildDirectory = io.Directory(buildDirectoryPath); final dartFrogDirectoryPath = path.join(projectDirectory.path, '.dart_frog'); final dartFrogDirectory = io.Directory(dartFrogDirectoryPath); - final bundlingProgress = context.logger.progress('Bundling sources'); + final bundlingProgress = logger.progress('Bundling sources'); final tempDirectory = await io.Directory.systemTemp.createTemp(); if (buildDirectory.existsSync()) { @@ -32,8 +33,8 @@ Future createBundle( bundlingProgress.complete(); } catch (error) { bundlingProgress.fail(); - context.logger.err('$error'); - return exit(1); + logger.err('$error'); + throw 'oppsie'; } await copyPath(tempDirectory.path, buildDirectory.path); } diff --git a/bricks/dart_frog_prod_server/hooks/src/create_external_packages_folder.dart b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/create_external_packages_folder.dart similarity index 94% rename from bricks/dart_frog_prod_server/hooks/src/create_external_packages_folder.dart rename to packages/dart_frog_gen/lib/src/codegen/prod_server_builder/create_external_packages_folder.dart index c29c392b6..b27685e51 100644 --- a/bricks/dart_frog_prod_server/hooks/src/create_external_packages_folder.dart +++ b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/create_external_packages_folder.dart @@ -1,10 +1,11 @@ +// ignore_for_file: public_member_api_docs + import 'dart:io'; +import 'package:dart_frog_gen/src/codegen/prod_server_builder/get_pubspec_lock.dart'; import 'package:io/io.dart' as io; import 'package:path/path.dart' as path; -import 'get_pubspec_lock.dart'; - Future> createExternalPackagesFolder( Directory directory, { path.Context? pathContext, diff --git a/bricks/dart_frog_prod_server/hooks/src/get_internal_path_dependencies.dart b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/get_internal_path_dependencies.dart similarity index 80% rename from bricks/dart_frog_prod_server/hooks/src/get_internal_path_dependencies.dart rename to packages/dart_frog_gen/lib/src/codegen/prod_server_builder/get_internal_path_dependencies.dart index d26d4ca04..860d5c716 100644 --- a/bricks/dart_frog_prod_server/hooks/src/get_internal_path_dependencies.dart +++ b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/get_internal_path_dependencies.dart @@ -1,9 +1,10 @@ +// ignore_for_file: public_member_api_docs + import 'dart:io' as io; +import 'package:dart_frog_gen/src/codegen/prod_server_builder/get_pubspec_lock.dart'; import 'package:path/path.dart' as path; -import 'get_pubspec_lock.dart'; - Future> getInternalPathDependencies(io.Directory directory) async { final pubspecLock = await getPubspecLock(directory.path); return pubspecLock.packages diff --git a/bricks/dart_frog_prod_server/hooks/src/get_pubspec_lock.dart b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/get_pubspec_lock.dart similarity index 92% rename from bricks/dart_frog_prod_server/hooks/src/get_pubspec_lock.dart rename to packages/dart_frog_gen/lib/src/codegen/prod_server_builder/get_pubspec_lock.dart index 6ecc64255..ac2d1e72a 100644 --- a/bricks/dart_frog_prod_server/hooks/src/get_pubspec_lock.dart +++ b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/get_pubspec_lock.dart @@ -1,3 +1,5 @@ +// ignore_for_file: public_member_api_docs + import 'dart:io'; import 'package:path/path.dart' as path; diff --git a/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/post_gen.dart b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/post_gen.dart new file mode 100644 index 000000000..a86c44feb --- /dev/null +++ b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/post_gen.dart @@ -0,0 +1,67 @@ +// ignore_for_file: only_throw_errors, public_member_api_docs + +import 'dart:async'; +import 'dart:io' as io; + +import 'package:mason/mason.dart' show Logger, lightCyan; +import 'package:path/path.dart' as path; + +// topo(renancaraujo): move this to the cli +typedef ProcessRunner = Future Function( + String executable, + List arguments, { + String workingDirectory, + bool runInShell, +}); + +// topo(renancaraujo): move this to the cli +Future _dartPubGet({ + required Logger logger, + required String workingDirectory, + required ProcessRunner runProcess, +}) async { + final progress = logger.progress('Installing dependencies'); + try { + final result = await runProcess( + 'dart', + ['pub', 'get'], + workingDirectory: workingDirectory, + runInShell: true, + ); + progress.complete(); + + if (result.exitCode != 0) { + logger.err('${result.stderr}'); + throw 'oopsie'; + } + } on io.ProcessException catch (error) { + logger.err(error.message); + throw 'oopsie'; + } +} + +Future postGen({ + required Logger logger, + required io.Directory workingDirectory, + ProcessRunner runProcess = io.Process.run, +}) async { + final buildDirectoryPath = path.join(workingDirectory.path, 'build'); + + await _dartPubGet( + logger: logger, + workingDirectory: buildDirectoryPath, + runProcess: runProcess, + ); + + // TODO(renancaraujo): all of this could be in the CLI + final relativeBuildPath = path.relative(buildDirectoryPath); + logger + ..info('') + ..success('Created a production build!') + ..info('') + ..info('Start the production server by running:') + ..info('') + ..info( + '''${lightCyan.wrap('dart ${path.join(relativeBuildPath, 'bin', 'server.dart')}')}''', + ); +} diff --git a/bricks/dart_frog_prod_server/hooks/pre_gen.dart b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/pre_gen.dart similarity index 60% rename from bricks/dart_frog_prod_server/hooks/pre_gen.dart rename to packages/dart_frog_gen/lib/src/codegen/prod_server_builder/pre_gen.dart index 5d3f2ae5c..48a106d93 100644 --- a/bricks/dart_frog_prod_server/hooks/pre_gen.dart +++ b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/pre_gen.dart @@ -1,52 +1,72 @@ +// ignore_for_file: only_throw_errors, public_member_api_docs + import 'dart:async'; import 'dart:io' as io; import 'package:dart_frog_gen/dart_frog_gen.dart'; +import 'package:dart_frog_gen/src/codegen/prod_server_builder/create_bundle.dart'; +import 'package:dart_frog_gen/src/codegen/prod_server_builder/create_external_packages_folder.dart'; +import 'package:dart_frog_gen/src/codegen/prod_server_builder/get_internal_path_dependencies.dart'; import 'package:io/io.dart' as io_expanded; -import 'package:mason/mason.dart' - show HookContext, defaultForeground, lightCyan; +import 'package:mason/mason.dart' show Logger, defaultForeground, lightCyan; import 'package:path/path.dart' as path; -import 'src/create_bundle.dart'; -import 'src/create_external_packages_folder.dart'; -import 'src/dart_pub_get.dart'; -import 'src/exit_overrides.dart'; -import 'src/get_internal_path_dependencies.dart'; - -typedef RouteConfigurationBuilder = RouteConfiguration Function( - io.Directory directory, -); - -void _defaultExit(int code) => ExitOverrides.current?.exit ?? io.exit; - -Future run(HookContext context) => preGen(context); +typedef ProcessRunner = Future Function( + String executable, + List arguments, { + String workingDirectory, + bool runInShell, +}); + +// topo(renancaraujo): move this to the cli +Future _dartPubGet({ + required Logger logger, + required String workingDirectory, + required ProcessRunner runProcess, +}) async { + final progress = logger.progress('Installing dependencies'); + try { + final result = await runProcess( + 'dart', + ['pub', 'get'], + workingDirectory: workingDirectory, + runInShell: true, + ); + progress.complete(); + + if (result.exitCode != 0) { + logger.err('${result.stderr}'); + throw 'oopsie'; + } + } on io.ProcessException catch (error) { + logger.err(error.message); + throw 'oopsie'; + } +} -Future preGen( - HookContext context, { - io.Directory? directory, +Future> preGen({ + required Logger logger, + required String? dartVersion, + required io.Directory projectDirectory, ProcessRunner runProcess = io.Process.run, RouteConfigurationBuilder buildConfiguration = buildRouteConfiguration, - void Function(int exitCode) exit = _defaultExit, Future Function(String from, String to) copyPath = io_expanded.copyPath, }) async { - final projectDirectory = directory ?? io.Directory.current; - // We need to make sure that the pubspec.lock file is up to date - await dartPubGet( - context, + await _dartPubGet( + logger: logger, workingDirectory: projectDirectory.path, runProcess: runProcess, - exit: exit, ); - await createBundle(context, projectDirectory, exit); + await createBundle(logger, projectDirectory); final RouteConfiguration configuration; try { configuration = buildConfiguration(projectDirectory); } catch (error) { - context.logger.err('$error'); - return exit(1); + logger.err('$error'); + throw 'oopsie'; } reportRouteConflicts( @@ -56,24 +76,24 @@ Future preGen( conflictingFilePath, conflictingEndpoint, ) { - context.logger.err( + logger.err( '''Route conflict detected. ${lightCyan.wrap(originalFilePath)} and ${lightCyan.wrap(conflictingFilePath)} both resolve to ${lightCyan.wrap(conflictingEndpoint)}.''', ); }, onViolationEnd: () { - exit(1); + throw 'oopsie doopsie'; }, ); reportRogueRoutes( configuration, onRogueRoute: (filePath, idealPath) { - context.logger.err( + logger.err( '''Rogue route detected.${defaultForeground.wrap(' ')}Rename ${lightCyan.wrap(filePath)} to ${lightCyan.wrap(idealPath)}.''', ); }, onViolationEnd: () { - exit(1); + throw 'oopsie doopsie'; }, ); @@ -92,7 +112,7 @@ Future preGen( final addDockerfile = !customDockerFile.existsSync(); - context.vars = { + return { 'directories': configuration.directories .map((c) => c.toJson()) .toList() @@ -109,7 +129,7 @@ Future preGen( 'pathDependencies': internalPathDependencies, 'hasExternalDependencies': externalDependencies.isNotEmpty, 'externalPathDependencies': externalDependencies, - 'dartVersion': context.vars['dartVersion'], + 'dartVersion': dartVersion, 'addDockerfile': addDockerfile, }; } diff --git a/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/prod_server_builder.dart b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/prod_server_builder.dart new file mode 100644 index 000000000..e33cf4e64 --- /dev/null +++ b/packages/dart_frog_gen/lib/src/codegen/prod_server_builder/prod_server_builder.dart @@ -0,0 +1,56 @@ +// ignore_for_file: public_member_api_docs + +import 'dart:io' as io; + +import 'package:dart_frog_gen/dart_frog_gen.dart'; +import 'package:dart_frog_gen/src/codegen/bundles/dart_frog_prod_server_bundle.dart'; +import 'package:dart_frog_gen/src/codegen/prod_server_builder/post_gen.dart'; +import 'package:dart_frog_gen/src/codegen/prod_server_builder/pre_gen.dart'; +import 'package:mason/mason.dart'; +import 'package:meta/meta.dart'; + +class ProdServerBuilder { + ProdServerBuilder({ + required this.dartVersion, + required this.logger, + required this.workingDirectory, + @visibleForTesting GeneratorBuilder? generator, + }) : _generator = generator ?? MasonGenerator.fromBundle; + + final String dartVersion; + + /// The working directory of the dart_frog project. + final io.Directory workingDirectory; + + final GeneratorBuilder _generator; + + /// [Logger] instance used to wrap stdout. + final Logger logger; + + Future build() async { + final buildBundleGenerator = await _generator(dartFrogProdServerBundle); + + logger.detail('[codegen] running pre-gen...'); + final vars = await preGen( + projectDirectory: workingDirectory, + logger: logger, + dartVersion: dartVersion, + ); + + logger.detail('[codegen] running generate...'); + final _ = await buildBundleGenerator.generate( + DirectoryGeneratorTarget(workingDirectory), + vars: vars, + fileConflictResolution: FileConflictResolution.overwrite, + ); + + logger.detail('[codegen] running post-gen...'); + await postGen( + logger: logger, + workingDirectory: workingDirectory, + ); + + logger.detail('[codegen] complete.'); + return ExitCode.success; + } +} diff --git a/packages/dart_frog_cli/lib/src/route_configuration_watcher/route_configuration_watcher.dart b/packages/dart_frog_gen/lib/src/codegen/route_configuration_watcher/route_configuration_watcher.dart similarity index 100% rename from packages/dart_frog_cli/lib/src/route_configuration_watcher/route_configuration_watcher.dart rename to packages/dart_frog_gen/lib/src/codegen/route_configuration_watcher/route_configuration_watcher.dart diff --git a/packages/dart_frog_gen/lib/src/plugin/plugin.dart b/packages/dart_frog_gen/lib/src/plugin/plugin.dart new file mode 100644 index 000000000..81ab11b56 --- /dev/null +++ b/packages/dart_frog_gen/lib/src/plugin/plugin.dart @@ -0,0 +1,43 @@ +// ignore_for_file: public_member_api_docs + +import 'package:dart_frog_gen/src/codegen/dev_server_runner/callbacks.dart'; +export 'package:dart_frog_gen/src/codegen/dev_server_runner/callbacks.dart' + hide DevServerCallbacks; + +// ignore: one_member_abstracts +abstract class DartFrogPluginContext { + void registerDevserverPlugin(DartFrogDevserverPlugin plugin); +} + +class DartFrogDevserverPlugin extends DevServerCallbacks { + @override + void didBuildRouteConfig(DidBuildRouteConfigContext context) {} + + @override + void didFinishCodegen(DidFinishCodegenContext context) {} + + @override + void didGenerateFile(DidGenerateFileContext context) {} + + @override + void didStartDevServer(DidStartDevServerContext port) {} + + @override + void didValidateProject(DidValidateProjectContext exception) {} + + @override + void willBuildRouteConfig(WillBuildRouteConfigContext context) {} + + @override + void willGenerateFile(WillGenerateFileContext context) {} + + @override + void willStartCodegen(WillStartCodegenContext context) {} + + @override + void willStartDevServer(WillStartDevServerContext context) {} +} + +// + + diff --git a/packages/dart_frog_gen/lib/src/build_route_configuration.dart b/packages/dart_frog_gen/lib/src/route_configuration/build_route_configuration.dart similarity index 99% rename from packages/dart_frog_gen/lib/src/build_route_configuration.dart rename to packages/dart_frog_gen/lib/src/route_configuration/build_route_configuration.dart index 9d5827bcc..be478d533 100644 --- a/packages/dart_frog_gen/lib/src/build_route_configuration.dart +++ b/packages/dart_frog_gen/lib/src/route_configuration/build_route_configuration.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:dart_frog_gen/src/path_to_route.dart'; +import 'package:dart_frog_gen/src/route_configuration/path_to_route.dart'; import 'package:path/path.dart' as path; /// Build a [RouteConfiguration] based on the provided root project [directory]. diff --git a/packages/dart_frog_gen/lib/src/path_to_route.dart b/packages/dart_frog_gen/lib/src/route_configuration/path_to_route.dart similarity index 100% rename from packages/dart_frog_gen/lib/src/path_to_route.dart rename to packages/dart_frog_gen/lib/src/route_configuration/path_to_route.dart diff --git a/packages/dart_frog_gen/lib/src/route_configuration/route_configuration.dart b/packages/dart_frog_gen/lib/src/route_configuration/route_configuration.dart new file mode 100644 index 000000000..322853a04 --- /dev/null +++ b/packages/dart_frog_gen/lib/src/route_configuration/route_configuration.dart @@ -0,0 +1,2 @@ +export 'build_route_configuration.dart'; +export 'validate_route_configuration/validate_route_configuration.dart'; diff --git a/packages/dart_frog_gen/lib/src/validate_route_configuration/rogue_routes.dart b/packages/dart_frog_gen/lib/src/route_configuration/validate_route_configuration/rogue_routes.dart similarity index 100% rename from packages/dart_frog_gen/lib/src/validate_route_configuration/rogue_routes.dart rename to packages/dart_frog_gen/lib/src/route_configuration/validate_route_configuration/rogue_routes.dart diff --git a/packages/dart_frog_gen/lib/src/validate_route_configuration/route_conflicts.dart b/packages/dart_frog_gen/lib/src/route_configuration/validate_route_configuration/route_conflicts.dart similarity index 100% rename from packages/dart_frog_gen/lib/src/validate_route_configuration/route_conflicts.dart rename to packages/dart_frog_gen/lib/src/route_configuration/validate_route_configuration/route_conflicts.dart diff --git a/packages/dart_frog_gen/lib/src/validate_route_configuration/validate_route_configuration.dart b/packages/dart_frog_gen/lib/src/route_configuration/validate_route_configuration/validate_route_configuration.dart similarity index 100% rename from packages/dart_frog_gen/lib/src/validate_route_configuration/validate_route_configuration.dart rename to packages/dart_frog_gen/lib/src/route_configuration/validate_route_configuration/validate_route_configuration.dart diff --git a/packages/dart_frog_cli/lib/src/runtime_compatibility.dart b/packages/dart_frog_gen/lib/src/runtime_compatibility/runtime_compatibility.dart similarity index 100% rename from packages/dart_frog_cli/lib/src/runtime_compatibility.dart rename to packages/dart_frog_gen/lib/src/runtime_compatibility/runtime_compatibility.dart diff --git a/packages/dart_frog_gen/pubspec.yaml b/packages/dart_frog_gen/pubspec.yaml index 6c7795f24..e58670976 100644 --- a/packages/dart_frog_gen/pubspec.yaml +++ b/packages/dart_frog_gen/pubspec.yaml @@ -12,8 +12,15 @@ environment: dependencies: equatable: ^2.0.5 + io: ^1.0.4 + mason: ^0.1.0-dev.51 + meta: ^1.10.0 path: ^1.8.1 + pubspec_lock: ^3.0.2 pubspec_parse: ^1.2.2 + stream_transform: ^2.1.0 + uuid: ^4.1.0 + watcher: ^1.1.0 dev_dependencies: mocktail: ^1.0.0 diff --git a/packages/dart_frog_gen/test/src/build_route_configuration_test.dart b/packages/dart_frog_gen/test/src/build_route_configuration_test.dart index b445d15bc..2612b508b 100644 --- a/packages/dart_frog_gen/test/src/build_route_configuration_test.dart +++ b/packages/dart_frog_gen/test/src/build_route_configuration_test.dart @@ -2,7 +2,7 @@ import 'dart:io'; -import 'package:dart_frog_gen/src/build_route_configuration.dart'; +import 'package:dart_frog_gen/src/route_config/build_route_configuration.dart'; import 'package:path/path.dart' as path; import 'package:test/test.dart'; diff --git a/packages/dart_frog_gen/test/src/middleware_file_test.dart b/packages/dart_frog_gen/test/src/middleware_file_test.dart index 294908d58..4ba4356f6 100644 --- a/packages/dart_frog_gen/test/src/middleware_file_test.dart +++ b/packages/dart_frog_gen/test/src/middleware_file_test.dart @@ -1,6 +1,6 @@ // ignore_for_file: prefer_const_constructors -import 'package:dart_frog_gen/dart_frog_gen.dart'; +import 'package:dart_frog_gen/route_configuration.dart'; import 'package:test/test.dart'; void main() { diff --git a/packages/dart_frog_gen/test/src/path_to_route_test.dart b/packages/dart_frog_gen/test/src/path_to_route_test.dart index d2304b16a..4d894200d 100644 --- a/packages/dart_frog_gen/test/src/path_to_route_test.dart +++ b/packages/dart_frog_gen/test/src/path_to_route_test.dart @@ -1,4 +1,4 @@ -import 'package:dart_frog_gen/src/path_to_route.dart'; +import 'package:dart_frog_gen/src/route_configuration/path_to_route.dart'; import 'package:test/test.dart'; void main() { diff --git a/packages/dart_frog_gen/test/src/route_directory_test.dart b/packages/dart_frog_gen/test/src/route_directory_test.dart index 5e39d1bf5..656ed685c 100644 --- a/packages/dart_frog_gen/test/src/route_directory_test.dart +++ b/packages/dart_frog_gen/test/src/route_directory_test.dart @@ -1,6 +1,6 @@ // ignore_for_file: prefer_const_constructors -import 'package:dart_frog_gen/dart_frog_gen.dart'; +import 'package:dart_frog_gen/route_configuration.dart'; import 'package:test/test.dart'; void main() { diff --git a/packages/dart_frog_gen/test/src/route_file_test.dart b/packages/dart_frog_gen/test/src/route_file_test.dart index 099af8f5a..34e58992f 100644 --- a/packages/dart_frog_gen/test/src/route_file_test.dart +++ b/packages/dart_frog_gen/test/src/route_file_test.dart @@ -1,6 +1,6 @@ // ignore_for_file: prefer_const_constructors -import 'package:dart_frog_gen/dart_frog_gen.dart'; +import 'package:dart_frog_gen/route_configuration.dart'; import 'package:test/test.dart'; void main() { diff --git a/packages/dart_frog_gen/test/src/validate_route_configuration/rogue_routes_test.dart b/packages/dart_frog_gen/test/src/validate_route_configuration/rogue_routes_test.dart index 476e463b7..12bc72b3f 100644 --- a/packages/dart_frog_gen/test/src/validate_route_configuration/rogue_routes_test.dart +++ b/packages/dart_frog_gen/test/src/validate_route_configuration/rogue_routes_test.dart @@ -1,4 +1,4 @@ -import 'package:dart_frog_gen/dart_frog_gen.dart'; +import 'package:dart_frog_gen/route_configuration.dart'; import 'package:mocktail/mocktail.dart'; import 'package:path/path.dart' as p; import 'package:test/test.dart'; diff --git a/packages/dart_frog_gen/test/src/validate_route_configuration/route_conflicts_test.dart b/packages/dart_frog_gen/test/src/validate_route_configuration/route_conflicts_test.dart index 5b4df67d8..e63422158 100644 --- a/packages/dart_frog_gen/test/src/validate_route_configuration/route_conflicts_test.dart +++ b/packages/dart_frog_gen/test/src/validate_route_configuration/route_conflicts_test.dart @@ -1,4 +1,4 @@ -import 'package:dart_frog_gen/dart_frog_gen.dart'; +import 'package:dart_frog_gen/route_configuration.dart'; import 'package:mocktail/mocktail.dart'; import 'package:path/path.dart' as path; diff --git a/tool/generate_bundles_gen.sh b/tool/generate_bundles_gen.sh new file mode 100755 index 000000000..5e3589426 --- /dev/null +++ b/tool/generate_bundles_gen.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# Runs `mason bundle` to generate bundles for all bricks within the top level bricks directory. + +# Development Dart Frog Server Brick +mason bundle -s path bricks_gen/dart_frog_dev_server -t dart -o packages/dart_frog_gen/lib/src/codegen/bundles/ + +# Production Dart Frog Server Brick +mason bundle -s path bricks_gen/dart_frog_prod_server -t dart -o packages/dart_frog_gen/lib/src/codegen/bundles/ + +dart format ./packages/dart_frog_gen/lib/src/codegen/bundles/*.dart \ No newline at end of file