anchor.diff:  // found in the LICENSE file.
   
   import 'dart:async';
  -import 'dart:io' show Platform;
  +import 'dart:io' show Directory, Platform;
   
   import 'package:args/command_runner.dart';
   import 'package:path/path.dart' as path;
  
positive.code:   @override
    bool get isSafeToInterrupt => false;
  
    /// Whether or not to build CanvasKit.
    final bool buildCanvasKit;
  
    @override
    Future<ProcessManager> createProcess() {
      print('Running gn...');
      Future<ProcessManager> gnProcess = startProcess(
        path.join(environment.flutterDirectory.path, 'tools', 'gn'),
        <String>[
          '--unopt',
          if (Platform.isMacOS) '--xcode-symlinks',
          '--full-dart-sdk',
        ],
      );
      if (buildCanvasKit) {
        gnProcess = gnProcess.then((_) {
          return startProcess(
            path.join(environment.flutterDirectory.path, 'tools', 'gn'),
            <String>[
              '--wasm',
            ],
          );
        });
      }
      return gnProcess;
    }
  }
  
  
negative.code: /// Not safe to interrupt as it may leave the `out/` directory in a corrupted
  /// state. GN is pretty quick though, so it's OK to not support interruption.
  class GnPipelineStep extends ProcessStep {
    GnPipelineStep({this.target = 'engine'})
        : assert(target == 'engine' || target == 'sdk');
  
    @override
    String get description => 'gn';
  