library;
import self as self;
import "dart:core" as core;

class DeltaBlue extends core::Object {
  synthetic constructor •() → self::DeltaBlue*
    : super core::Object::•()
    ;
  method run() → void {
    self::chainTest(100);
    self::projectionTest(100);
  }
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Strength extends core::Object /*hasConstConstructor*/  {
  final field core::int* value;
  final field core::String* name;
  const constructor •(core::int* value, core::String* name) → self::Strength*
    : self::Strength::value = value, self::Strength::name = name, super core::Object::•()
    ;
  method nextWeaker() → self::Strength*
    return (#C19).{core::List::[]}(this.{self::Strength::value}{core::int*}){(core::int*) →* self::Strength*};
  static method stronger(self::Strength* s1, self::Strength* s2) → core::bool* {
    return s1.{self::Strength::value}{core::int*}.{core::num::<}(s2.{self::Strength::value}{core::int*}){(core::num*) →* core::bool*};
  }
  static method weaker(self::Strength* s1, self::Strength* s2) → core::bool* {
    return s1.{self::Strength::value}{core::int*}.{core::num::>}(s2.{self::Strength::value}{core::int*}){(core::num*) →* core::bool*};
  }
  static method weakest(self::Strength* s1, self::Strength* s2) → self::Strength* {
    return self::Strength::weaker(s1, s2) ?{self::Strength*} s1 : s2;
  }
  static method strongest(self::Strength* s1, self::Strength* s2) → self::Strength* {
    return self::Strength::stronger(s1, s2) ?{self::Strength*} s1 : s2;
  }
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
abstract class Constraint extends core::Object /*hasConstConstructor*/  {
  final field self::Strength* strength;
  const constructor •(self::Strength* strength) → self::Constraint*
    : self::Constraint::strength = strength, super core::Object::•()
    ;
  abstract method isSatisfied() → core::bool*;
  abstract method markUnsatisfied() → void;
  abstract method addToGraph() → void;
  abstract method removeFromGraph() → void;
  abstract method chooseMethod(core::int* mark) → void;
  abstract method markInputs(core::int* mark) → void;
  abstract method inputsKnown(core::int* mark) → core::bool*;
  abstract method output() → self::Variable*;
  abstract method execute() → void;
  abstract method recalculate() → void;
  method addConstraint() → void {
    this.{self::Constraint::addToGraph}(){() →* void};
    self::planner.{self::Planner::incrementalAdd}(this){(self::Constraint*) →* void};
  }
  method satisfy(dynamic mark) → self::Constraint* {
    this.{self::Constraint::chooseMethod}(mark as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
    if(!this.{self::Constraint::isSatisfied}(){() →* core::bool*}) {
      if(this.{self::Constraint::strength}{self::Strength*} =={self::Strength::==}{(dynamic) →* core::bool*} (#C22)) {
        core::print("Could not satisfy a required constraint!");
      }
      return null;
    }
    this.{self::Constraint::markInputs}(mark as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
    self::Variable* out = this.{self::Constraint::output}(){() →* self::Variable*};
    self::Constraint* overridden = out.{self::Variable::determinedBy}{self::Constraint*};
    if(!(overridden == null))
      overridden.{self::Constraint::markUnsatisfied}(){() →* void};
    out.{self::Variable::determinedBy} = this;
    if(!self::planner.{self::Planner::addPropagate}(this, mark as{TypeError,ForDynamic} core::int*){(self::Constraint*, core::int*) →* core::bool*})
      core::print("Cycle encountered");
    out.{self::Variable::mark} = mark as{TypeError,ForDynamic} core::int*;
    return overridden;
  }
  method destroyConstraint() → void {
    if(this.{self::Constraint::isSatisfied}(){() →* core::bool*})
      self::planner.{self::Planner::incrementalRemove}(this){(self::Constraint*) →* void};
    this.{self::Constraint::removeFromGraph}(){() →* void};
  }
  method isInput() → core::bool*
    return false;
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
abstract class UnaryConstraint extends self::Constraint {
  final field self::Variable* myOutput;
  field core::bool* satisfied = false;
  constructor •(self::Variable* myOutput, self::Strength* strength) → self::UnaryConstraint*
    : self::UnaryConstraint::myOutput = myOutput, super self::Constraint::•(strength) {
    this.{self::Constraint::addConstraint}(){() →* void};
  }
  method addToGraph() → void {
    this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::addConstraint}(this){(self::Constraint*) →* void};
    this.{self::UnaryConstraint::satisfied} = false;
  }
  method chooseMethod(core::int* mark) → void {
    this.{self::UnaryConstraint::satisfied} = !(this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) && self::Strength::stronger(this.{self::Constraint::strength}{self::Strength*}, this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*});
  }
  method isSatisfied() → core::bool*
    return this.{self::UnaryConstraint::satisfied}{core::bool*};
  method markInputs(core::int* mark) → void {}
  method output() → self::Variable*
    return this.{self::UnaryConstraint::myOutput}{self::Variable*};
  method recalculate() → void {
    this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::walkStrength} = this.{self::Constraint::strength}{self::Strength*};
    this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::stay} = !this.{self::Constraint::isInput}(){() →* core::bool*};
    if(this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::stay}{core::bool*})
      this.{self::Constraint::execute}(){() →* void};
  }
  method markUnsatisfied() → void {
    this.{self::UnaryConstraint::satisfied} = false;
  }
  method inputsKnown(core::int* mark) → core::bool*
    return true;
  method removeFromGraph() → void {
    if(!(this.{self::UnaryConstraint::myOutput}{self::Variable*} == null))
      this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::removeConstraint}(this){(self::Constraint*) →* void};
    this.{self::UnaryConstraint::satisfied} = false;
  }
}
class StayConstraint extends self::UnaryConstraint {
  constructor •(self::Variable* v, self::Strength* str) → self::StayConstraint*
    : super self::UnaryConstraint::•(v, str)
    ;
  method execute() → void {}
}
class EditConstraint extends self::UnaryConstraint {
  constructor •(self::Variable* v, self::Strength* str) → self::EditConstraint*
    : super self::UnaryConstraint::•(v, str)
    ;
  method isInput() → core::bool*
    return true;
  method execute() → void {}
}
abstract class BinaryConstraint extends self::Constraint {
  field self::Variable* v1;
  field self::Variable* v2;
  field core::int* direction = #C1;
  constructor •(self::Variable* v1, self::Variable* v2, self::Strength* strength) → self::BinaryConstraint*
    : self::BinaryConstraint::v1 = v1, self::BinaryConstraint::v2 = v2, super self::Constraint::•(strength) {
    this.{self::Constraint::addConstraint}(){() →* void};
  }
  method chooseMethod(core::int* mark) → void {
    if(this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) {
      this.{self::BinaryConstraint::direction} = !(this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) && self::Strength::stronger(this.{self::Constraint::strength}{self::Strength*}, this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*}) ?{core::int*} #C4 : #C1;
    }
    if(this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) {
      this.{self::BinaryConstraint::direction} = !(this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) && self::Strength::stronger(this.{self::Constraint::strength}{self::Strength*}, this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*}) ?{core::int*} #C20 : #C1;
    }
    if(self::Strength::weaker(this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*}, this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*})) {
      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}{self::Strength*}, this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*}) ?{core::int*} #C20 : #C1;
    }
    else {
      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}{self::Strength*}, this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*}) ?{core::int*} #C4 : #C20;
    }
  }
  method addToGraph() → void {
    this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::addConstraint}(this){(self::Constraint*) →* void};
    this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::addConstraint}(this){(self::Constraint*) →* void};
    this.{self::BinaryConstraint::direction} = #C1;
  }
  method isSatisfied() → core::bool*
    return !(this.{self::BinaryConstraint::direction}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} (#C1));
  method markInputs(core::int* mark) → void {
    this.{self::BinaryConstraint::input}(){() →* self::Variable*}.{self::Variable::mark} = mark;
  }
  method input() → self::Variable*
    return this.{self::BinaryConstraint::direction}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} (#C4) ?{self::Variable*} this.{self::BinaryConstraint::v1}{self::Variable*} : this.{self::BinaryConstraint::v2}{self::Variable*};
  method output() → self::Variable*
    return this.{self::BinaryConstraint::direction}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} (#C4) ?{self::Variable*} this.{self::BinaryConstraint::v2}{self::Variable*} : this.{self::BinaryConstraint::v1}{self::Variable*};
  method recalculate() → void {
    self::Variable* ihn = this.{self::BinaryConstraint::input}(){() →* self::Variable*};
    self::Variable* out = this.{self::BinaryConstraint::output}(){() →* self::Variable*};
    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}{self::Strength*}, ihn.{self::Variable::walkStrength}{self::Strength*});
    out.{self::Variable::stay} = ihn.{self::Variable::stay}{core::bool*};
    if(out.{self::Variable::stay}{core::bool*})
      this.{self::Constraint::execute}(){() →* void};
  }
  method markUnsatisfied() → void {
    this.{self::BinaryConstraint::direction} = #C1;
  }
  method inputsKnown(core::int* mark) → core::bool* {
    self::Variable* i = this.{self::BinaryConstraint::input}(){() →* self::Variable*};
    return i.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark || i.{self::Variable::stay}{core::bool*} || i.{self::Variable::determinedBy}{self::Constraint*} == null;
  }
  method removeFromGraph() → void {
    if(!(this.{self::BinaryConstraint::v1}{self::Variable*} == null))
      this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::removeConstraint}(this){(self::Constraint*) →* void};
    if(!(this.{self::BinaryConstraint::v2}{self::Variable*} == null))
      this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::removeConstraint}(this){(self::Constraint*) →* void};
    this.{self::BinaryConstraint::direction} = #C1;
  }
}
class ScaleConstraint extends self::BinaryConstraint {
  final field self::Variable* scale;
  final field self::Variable* offset;
  constructor •(self::Variable* src, self::Variable* scale, self::Variable* offset, self::Variable* dest, self::Strength* strength) → self::ScaleConstraint*
    : self::ScaleConstraint::scale = scale, self::ScaleConstraint::offset = offset, super self::BinaryConstraint::•(src, dest, strength)
    ;
  method addToGraph() → void {
    super.{self::BinaryConstraint::addToGraph}();
    this.{self::ScaleConstraint::scale}{self::Variable*}.{self::Variable::addConstraint}(this){(self::Constraint*) →* void};
    this.{self::ScaleConstraint::offset}{self::Variable*}.{self::Variable::addConstraint}(this){(self::Constraint*) →* void};
  }
  method removeFromGraph() → void {
    super.{self::BinaryConstraint::removeFromGraph}();
    if(!(this.{self::ScaleConstraint::scale}{self::Variable*} == null))
      this.{self::ScaleConstraint::scale}{self::Variable*}.{self::Variable::removeConstraint}(this){(self::Constraint*) →* void};
    if(!(this.{self::ScaleConstraint::offset}{self::Variable*} == null))
      this.{self::ScaleConstraint::offset}{self::Variable*}.{self::Variable::removeConstraint}(this){(self::Constraint*) →* void};
  }
  method markInputs(core::int* mark) → void {
    super.{self::BinaryConstraint::markInputs}(mark);
    this.{self::ScaleConstraint::scale}{self::Variable*}.{self::Variable::mark} = this.{self::ScaleConstraint::offset}{self::Variable*}.{self::Variable::mark} = mark;
  }
  method execute() → void {
    if(this.{self::BinaryConstraint::direction}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} (#C4)) {
      this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::value} = this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::value}{core::int*}.{core::num::*}(this.{self::ScaleConstraint::scale}{self::Variable*}.{self::Variable::value}{core::int*}){(core::num*) →* core::int*}.{core::num::+}(this.{self::ScaleConstraint::offset}{self::Variable*}.{self::Variable::value}{core::int*}){(core::num*) →* core::int*};
    }
    else {
      this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::value} = this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::value}{core::int*}.{core::num::-}(this.{self::ScaleConstraint::offset}{self::Variable*}.{self::Variable::value}{core::int*}){(core::num*) →* core::int*}.{core::num::~/}(this.{self::ScaleConstraint::scale}{self::Variable*}.{self::Variable::value}{core::int*}){(core::num*) →* core::int*};
    }
  }
  method recalculate() → void {
    self::Variable* ihn = this.{self::BinaryConstraint::input}(){() →* self::Variable*};
    self::Variable* out = this.{self::BinaryConstraint::output}(){() →* self::Variable*};
    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}{self::Strength*}, ihn.{self::Variable::walkStrength}{self::Strength*});
    out.{self::Variable::stay} = ihn.{self::Variable::stay}{core::bool*} && this.{self::ScaleConstraint::scale}{self::Variable*}.{self::Variable::stay}{core::bool*} && this.{self::ScaleConstraint::offset}{self::Variable*}.{self::Variable::stay}{core::bool*};
    if(out.{self::Variable::stay}{core::bool*})
      this.{self::ScaleConstraint::execute}(){() →* void};
  }
}
class EqualityConstraint extends self::BinaryConstraint {
  constructor •(self::Variable* v1, self::Variable* v2, self::Strength* strength) → self::EqualityConstraint*
    : super self::BinaryConstraint::•(v1, v2, strength)
    ;
  method execute() → void {
    this.{self::BinaryConstraint::output}(){() →* self::Variable*}.{self::Variable::value} = this.{self::BinaryConstraint::input}(){() →* self::Variable*}.{self::Variable::value}{core::int*};
  }
}
class Variable extends core::Object {
  field core::List<self::Constraint*>* constraints = <self::Constraint*>[];
  field self::Constraint* determinedBy = null;
  field core::int* mark = 0;
  field self::Strength* walkStrength = #C18;
  field core::bool* stay = true;
  field core::int* value;
  final field core::String* name;
  constructor •(core::String* name, core::int* value) → self::Variable*
    : self::Variable::name = name, self::Variable::value = value, super core::Object::•()
    ;
  method addConstraint(self::Constraint* c) → void {
    this.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::add}(c){(self::Constraint*) →* void};
  }
  method removeConstraint(self::Constraint* c) → void {
    this.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::remove}(c){(core::Object*) →* core::bool*};
    if(this.{self::Variable::determinedBy}{self::Constraint*} =={self::Constraint::==}{(dynamic) →* core::bool*} c)
      this.{self::Variable::determinedBy} = null;
  }
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Planner extends core::Object {
  field core::int* currentMark = 0;
  synthetic constructor •() → self::Planner*
    : super core::Object::•()
    ;
  method incrementalAdd(self::Constraint* c) → void {
    core::int* mark = this.{self::Planner::newMark}(){() →* core::int*};
    for (self::Constraint* overridden = c.{self::Constraint::satisfy}(mark){(dynamic) →* self::Constraint*}; !(overridden == null); overridden = overridden.{self::Constraint::satisfy}(mark){(dynamic) →* self::Constraint*})
      ;
  }
  method incrementalRemove(self::Constraint* c) → void {
    self::Variable* out = c.{self::Constraint::output}(){() →* self::Variable*};
    c.{self::Constraint::markUnsatisfied}(){() →* void};
    c.{self::Constraint::removeFromGraph}(){() →* void};
    core::List<self::Constraint*>* unsatisfied = this.{self::Planner::removePropagateFrom}(out){(self::Variable*) →* core::List<self::Constraint*>*};
    self::Strength* strength = #C22;
    do {
      for (core::int* i = 0; i.{core::num::<}(unsatisfied.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
        self::Constraint* u = unsatisfied.{core::List::[]}(i){(core::int*) →* self::Constraint*};
        if(u.{self::Constraint::strength}{self::Strength*} =={self::Strength::==}{(dynamic) →* core::bool*} strength)
          this.{self::Planner::incrementalAdd}(u){(self::Constraint*) →* void};
      }
      strength = strength.{self::Strength::nextWeaker}(){() →* self::Strength*};
    }
    while (!(strength =={self::Strength::==}{(dynamic) →* core::bool*} (#C18)))
  }
  method newMark() → core::int*
    return this.{self::Planner::currentMark} = this.{self::Planner::currentMark}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
  method makePlan(core::List<self::Constraint*>* sources) → self::Plan* {
    core::int* mark = this.{self::Planner::newMark}(){() →* core::int*};
    self::Plan* plan = new self::Plan::•();
    core::List<self::Constraint*>* todo = sources;
    while (todo.{core::List::length}{core::int*}.{core::num::>}(0){(core::num*) →* core::bool*}) {
      self::Constraint* c = todo.{core::List::removeLast}(){() →* self::Constraint*};
      if(!(c.{self::Constraint::output}(){() →* self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) && c.{self::Constraint::inputsKnown}(mark){(core::int*) →* core::bool*}) {
        plan.{self::Plan::addConstraint}(c){(self::Constraint*) →* void};
        c.{self::Constraint::output}(){() →* self::Variable*}.{self::Variable::mark} = mark;
        this.{self::Planner::addConstraintsConsumingTo}(c.{self::Constraint::output}(){() →* self::Variable*}, todo){(self::Variable*, core::List<self::Constraint*>*) →* void};
      }
    }
    return plan;
  }
  method extractPlanFromConstraints(core::List<self::Constraint*>* constraints) → self::Plan* {
    core::List<self::Constraint*>* sources = <self::Constraint*>[];
    for (core::int* i = 0; i.{core::num::<}(constraints.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
      self::Constraint* c = constraints.{core::List::[]}(i){(core::int*) →* self::Constraint*};
      if(c.{self::Constraint::isInput}(){() →* core::bool*} && c.{self::Constraint::isSatisfied}(){() →* core::bool*})
        sources.{core::List::add}(c){(self::Constraint*) →* void};
    }
    return this.{self::Planner::makePlan}(sources){(core::List<self::Constraint*>*) →* self::Plan*};
  }
  method addPropagate(self::Constraint* c, core::int* mark) → core::bool* {
    core::List<self::Constraint*>* todo = <self::Constraint*>[c];
    while (todo.{core::List::length}{core::int*}.{core::num::>}(0){(core::num*) →* core::bool*}) {
      self::Constraint* d = todo.{core::List::removeLast}(){() →* self::Constraint*};
      if(d.{self::Constraint::output}(){() →* self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) {
        this.{self::Planner::incrementalRemove}(c){(self::Constraint*) →* void};
        return false;
      }
      d.{self::Constraint::recalculate}(){() →* void};
      this.{self::Planner::addConstraintsConsumingTo}(d.{self::Constraint::output}(){() →* self::Variable*}, todo){(self::Variable*, core::List<self::Constraint*>*) →* void};
    }
    return true;
  }
  method removePropagateFrom(self::Variable* out) → core::List<self::Constraint*>* {
    out.{self::Variable::determinedBy} = null;
    out.{self::Variable::walkStrength} = #C18;
    out.{self::Variable::stay} = true;
    core::List<self::Constraint*>* unsatisfied = <self::Constraint*>[];
    core::List<self::Variable*>* todo = <self::Variable*>[out];
    while (todo.{core::List::length}{core::int*}.{core::num::>}(0){(core::num*) →* core::bool*}) {
      self::Variable* v = todo.{core::List::removeLast}(){() →* self::Variable*};
      for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
        self::Constraint* c = v.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::[]}(i){(core::int*) →* self::Constraint*};
        if(!c.{self::Constraint::isSatisfied}(){() →* core::bool*})
          unsatisfied.{core::List::add}(c){(self::Constraint*) →* void};
      }
      self::Constraint* determining = v.{self::Variable::determinedBy}{self::Constraint*};
      for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
        self::Constraint* next = v.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::[]}(i){(core::int*) →* self::Constraint*};
        if(!(next =={self::Constraint::==}{(dynamic) →* core::bool*} determining) && next.{self::Constraint::isSatisfied}(){() →* core::bool*}) {
          next.{self::Constraint::recalculate}(){() →* void};
          todo.{core::List::add}(next.{self::Constraint::output}(){() →* self::Variable*}){(self::Variable*) →* void};
        }
      }
    }
    return unsatisfied;
  }
  method addConstraintsConsumingTo(self::Variable* v, core::List<self::Constraint*>* coll) → void {
    self::Constraint* determining = v.{self::Variable::determinedBy}{self::Constraint*};
    for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
      self::Constraint* c = v.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::[]}(i){(core::int*) →* self::Constraint*};
      if(!(c =={self::Constraint::==}{(dynamic) →* core::bool*} determining) && c.{self::Constraint::isSatisfied}(){() →* core::bool*})
        coll.{core::List::add}(c){(self::Constraint*) →* void};
    }
  }
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Plan extends core::Object {
  field core::List<self::Constraint*>* list = <self::Constraint*>[];
  synthetic constructor •() → self::Plan*
    : super core::Object::•()
    ;
  method addConstraint(self::Constraint* c) → void {
    this.{self::Plan::list}{core::List<self::Constraint*>*}.{core::List::add}(c){(self::Constraint*) →* void};
  }
  method size() → core::int*
    return this.{self::Plan::list}{core::List<self::Constraint*>*}.{core::List::length}{core::int*};
  method execute() → void {
    for (core::int* i = 0; i.{core::num::<}(this.{self::Plan::list}{core::List<self::Constraint*>*}.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
      this.{self::Plan::list}{core::List<self::Constraint*>*}.{core::List::[]}(i){(core::int*) →* self::Constraint*}.{self::Constraint::execute}(){() →* void};
    }
  }
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static const field self::Strength* REQUIRED = #C22;
static const field self::Strength* STRONG_PREFERRED = #C3;
static const field self::Strength* PREFERRED = #C6;
static const field self::Strength* STRONG_DEFAULT = #C9;
static const field self::Strength* NORMAL = #C12;
static const field self::Strength* WEAK_DEFAULT = #C15;
static const field self::Strength* WEAKEST = #C18;
static const field core::int* NONE = #C1;
static const field core::int* FORWARD = #C4;
static const field core::int* BACKWARD = #C20;
static field self::Planner* planner;
static method main() → dynamic {
  new self::DeltaBlue::•().{self::DeltaBlue::run}(){() →* void};
}
static method chainTest(core::int* n) → void {
  self::planner = new self::Planner::•();
  self::Variable* prev = null;
  self::Variable* first = null;
  self::Variable* last = null;
  for (core::int* i = 0; i.{core::num::<=}(n){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
    self::Variable* v = new self::Variable::•("v${i}", 0);
    if(!(prev == null))
      new self::EqualityConstraint::•(prev, v, #C22);
    if(i =={core::num::==}{(core::Object*) →* core::bool*} 0)
      first = v;
    if(i =={core::num::==}{(core::Object*) →* core::bool*} n)
      last = v;
    prev = v;
  }
  new self::StayConstraint::•(last, #C9);
  self::EditConstraint* edit = new self::EditConstraint::•(first, #C6);
  self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::Constraint*>[edit]){(core::List<self::Constraint*>*) →* self::Plan*};
  for (core::int* i = 0; i.{core::num::<}(100){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
    first.{self::Variable::value} = i;
    plan.{self::Plan::execute}(){() →* void};
    if(!(last.{self::Variable::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} i)) {
      core::print("Chain test failed:");
      core::print("Expected last value to be ${i} but it was ${last.{self::Variable::value}{core::int*}}.");
    }
  }
}
static method projectionTest(core::int* n) → void {
  self::planner = new self::Planner::•();
  self::Variable* scale = new self::Variable::•("scale", 10);
  self::Variable* offset = new self::Variable::•("offset", 1000);
  self::Variable* src = null;
  self::Variable* dst = null;
  core::List<self::Variable*>* dests = <self::Variable*>[];
  for (core::int* i = 0; i.{core::num::<}(n){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
    src = new self::Variable::•("src", i);
    dst = new self::Variable::•("dst", i);
    dests.{core::List::add}(dst){(self::Variable*) →* void};
    new self::StayConstraint::•(src, #C12);
    new self::ScaleConstraint::•(src, scale, offset, dst, #C22);
  }
  self::change(src, 17);
  if(!(dst.{self::Variable::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 1170))
    core::print("Projection 1 failed");
  self::change(dst, 1050);
  if(!(src.{self::Variable::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 5))
    core::print("Projection 2 failed");
  self::change(scale, 5);
  for (core::int* i = 0; i.{core::num::<}(n.{core::num::-}(1){(core::num*) →* core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
    if(!(dests.{core::List::[]}(i){(core::int*) →* self::Variable*}.{self::Variable::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} i.{core::num::*}(5){(core::num*) →* core::int*}.{core::num::+}(1000){(core::num*) →* core::int*}))
      core::print("Projection 3 failed");
  }
  self::change(offset, 2000);
  for (core::int* i = 0; i.{core::num::<}(n.{core::num::-}(1){(core::num*) →* core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
    if(!(dests.{core::List::[]}(i){(core::int*) →* self::Variable*}.{self::Variable::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} i.{core::num::*}(5){(core::num*) →* core::int*}.{core::num::+}(2000){(core::num*) →* core::int*}))
      core::print("Projection 4 failed");
  }
}
static method change(self::Variable* v, core::int* newValue) → void {
  self::EditConstraint* edit = new self::EditConstraint::•(v, #C6);
  self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::EditConstraint*>[edit]){(core::List<self::Constraint*>*) →* self::Plan*};
  for (core::int* i = 0; i.{core::num::<}(10){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
    v.{self::Variable::value} = newValue;
    plan.{self::Plan::execute}(){() →* void};
  }
  edit.{self::Constraint::destroyConstraint}(){() →* void};
}

constants  {
  #C1 = 1
  #C2 = "strongPreferred"
  #C3 = self::Strength {value:#C1, name:#C2}
  #C4 = 2
  #C5 = "preferred"
  #C6 = self::Strength {value:#C4, name:#C5}
  #C7 = 3
  #C8 = "strongDefault"
  #C9 = self::Strength {value:#C7, name:#C8}
  #C10 = 4
  #C11 = "normal"
  #C12 = self::Strength {value:#C10, name:#C11}
  #C13 = 5
  #C14 = "weakDefault"
  #C15 = self::Strength {value:#C13, name:#C14}
  #C16 = 6
  #C17 = "weakest"
  #C18 = self::Strength {value:#C16, name:#C17}
  #C19 = <self::Strength*>[#C3, #C6, #C9, #C12, #C15, #C18]
  #C20 = 0
  #C21 = "required"
  #C22 = self::Strength {value:#C20, name:#C21}
}


Constructor coverage from constants:
org-dartlang-testcase:///DeltaBlue.dart:
- Strength. (from org-dartlang-testcase:///DeltaBlue.dart:59:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
