>>> (indent 4)
    return doughnutFryer.start()
        .then((_) => _frostingGlazer.start())
        .then((_) =>
            Future.wait([
              _conveyorBelts.start(),
              sprinkleSprinkler.start(),
              sauceDripper.start()]))
        .catchError(cannotGetConveyorBeltRunning)
        .then((_) => tellEveryoneDonutsAreJustAboutDone())
        .then((_) =>
            Future.wait([
              croissantFactory.start(),
              _giantBakingOvens.start(),
              butterbutterer.start()])
            .catchError(_handleBakingFailures)
            .timeout(scriptLoadingTimeout, onTimeout: _handleBakingFailures)
            .catchError(cannotGetConveyorBeltRunning))
        .catchError(cannotGetConveyorBeltRunning)
        .then((_) {
          _logger.info("Let's eat!");
        });
<<<
    return doughnutFryer
        .start()
        .then((_) => _frostingGlazer.start())
        .then(
            (_) => Future.wait([
                  _conveyorBelts.start(),
                  sprinkleSprinkler.start(),
                  sauceDripper.start()
                ]))
        .catchError(cannotGetConveyorBeltRunning)
        .then((_) => tellEveryoneDonutsAreJustAboutDone())
        .then(
            (_) => Future.wait([
                  croissantFactory.start(),
                  _giantBakingOvens.start(),
                  butterbutterer.start()
                ])
                    .catchError(_handleBakingFailures)
                    .timeout(scriptLoadingTimeout,
                        onTimeout: _handleBakingFailures)
                    .catchError(cannotGetConveyorBeltRunning))
        .catchError(cannotGetConveyorBeltRunning)
        .then((_) {
      _logger.info("Let's eat!");
    });
>>> (indent 22)
                      someVeryLongFutureWithManyChars().then((foo) {
                        doAThing();
                      }).catchError((e) {
                        doAnotherThing;
                      }, test: someTestWithSoManyConditions(e) && itHasToWrap(e));
<<<
                      someVeryLongFutureWithManyChars().then((foo) {
                        doAThing();
                      }).catchError((e) {
                        doAnotherThing;
                      },
                          test: someTestWithSoManyConditions(e) &&
                              itHasToWrap(e));