---input---
package util;

import util.Map;
import util.Collection;
import util.Set;
import util.Option;
import util.Debug;
import util.Throwable;

using util.StringFormat;

/**
 * An ordered map of (key,value) pairs. The key ordering is defined by
 * a comparison function specified at construction. Duplicate keys
 * are not allowed.
 *
 * Worst Case Time and Space Complexities:
 * [operation]   [time]      [space]
 * insert        O(lg(n))    O(lg(n))
 * find          O(lg(n))    O(1)
 * delete        O(lg(n))    O(lg(n))
 * range-query   O(lg(n))*   O(lg(n))
 * iteration     O(n)**      O(lg(n))
 *   *range-query returns an iterator over elements in the range
 *   **total cost of iterating over the entire map
 *
 * The map is backed by a Left-Leaning Red-Black 2-3 Tree
 * adapted from Robert Sedgewick (2008) (http://www.cs.princeton.edu/~rs/)
 *
 * Implementation choices (let size of tree be n)
 * - Parent Pointers
 *   - This implementation omits parent pointers.
 *   - Omitting parent pointers saves n words of persistent memory
 *     at the expense of lg(n) stack space per operation.
 *   - Without parent pointers, most operations in the tree must
 *     either use recursion, or simulate recursion by saving a history
 *     of nodes via a stack. For example, each iterator will require
 *     lg(n) extra space to track progress through the tree. Insertions
 *     and deletions into the tree will also invalidate any existing
 *     iterators.
 * - Node Size Information
 *   - This implementation omits the size of each node.
 *   - Omitting size information saves n words of long-term memory at
 *     the expense of not providing a find-kth operation.
 *   - This seems like a reasonable trade-off as range queries are
 *     generally more common than find-kth operations. The implementation
 *     used below could easily be modified to provide a version with
 *     size information should find-kth be of specific interest.
 * - Recursive vs. Iterative
 *   - This implementation uses recursive algorithms.
 *   - The recursive implementations allow the code to remain compact and
 *     understandable. Since the height of LLRB 2-3 Trees is gaurenteed
 *     to be at most 2lg(n), stack overflow is typically not a concern.
 *     Unlike the standard single-rotation red-black algorithm, LLRB
 *     operations are not tail-recursive, so even an iterative
 *     version will require lg(n) extra memory.
 */
class OrderedMap<K,V>
{
  private var root  :Null<Node<K,V>>;
  private var nodeCount :Int;
  private var comp  :K -> K -> Int;

  public function new( keyComp :K -> K -> Int )
  {
    root = null;
    comp = keyComp;
    nodeCount = 0;
    assertInvariants();
  }

  /**
   * @returns Some(v) if (\key,v) is in the map, None otherwise.
   */
  public function get(key :K) :Option<V>
  {
    //normal BST search
    var n = root;
    while( n != null )
    {
      var cmp = comp(key,n.key);
      if( cmp < 0 )
      {
        n = n.left;
      }
      else if ( cmp > 0 )
      {
        n = n.right;
      }
      else
      {
        return Some(n.val);
      }
    }
    return None;
  }

  /**
   * Puts (\key,\val) into the map or replaces the current value of \key
   * with \val.
   *
   * @return None if \key currently is not in the map, or Some(v) if (\key,v)
   *   was in the map before the put operation.
   */
  public function set(key :K, val :V) :Option<V>
  {
    var ret = new Ref<V>(null);
    root = insertNode(root,key,val,ret);
    root.color = black;

    assertInvariants();

    if( ret.r == null )
    {
      return None;
    }
    return Some(ret.r);
  }

  private function insertNode(n :Node<K,V>, key :K, val :V, ret :Ref<V>)
  {
    //do the insertion at the leaf level
    if( n == null )
    {
      ++nodeCount;
      return new Node<K,V>(key,val);
    }

    //normal BST search
    var cmp = comp(key,n.key);
    if( cmp < 0 )
    {
      n.left = insertNode(n.left,key,val,ret);
    }
    else if( cmp > 0 )
    {
      n.right = insertNode(n.right,key,val,ret);
    }
    else
    {
      //the key is already in the map, update the value
      ret.r = n.val;
      n.val = val;
    }

    return fixInvariants(n);
  }

  /**
   * Removes (\key,v) from the map if it exists.
   *
   * @return None if (\key,v) wasn't in the map, Some(v) otherwise.
   */
  public function remove(key :K) :Option<V>
  {
    var ret = new Ref<V>(null);
    if( root != null )
    {
      root = deleteNode(root,key,ret);
      if( root != null )
      {
        root.color = black;
      }
    }

    assertInvariants();

    if( ret.r == null )
    {
      return None;
    }
    return Some(ret.r);
  }

  private function deleteNode( n :Node<K,V>, key :K, ret :Ref<V> )
  {
    if( comp(key,n.key) < 0 )
    {
      if( isBlack(n.left) && isBlack(n.left.left) )
      {
        //ensure we move into a 3-node
        n = moveRedLeft(n);
      }
      n.left = deleteNode(n.left,key,ret);
    }
    else
    {
      if( isRed(n.left) )
      {
        //ensure we move into a 3-node
        n = rotateRight(n);
      }
      if( comp(key,n.key) == 0 && n.right == null )
      {
        //delete the node
        ret.r = n.val;
        --nodeCount;
        return null;
      }
      if( isBlack(n.right) && isBlack(n.right.left) )
      {
        //ensure we move into a 3-node
        n = moveRedRight(n);
      }
      if( comp(key,n.key) == 0 )
      {
        Debug.assert(n.right != null);

        ret.r = n.val;

        //ensure we are deleting a node with at most one child
        var min = minNode(n.right);
        n.val = min.val;
        n.key = min.key;
        n.right = deleteMinNode(n.right);
      }
      else
      {
        n.right = deleteNode(n.right,key,ret);
      }
    }

    return fixInvariants(n);
  }

  /** returns a view of the set of keys in this TreeMap **/
  public function keys() :SetView<K>
  {
    var _this = this;

    return {
      size: function() return _this.size(),
      iterator: function() return IterTools.mapIter(new NodeIterator(_this.root),function(x) return x.key),
      exists: function(x) {
        return switch(_this.get(x))
        {
          case None: false;
          case Some(_): true;
        };
      },
    };
  }

  /** returns a view of the collection of values in this TreeMap **/
  public function values() :CollectionView<V>
  {
    var _this = this;

    return {
      size: function() return _this.size(),
      iterator: function() return IterTools.mapIter(new NodeIterator(_this.root),function(x) return x.val),
    };
  }

  /** returns a view of the (key,value) pairs in this TreeMap **/
  public function entries() :CollectionView<Entry<K,V>>
  {
    var _this = this;

    return {
      size: function() {
        return _this.size();
      },
      iterator: function() {
        return cast new NodeIterator(_this.root);
      },
    };
  }

  /** returns the number of (key,value) pairs in the map **/
  public function size() :Int
  {
    return nodeCount;
  }

  public function toString() :String
  {
    var sb = new StringBuf();

    sb.add("{");
    for( entry in this.entries() )
    {
      sb.add("%y => %y, ".sprintf([entry.key,entry.val]));
    }
    sb.add("}");

    return sb.toString();
  }

  private static function isRed<K,V>( n :Node<K,V> )
  {
    if( n == null ) return false;
    return switch(n.color)
    {
      case red: true;
      case black: false;
    };
  }

  private static inline function isBlack<K,V>( n :Node<K,V> )
  {
    return !isRed(n);
  }

  private static function colorFlip<K,V>( n :Node<K,V> )
  {
    n.color = oppositeColor(n.color);
    n.left.color = oppositeColor(n.left.color);
    n.right.color = oppositeColor(n.right.color);
  }

  private static inline function oppositeColor( c :Color )
  {
    return switch(c)
    {
      case red: black;
      case black: red;
    };
  }

  private static function rotateLeft<K,V>( n :Node<K,V> )
  {
    Debug.assert(n != null);
    Debug.assert(n.right != null);
    /*
           n            x
          / \          / \
         a   x   =>   n   c
            / \      / \
           b   c    a   b
    */
    var x = n.right;
    n.right = x.left;
    x.left  = n;
    x.color = n.color;
    n.color = red;
    return x;
  }

  private static function rotateRight<K,V>( n :Node<K,V> )
  {
    Debug.assert( n != null );
    Debug.assert( n.left != null );
    /*
           n          x
          / \        / \
         x   c  =>  a   n
        / \            / \
       a   b          b   c
    */
    var x = n.left;
    n.left = x.right;
    x.right = n;
    x.color = n.color;
    n.color = red;
    return x;
  }

  private static function moveRedLeft<K,V>( n :Node<K,V> )
  {
    //borrow extra node from right child (which is a 3-node)
    colorFlip(n);
    if( isRed(n.right.left) )
    {
      n.right = rotateRight(n.right);
      n = rotateLeft(n);
      colorFlip(n);
    }
    return n;
  }

  private static function moveRedRight<K,V>( n :Node<K,V> )
  {
    //borrow extra node from left child (which is a 3-node)
    colorFlip(n);
    if( isRed(n.left.left) )
    {
      n = rotateRight(n);
      colorFlip(n);
    }
    return n;
  }

  private static function fixInvariants<K,V>( n :Node<K,V> )
  {
    if( isRed(n.right) && isBlack(n.left) )
    {
      //ensure left-leaning property
      n = rotateLeft(n);
    }
    if( isRed(n.left) && isRed(n.left.left) )
    {
      //balance 4-node
      n = rotateRight(n);
    }
    if( isRed(n.left) && isRed(n.right) )
    {
      //split 4-node
      colorFlip(n);
    }
    return n;
  }

  private function deleteMinNode<K,V>( n :Node<K,V> )
  {
    if( n.left == null )
    {
      //delete
      --nodeCount;
      return null;
    }

    if( isBlack(n.left) && isBlack(n.left.left) )
    {
      n = moveRedLeft(n);
    }

    n.left = deleteMinNode(n.left);

    return fixInvariants(n);
  }

  private static function minNode<K,V>( n :Node<K,V> )
  {
    Debug.assert(n != null);

    while( n.left != null )
    {
      n = n.left;
    }
    return n;
  }

  private static function maxNode<K,V>( n :Node<K,V> )
  {
    Debug.assert(n != null);

    while( n.right != null )
    {
      n = n.right;
    }
    return n;
  }

  /** Used to verify that the invariants of the tree hold **/
  private inline function assertInvariants()
  {
  #if DEBUG
    Debug.assert( isBlack(root), "root is black: " + root );

    assertIsTree(root,new List<Node<K,V>>());
    assertBlackNodeCount(root);
    assertBSTOrdering(root,comp);
  #end
  }

  private static function assertIsTree<K,V>( n: Node<K,V>, visited :List<Node<K,V>> )
  {
    if( n == null )
    {
      return;
    }

    for( r in visited )
    {
      Debug.assert( n != r );
    }
    visited.push(n);
    assertIsTree(n.left,visited);
    assertIsTree(n.right,visited);
  }

  private static function assertBlackNodeCount<K,V>( n: Node<K,V> ) :Int
  {
    if( n == null )
    {
      return 1;
    }

    var leftCount  = assertBlackNodeCount(n.left);
    var rightCount = assertBlackNodeCount(n.right);

    Debug.assert(
      leftCount == rightCount,
      "num of black nodes in all paths for left and right child not equal" + n
    );

    return leftCount + switch(n.color) {
      case red: 0;
      case black: 1;
    }
  }

  private static function assertBSTOrdering<K,V>( n: Node<K,V>, compK :K -> K -> Int ) :Void
  {
    if( n == null )
    {
      return;
    }

    if( n.left != null && n.left.val != null )
    {
      Debug.assert( compK(n.left.key,n.key) < 0, "left child not less than its parent" + n );
      assertBSTOrdering(n.left,compK);
    }

    if( n.right != null && n.right.val != null )
    {
      Debug.assert( compK(n.key,n.right.key) < 0, "parent not less than its right child" + n );
      assertBSTOrdering(n.right,compK);
    }
  }
}

private enum Color
{
  red;
  black;
}

private class Node<K,V> /*implements Entry<K,V>*/
{
  public var left   :Null<Node<K,V>>;
  public var right  :Null<Node<K,V>>;
  public var color  :Color;

  public var key :K;
  public var val :V;

  public function new(k :K, v :V)
  {
    key = k;
    val = v;
    color = red;
  }
}

private class NodeIterator<K,V>
{
  private var curr   :Node<K,V>;
  private var fringe :Array<Node<K,V>>;

  public function new( root :Node<K,V> )
  {
    fringe = new Array<Node<K,V>>();
    traverseToMin(root);
    curr = fringe.pop();
  }

  public inline function hasNext() :Bool
  {
    return curr != null;
  }

  public function next() :Node<K,V>
  {
    if( !hasNext() )
    {
      throw new NoSuchElement();
    }
    var ret = curr;

    if( fringe.length > 0 )
    {
      curr = fringe.pop();
      traverseToMin(curr.right);
    }
    else
    {
      curr = null;
    }

    return ret;
  }

  private function traverseToMin( n :Node<K,V> )
  {
    while( n != null )
    {
      fringe.push(n);
      n = n.left;
    }
  }
}

---tokens---
'package'     Keyword.Namespace
' '           Text
'util'        Name.Namespace
';'           Punctuation
'\n\n'        Text

'import'      Keyword.Namespace
' '           Text
'util'        Name.Namespace
'.'           Punctuation
'Map'         Name.Namespace
';'           Punctuation
'\n'          Text

'import'      Keyword.Namespace
' '           Text
'util'        Name.Namespace
'.'           Punctuation
'Collection'  Name.Namespace
';'           Punctuation
'\n'          Text

'import'      Keyword.Namespace
' '           Text
'util'        Name.Namespace
'.'           Punctuation
'Set'         Name.Namespace
';'           Punctuation
'\n'          Text

'import'      Keyword.Namespace
' '           Text
'util'        Name.Namespace
'.'           Punctuation
'Option'      Name.Namespace
';'           Punctuation
'\n'          Text

'import'      Keyword.Namespace
' '           Text
'util'        Name.Namespace
'.'           Punctuation
'Debug'       Name.Namespace
';'           Punctuation
'\n'          Text

'import'      Keyword.Namespace
' '           Text
'util'        Name.Namespace
'.'           Punctuation
'Throwable'   Name.Namespace
';'           Punctuation
'\n\n'        Text

'using'       Keyword.Namespace
' '           Text
'util'        Name.Namespace
'.'           Punctuation
'StringFormat' Name.Namespace
';'           Punctuation
'\n\n'        Text

'/**\n * An ordered map of (key,value) pairs. The key ordering is defined by\n * a comparison function specified at construction. Duplicate keys\n * are not allowed.\n *\n * Worst Case Time and Space Complexities:\n * [operation]   [time]      [space]\n * insert        O(lg(n))    O(lg(n))\n * find          O(lg(n))    O(1)\n * delete        O(lg(n))    O(lg(n))\n * range-query   O(lg(n))*   O(lg(n))\n * iteration     O(n)**      O(lg(n))\n *   *range-query returns an iterator over elements in the range\n *   **total cost of iterating over the entire map\n *\n * The map is backed by a Left-Leaning Red-Black 2-3 Tree\n * adapted from Robert Sedgewick (2008) (http://www.cs.princeton.edu/~rs/)\n *\n * Implementation choices (let size of tree be n)\n * - Parent Pointers\n *   - This implementation omits parent pointers.\n *   - Omitting parent pointers saves n words of persistent memory\n *     at the expense of lg(n) stack space per operation.\n *   - Without parent pointers, most operations in the tree must\n *     either use recursion, or simulate recursion by saving a history\n *     of nodes via a stack. For example, each iterator will require\n *     lg(n) extra space to track progress through the tree. Insertions\n *     and deletions into the tree will also invalidate any existing\n *     iterators.\n * - Node Size Information\n *   - This implementation omits the size of each node.\n *   - Omitting size information saves n words of long-term memory at\n *     the expense of not providing a find-kth operation.\n *   - This seems like a reasonable trade-off as range queries are\n *     generally more common than find-kth operations. The implementation\n *     used below could easily be modified to provide a version with\n *     size information should find-kth be of specific interest.\n * - Recursive vs. Iterative\n *   - This implementation uses recursive algorithms.\n *   - The recursive implementations allow the code to remain compact and\n *     understandable. Since the height of LLRB 2-3 Trees is gaurenteed\n *     to be at most 2lg(n), stack overflow is typically not a concern.\n *     Unlike the standard single-rotation red-black algorithm, LLRB\n *     operations are not tail-recursive, so even an iterative\n *     version will require lg(n) extra memory.\n */' Comment.Multiline
'\n'          Text

'class'       Keyword.Declaration
' '           Text
'OrderedMap'  Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'\n'          Text

'{'           Punctuation
'\n  '        Text
'private'     Keyword.Declaration
' '           Text
'var'         Keyword.Declaration
' '           Text
'root'        Text
'  '          Text
':'           Punctuation
'Null'        Name
'<'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'>'           Punctuation
';'           Punctuation
'\n  '        Text
'private'     Keyword.Declaration
' '           Text
'var'         Keyword.Declaration
' '           Text
'nodeCount'   Text
' '           Text
':'           Punctuation
'Int'         Name
';'           Punctuation
'\n  '        Text
'private'     Keyword.Declaration
' '           Text
'var'         Keyword.Declaration
' '           Text
'comp'        Text
'  '          Text
':'           Punctuation
'K'           Name
' '           Text
'->'          Punctuation
' '           Text
'K'           Name
' '           Text
'->'          Punctuation
' '           Text
'Int'         Name
';'           Punctuation
'\n\n  '      Text
'public'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'new'         Name.Function
'('           Punctuation
' '           Text
'keyComp'     Name
' '           Text
':'           Punctuation
'K'           Name
' '           Text
'->'          Punctuation
' '           Text
'K'           Name
' '           Text
'->'          Punctuation
' '           Text
'Int'         Name
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'root'        Name
' '           Text
'='           Operator
' '           Text
'null'        Keyword.Constant
';'           Punctuation
'\n    '      Text
'comp'        Name
' '           Text
'='           Operator
' '           Text
'keyComp'     Name
';'           Punctuation
'\n    '      Text
'nodeCount'   Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
';'           Punctuation
'\n    '      Text
'assertInvariants' Name
'('           Punctuation
')'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'/**\n   * @returns Some(v) if (\\key,v) is in the map, None otherwise.\n   */' Comment.Multiline
'\n  '        Text
'public'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'get'         Name.Function
'('           Punctuation
'key'         Name
' '           Text
':'           Punctuation
'K'           Name
')'           Punctuation
' '           Text
':'           Punctuation
'Option'      Name
'<'           Punctuation
'V'           Name
'>'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'//normal BST search' Comment.Single
'\n    '      Text
'var'         Keyword.Declaration
' '           Text
'n'           Text
' '           Text
'='           Operator
' '           Text
'root'        Name
';'           Punctuation
'\n    '      Text
'while'       Keyword
'('           Punctuation
' '           Text
'n'           Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'var'         Keyword.Declaration
' '           Text
'cmp'         Text
' '           Text
'='           Operator
' '           Text
'comp'        Name
'('           Punctuation
'key'         Name
','           Punctuation
'n'           Name
'.'           Punctuation
'key'         Name
')'           Punctuation
';'           Punctuation
'\n      '    Text
'if'          Keyword
'('           Punctuation
' '           Text
'cmp'         Name
' '           Text
'<'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
')'           Punctuation
'\n      '    Text
'{'           Punctuation
'\n        '  Text
'n'           Name
' '           Text
'='           Operator
' '           Text
'n'           Name
'.'           Punctuation
'left'        Name
';'           Punctuation
'\n      '    Text
'}'           Punctuation
'\n      '    Text
'else'        Keyword
' '           Text
'if'          Keyword
' '           Text
'('           Punctuation
' '           Text
'cmp'         Name
' '           Text
'>'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
')'           Punctuation
'\n      '    Text
'{'           Punctuation
'\n        '  Text
'n'           Name
' '           Text
'='           Operator
' '           Text
'n'           Name
'.'           Punctuation
'right'       Name
';'           Punctuation
'\n      '    Text
'}'           Punctuation
'\n      '    Text
'else'        Keyword
'\n      '    Text
'{'           Punctuation
'\n        '  Text
'return'      Keyword
' '           Text
'Some'        Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'val'         Name
')'           Punctuation
';'           Punctuation
'\n      '    Text
'}'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'None'        Name
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'/**\n   * Puts (\\key,\\val) into the map or replaces the current value of \\key\n   * with \\val.\n   *\n   * @return None if \\key currently is not in the map, or Some(v) if (\\key,v)\n   *   was in the map before the put operation.\n   */' Comment.Multiline
'\n  '        Text
'public'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'set'         Name.Function
'('           Punctuation
'key'         Name
' '           Text
':'           Punctuation
'K'           Name
','           Punctuation
' '           Text
'val'         Name
' '           Text
':'           Punctuation
'V'           Name
')'           Punctuation
' '           Text
':'           Punctuation
'Option'      Name
'<'           Punctuation
'V'           Name
'>'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'var'         Keyword.Declaration
' '           Text
'ret'         Text
' '           Text
'='           Operator
' '           Text
'new'         Keyword
' '           Text
'Ref'         Name
'<'           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
'null'        Keyword.Constant
')'           Punctuation
';'           Punctuation
'\n    '      Text
'root'        Name
' '           Text
'='           Operator
' '           Text
'insertNode'  Name
'('           Punctuation
'root'        Name
','           Punctuation
'key'         Name
','           Punctuation
'val'         Name
','           Punctuation
'ret'         Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'root'        Name
'.'           Punctuation
'color'       Name
' '           Text
'='           Operator
' '           Text
'black'       Name
';'           Punctuation
'\n\n    '    Text
'assertInvariants' Name
'('           Punctuation
')'           Punctuation
';'           Punctuation
'\n\n    '    Text
'if'          Keyword
'('           Punctuation
' '           Text
'ret'         Name
'.'           Punctuation
'r'           Name
' '           Text
'=='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'return'      Keyword
' '           Text
'None'        Name
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'Some'        Name
'('           Punctuation
'ret'         Name
'.'           Punctuation
'r'           Name
')'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'insertNode'  Name.Function
'('           Punctuation
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
','           Punctuation
' '           Text
'key'         Name
' '           Text
':'           Punctuation
'K'           Name
','           Punctuation
' '           Text
'val'         Name
' '           Text
':'           Punctuation
'V'           Name
','           Punctuation
' '           Text
'ret'         Name
' '           Text
':'           Punctuation
'Ref'         Name
'<'           Punctuation
'V'           Name
'>'           Punctuation
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'//do the insertion at the leaf level' Comment.Single
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'n'           Name
' '           Text
'=='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'++'          Operator
'nodeCount'   Name
';'           Punctuation
'\n      '    Text
'return'      Keyword
' '           Text
'new'         Keyword
' '           Text
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
'key'         Name
','           Punctuation
'val'         Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n\n    '    Text
'//normal BST search' Comment.Single
'\n    '      Text
'var'         Keyword.Declaration
' '           Text
'cmp'         Text
' '           Text
'='           Operator
' '           Text
'comp'        Name
'('           Punctuation
'key'         Name
','           Punctuation
'n'           Name
'.'           Punctuation
'key'         Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'cmp'         Name
' '           Text
'<'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'n'           Name
'.'           Punctuation
'left'        Name
' '           Text
'='           Operator
' '           Text
'insertNode'  Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
','           Punctuation
'key'         Name
','           Punctuation
'val'         Name
','           Punctuation
'ret'         Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'else'        Keyword
' '           Text
'if'          Keyword
'('           Punctuation
' '           Text
'cmp'         Name
' '           Text
'>'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'n'           Name
'.'           Punctuation
'right'       Name
' '           Text
'='           Operator
' '           Text
'insertNode'  Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
','           Punctuation
'key'         Name
','           Punctuation
'val'         Name
','           Punctuation
'ret'         Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'else'        Keyword
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'//the key is already in the map, update the value' Comment.Single
'\n      '    Text
'ret'         Name
'.'           Punctuation
'r'           Name
' '           Text
'='           Operator
' '           Text
'n'           Name
'.'           Punctuation
'val'         Name
';'           Punctuation
'\n      '    Text
'n'           Name
'.'           Punctuation
'val'         Name
' '           Text
'='           Operator
' '           Text
'val'         Name
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n\n    '    Text
'return'      Keyword
' '           Text
'fixInvariants' Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
"/**\n   * Removes (\\key,v) from the map if it exists.\n   *\n   * @return None if (\\key,v) wasn't in the map, Some(v) otherwise.\n   */" Comment.Multiline
'\n  '        Text
'public'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'remove'      Name.Function
'('           Punctuation
'key'         Name
' '           Text
':'           Punctuation
'K'           Name
')'           Punctuation
' '           Text
':'           Punctuation
'Option'      Name
'<'           Punctuation
'V'           Name
'>'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'var'         Keyword.Declaration
' '           Text
'ret'         Text
' '           Text
'='           Operator
' '           Text
'new'         Keyword
' '           Text
'Ref'         Name
'<'           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
'null'        Keyword.Constant
')'           Punctuation
';'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'root'        Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'root'        Name
' '           Text
'='           Operator
' '           Text
'deleteNode'  Name
'('           Punctuation
'root'        Name
','           Punctuation
'key'         Name
','           Punctuation
'ret'         Name
')'           Punctuation
';'           Punctuation
'\n      '    Text
'if'          Keyword
'('           Punctuation
' '           Text
'root'        Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n      '    Text
'{'           Punctuation
'\n        '  Text
'root'        Name
'.'           Punctuation
'color'       Name
' '           Text
'='           Operator
' '           Text
'black'       Name
';'           Punctuation
'\n      '    Text
'}'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n\n    '    Text
'assertInvariants' Name
'('           Punctuation
')'           Punctuation
';'           Punctuation
'\n\n    '    Text
'if'          Keyword
'('           Punctuation
' '           Text
'ret'         Name
'.'           Punctuation
'r'           Name
' '           Text
'=='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'return'      Keyword
' '           Text
'None'        Name
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'Some'        Name
'('           Punctuation
'ret'         Name
'.'           Punctuation
'r'           Name
')'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'deleteNode'  Name.Function
'('           Punctuation
' '           Text
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
','           Punctuation
' '           Text
'key'         Name
' '           Text
':'           Punctuation
'K'           Name
','           Punctuation
' '           Text
'ret'         Name
' '           Text
':'           Punctuation
'Ref'         Name
'<'           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'comp'        Name
'('           Punctuation
'key'         Name
','           Punctuation
'n'           Name
'.'           Punctuation
'key'         Name
')'           Punctuation
' '           Text
'<'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'if'          Keyword
'('           Punctuation
' '           Text
'isBlack'     Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
')'           Punctuation
' '           Text
'&&'          Operator
' '           Text
'isBlack'     Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
'.'           Punctuation
'left'        Name
')'           Punctuation
' '           Text
')'           Punctuation
'\n      '    Text
'{'           Punctuation
'\n        '  Text
'//ensure we move into a 3-node' Comment.Single
'\n        '  Text
'n'           Name
' '           Text
'='           Operator
' '           Text
'moveRedLeft' Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n      '    Text
'}'           Punctuation
'\n      '    Text
'n'           Name
'.'           Punctuation
'left'        Name
' '           Text
'='           Operator
' '           Text
'deleteNode'  Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
','           Punctuation
'key'         Name
','           Punctuation
'ret'         Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'else'        Keyword
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'if'          Keyword
'('           Punctuation
' '           Text
'isRed'       Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
')'           Punctuation
' '           Text
')'           Punctuation
'\n      '    Text
'{'           Punctuation
'\n        '  Text
'//ensure we move into a 3-node' Comment.Single
'\n        '  Text
'n'           Name
' '           Text
'='           Operator
' '           Text
'rotateRight' Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n      '    Text
'}'           Punctuation
'\n      '    Text
'if'          Keyword
'('           Punctuation
' '           Text
'comp'        Name
'('           Punctuation
'key'         Name
','           Punctuation
'n'           Name
'.'           Punctuation
'key'         Name
')'           Punctuation
' '           Text
'=='          Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'&&'          Operator
' '           Text
'n'           Name
'.'           Punctuation
'right'       Name
' '           Text
'=='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n      '    Text
'{'           Punctuation
'\n        '  Text
'//delete the node' Comment.Single
'\n        '  Text
'ret'         Name
'.'           Punctuation
'r'           Name
' '           Text
'='           Operator
' '           Text
'n'           Name
'.'           Punctuation
'val'         Name
';'           Punctuation
'\n        '  Text
'--'          Operator
'nodeCount'   Name
';'           Punctuation
'\n        '  Text
'return'      Keyword
' '           Text
'null'        Keyword.Constant
';'           Punctuation
'\n      '    Text
'}'           Punctuation
'\n      '    Text
'if'          Keyword
'('           Punctuation
' '           Text
'isBlack'     Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
')'           Punctuation
' '           Text
'&&'          Operator
' '           Text
'isBlack'     Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
'.'           Punctuation
'left'        Name
')'           Punctuation
' '           Text
')'           Punctuation
'\n      '    Text
'{'           Punctuation
'\n        '  Text
'//ensure we move into a 3-node' Comment.Single
'\n        '  Text
'n'           Name
' '           Text
'='           Operator
' '           Text
'moveRedRight' Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n      '    Text
'}'           Punctuation
'\n      '    Text
'if'          Keyword
'('           Punctuation
' '           Text
'comp'        Name
'('           Punctuation
'key'         Name
','           Punctuation
'n'           Name
'.'           Punctuation
'key'         Name
')'           Punctuation
' '           Text
'=='          Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
')'           Punctuation
'\n      '    Text
'{'           Punctuation
'\n        '  Text
'Debug'       Name
'.'           Punctuation
'assert'      Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
')'           Punctuation
';'           Punctuation
'\n\n        ' Text
'ret'         Name
'.'           Punctuation
'r'           Name
' '           Text
'='           Operator
' '           Text
'n'           Name
'.'           Punctuation
'val'         Name
';'           Punctuation
'\n\n        ' Text
'//ensure we are deleting a node with at most one child' Comment.Single
'\n        '  Text
'var'         Keyword.Declaration
' '           Text
'min'         Text
' '           Text
'='           Operator
' '           Text
'minNode'     Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
')'           Punctuation
';'           Punctuation
'\n        '  Text
'n'           Name
'.'           Punctuation
'val'         Name
' '           Text
'='           Operator
' '           Text
'min'         Name
'.'           Punctuation
'val'         Name
';'           Punctuation
'\n        '  Text
'n'           Name
'.'           Punctuation
'key'         Name
' '           Text
'='           Operator
' '           Text
'min'         Name
'.'           Punctuation
'key'         Name
';'           Punctuation
'\n        '  Text
'n'           Name
'.'           Punctuation
'right'       Name
' '           Text
'='           Operator
' '           Text
'deleteMinNode' Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
')'           Punctuation
';'           Punctuation
'\n      '    Text
'}'           Punctuation
'\n      '    Text
'else'        Keyword
'\n      '    Text
'{'           Punctuation
'\n        '  Text
'n'           Name
'.'           Punctuation
'right'       Name
' '           Text
'='           Operator
' '           Text
'deleteNode'  Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
','           Punctuation
'key'         Name
','           Punctuation
'ret'         Name
')'           Punctuation
';'           Punctuation
'\n      '    Text
'}'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n\n    '    Text
'return'      Keyword
' '           Text
'fixInvariants' Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'/** returns a view of the set of keys in this TreeMap **/' Comment.Multiline
'\n  '        Text
'public'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'keys'        Name.Function
'('           Punctuation
')'           Punctuation
' '           Text
':'           Punctuation
'SetView'     Name
'<'           Punctuation
'K'           Name
'>'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'var'         Keyword.Declaration
' '           Text
'_this'       Text
' '           Text
'='           Operator
' '           Text
'this'        Keyword
';'           Punctuation
'\n\n    '    Text
'return'      Keyword
' '           Text
'{'           Punctuation
'\n      '    Text
'size'        Name
':'           Punctuation
' '           Text
'function'    Keyword.Declaration
'('           Punctuation
')'           Punctuation
' '           Text
'return'      Keyword
' '           Text
'_this'       Name
'.'           Punctuation
'size'        Name
'('           Punctuation
')'           Punctuation
','           Punctuation
'\n      '    Text
'iterator'    Name
':'           Punctuation
' '           Text
'function'    Keyword.Declaration
'('           Punctuation
')'           Punctuation
' '           Text
'return'      Keyword
' '           Text
'IterTools'   Name
'.'           Punctuation
'mapIter'     Name
'('           Punctuation
'new'         Keyword
' '           Text
'NodeIterator' Name
'('           Punctuation
'_this'       Name
'.'           Punctuation
'root'        Name
')'           Punctuation
','           Punctuation
'function'    Keyword.Declaration
'('           Punctuation
'x'           Name
')'           Punctuation
' '           Text
'return'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'key'         Name
')'           Punctuation
','           Punctuation
'\n      '    Text
'exists'      Name
':'           Punctuation
' '           Text
'function'    Keyword.Declaration
'('           Punctuation
'x'           Name
')'           Punctuation
' '           Text
'{'           Punctuation
'\n        '  Text
'return'      Keyword
' '           Text
'switch'      Keyword
'('           Punctuation
'_this'       Name
'.'           Punctuation
'get'         Name
'('           Punctuation
'x'           Name
')'           Punctuation
')'           Punctuation
'\n        '  Text
'{'           Punctuation
'\n          ' Text
'case'        Keyword
' '           Text
'None'        Name
':'           Punctuation
' '           Text
''            Keyword
'false'       Keyword.Constant
';'           Punctuation
'\n          ' Text
'case'        Keyword
' '           Text
'Some'        Name
'('           Punctuation
'_'           Name
')'           Punctuation
':'           Punctuation
' '           Text
''            Keyword
'true'        Keyword.Constant
';'           Punctuation
'\n        '  Text
'}'           Punctuation
';'           Punctuation
'\n      '    Text
'}'           Punctuation
','           Punctuation
'\n    '      Text
'}'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'/** returns a view of the collection of values in this TreeMap **/' Comment.Multiline
'\n  '        Text
'public'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'values'      Name.Function
'('           Punctuation
')'           Punctuation
' '           Text
':'           Punctuation
'CollectionView' Name
'<'           Punctuation
'V'           Name
'>'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'var'         Keyword.Declaration
' '           Text
'_this'       Text
' '           Text
'='           Operator
' '           Text
'this'        Keyword
';'           Punctuation
'\n\n    '    Text
'return'      Keyword
' '           Text
'{'           Punctuation
'\n      '    Text
'size'        Name
':'           Punctuation
' '           Text
'function'    Keyword.Declaration
'('           Punctuation
')'           Punctuation
' '           Text
'return'      Keyword
' '           Text
'_this'       Name
'.'           Punctuation
'size'        Name
'('           Punctuation
')'           Punctuation
','           Punctuation
'\n      '    Text
'iterator'    Name
':'           Punctuation
' '           Text
'function'    Keyword.Declaration
'('           Punctuation
')'           Punctuation
' '           Text
'return'      Keyword
' '           Text
'IterTools'   Name
'.'           Punctuation
'mapIter'     Name
'('           Punctuation
'new'         Keyword
' '           Text
'NodeIterator' Name
'('           Punctuation
'_this'       Name
'.'           Punctuation
'root'        Name
')'           Punctuation
','           Punctuation
'function'    Keyword.Declaration
'('           Punctuation
'x'           Name
')'           Punctuation
' '           Text
'return'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'val'         Name
')'           Punctuation
','           Punctuation
'\n    '      Text
'}'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'/** returns a view of the (key,value) pairs in this TreeMap **/' Comment.Multiline
'\n  '        Text
'public'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'entries'     Name.Function
'('           Punctuation
')'           Punctuation
' '           Text
':'           Punctuation
'CollectionView' Name
'<'           Punctuation
'Entry'       Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'>'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'var'         Keyword.Declaration
' '           Text
'_this'       Text
' '           Text
'='           Operator
' '           Text
'this'        Keyword
';'           Punctuation
'\n\n    '    Text
'return'      Keyword
' '           Text
'{'           Punctuation
'\n      '    Text
'size'        Name
':'           Punctuation
' '           Text
'function'    Keyword.Declaration
'('           Punctuation
')'           Punctuation
' '           Text
'{'           Punctuation
'\n        '  Text
'return'      Keyword
' '           Text
'_this'       Name
'.'           Punctuation
'size'        Name
'('           Punctuation
')'           Punctuation
';'           Punctuation
'\n      '    Text
'}'           Punctuation
','           Punctuation
'\n      '    Text
'iterator'    Name
':'           Punctuation
' '           Text
'function'    Keyword.Declaration
'('           Punctuation
')'           Punctuation
' '           Text
'{'           Punctuation
'\n        '  Text
'return'      Keyword
' '           Text
'cast'        Keyword
' '           Text
'new'         Keyword
' '           Text
'NodeIterator' Name
'('           Punctuation
'_this'       Name
'.'           Punctuation
'root'        Name
')'           Punctuation
';'           Punctuation
'\n      '    Text
'}'           Punctuation
','           Punctuation
'\n    '      Text
'}'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'/** returns the number of (key,value) pairs in the map **/' Comment.Multiline
'\n  '        Text
'public'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'size'        Name.Function
'('           Punctuation
')'           Punctuation
' '           Text
':'           Punctuation
'Int'         Name
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'nodeCount'   Name
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'public'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'toString'    Name.Function
'('           Punctuation
')'           Punctuation
' '           Text
':'           Punctuation
'String'      Name
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'var'         Keyword.Declaration
' '           Text
'sb'          Text
' '           Text
'='           Operator
' '           Text
'new'         Keyword
' '           Text
'StringBuf'   Name
'('           Punctuation
')'           Punctuation
';'           Punctuation
'\n\n    '    Text
'sb'          Name
'.'           Punctuation
'add'         Name
'('           Punctuation
'"'           Literal.String.Double
'{'           Literal.String.Double
'"'           Literal.String.Double
')'           Punctuation
';'           Punctuation
'\n    '      Text
'for'         Keyword
'('           Punctuation
' '           Text
'entry'       Name
' '           Text
'in'          Keyword
' '           Text
'this'        Keyword
'.'           Punctuation
'entries'     Name
'('           Punctuation
')'           Punctuation
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'sb'          Name
'.'           Punctuation
'add'         Name
'('           Punctuation
'"'           Literal.String.Double
'%'           Literal.String.Double
'y'           Literal.String.Double
' '           Literal.String.Double
'='           Literal.String.Double
'>'           Literal.String.Double
' '           Literal.String.Double
'%'           Literal.String.Double
'y'           Literal.String.Double
','           Literal.String.Double
' '           Literal.String.Double
'"'           Literal.String.Double
'.'           Punctuation
'sprintf'     Name
'('           Punctuation
'['           Punctuation
'entry'       Name
'.'           Punctuation
'key'         Name
','           Punctuation
'entry'       Name
'.'           Punctuation
'val'         Name
']'           Punctuation
')'           Punctuation
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'sb'          Name
'.'           Punctuation
'add'         Name
'('           Punctuation
'"'           Literal.String.Double
'}'           Literal.String.Double
'"'           Literal.String.Double
')'           Punctuation
';'           Punctuation
'\n\n    '    Text
'return'      Keyword
' '           Text
'sb'          Name
'.'           Punctuation
'toString'    Name
'('           Punctuation
')'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'isRed'       Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'n'           Name
' '           Text
'=='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
' '           Text
'return'      Keyword
' '           Text
'false'       Keyword.Constant
';'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'switch'      Keyword
'('           Punctuation
'n'           Name
'.'           Punctuation
'color'       Name
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'case'        Keyword
' '           Text
'red'         Name
':'           Punctuation
' '           Text
''            Keyword
'true'        Keyword.Constant
';'           Punctuation
'\n      '    Text
'case'        Keyword
' '           Text
'black'       Name
':'           Punctuation
' '           Text
''            Keyword
'false'       Keyword.Constant
';'           Punctuation
'\n    '      Text
'}'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'inline'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'isBlack'     Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'!'           Operator
'isRed'       Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'colorFlip'   Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'n'           Name
'.'           Punctuation
'color'       Name
' '           Text
'='           Operator
' '           Text
'oppositeColor' Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'color'       Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'n'           Name
'.'           Punctuation
'left'        Name
'.'           Punctuation
'color'       Name
' '           Text
'='           Operator
' '           Text
'oppositeColor' Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
'.'           Punctuation
'color'       Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'n'           Name
'.'           Punctuation
'right'       Name
'.'           Punctuation
'color'       Name
' '           Text
'='           Operator
' '           Text
'oppositeColor' Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
'.'           Punctuation
'color'       Name
')'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'inline'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'oppositeColor' Name.Function
'('           Punctuation
' '           Text
'c'           Name
' '           Text
':'           Punctuation
'Color'       Name
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'switch'      Keyword
'('           Punctuation
'c'           Name
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'case'        Keyword
' '           Text
'red'         Name
':'           Punctuation
' '           Text
''            Keyword
'black'       Name
';'           Punctuation
'\n      '    Text
'case'        Keyword
' '           Text
'black'       Name
':'           Punctuation
' '           Text
''            Keyword
'red'         Name
';'           Punctuation
'\n    '      Text
'}'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'rotateLeft'  Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'Debug'       Name
'.'           Punctuation
'assert'      Name
'('           Punctuation
'n'           Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
')'           Punctuation
';'           Punctuation
'\n    '      Text
'Debug'       Name
'.'           Punctuation
'assert'      Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
')'           Punctuation
';'           Punctuation
'\n    '      Text
'/*\n           n            x\n          / \\          / \\\n         a   x   =>   n   c\n            / \\      / \\\n           b   c    a   b\n    */' Comment.Multiline
'\n    '      Text
'var'         Keyword.Declaration
' '           Text
'x'           Text
' '           Text
'='           Operator
' '           Text
'n'           Name
'.'           Punctuation
'right'       Name
';'           Punctuation
'\n    '      Text
'n'           Name
'.'           Punctuation
'right'       Name
' '           Text
'='           Operator
' '           Text
'x'           Name
'.'           Punctuation
'left'        Name
';'           Punctuation
'\n    '      Text
'x'           Name
'.'           Punctuation
'left'        Name
'  '          Text
'='           Operator
' '           Text
'n'           Name
';'           Punctuation
'\n    '      Text
'x'           Name
'.'           Punctuation
'color'       Name
' '           Text
'='           Operator
' '           Text
'n'           Name
'.'           Punctuation
'color'       Name
';'           Punctuation
'\n    '      Text
'n'           Name
'.'           Punctuation
'color'       Name
' '           Text
'='           Operator
' '           Text
'red'         Name
';'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'x'           Name
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'rotateRight' Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'Debug'       Name
'.'           Punctuation
'assert'      Name
'('           Punctuation
' '           Text
'n'           Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
';'           Punctuation
'\n    '      Text
'Debug'       Name
'.'           Punctuation
'assert'      Name
'('           Punctuation
' '           Text
'n'           Name
'.'           Punctuation
'left'        Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
';'           Punctuation
'\n    '      Text
'/*\n           n          x\n          / \\        / \\\n         x   c  =>  a   n\n        / \\            / \\\n       a   b          b   c\n    */' Comment.Multiline
'\n    '      Text
'var'         Keyword.Declaration
' '           Text
'x'           Text
' '           Text
'='           Operator
' '           Text
'n'           Name
'.'           Punctuation
'left'        Name
';'           Punctuation
'\n    '      Text
'n'           Name
'.'           Punctuation
'left'        Name
' '           Text
'='           Operator
' '           Text
'x'           Name
'.'           Punctuation
'right'       Name
';'           Punctuation
'\n    '      Text
'x'           Name
'.'           Punctuation
'right'       Name
' '           Text
'='           Operator
' '           Text
'n'           Name
';'           Punctuation
'\n    '      Text
'x'           Name
'.'           Punctuation
'color'       Name
' '           Text
'='           Operator
' '           Text
'n'           Name
'.'           Punctuation
'color'       Name
';'           Punctuation
'\n    '      Text
'n'           Name
'.'           Punctuation
'color'       Name
' '           Text
'='           Operator
' '           Text
'red'         Name
';'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'x'           Name
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'moveRedLeft' Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'//borrow extra node from right child (which is a 3-node)' Comment.Single
'\n    '      Text
'colorFlip'   Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'isRed'       Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
'.'           Punctuation
'left'        Name
')'           Punctuation
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'n'           Name
'.'           Punctuation
'right'       Name
' '           Text
'='           Operator
' '           Text
'rotateRight' Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
')'           Punctuation
';'           Punctuation
'\n      '    Text
'n'           Name
' '           Text
'='           Operator
' '           Text
'rotateLeft'  Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n      '    Text
'colorFlip'   Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'n'           Name
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'moveRedRight' Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'//borrow extra node from left child (which is a 3-node)' Comment.Single
'\n    '      Text
'colorFlip'   Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'isRed'       Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
'.'           Punctuation
'left'        Name
')'           Punctuation
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'n'           Name
' '           Text
'='           Operator
' '           Text
'rotateRight' Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n      '    Text
'colorFlip'   Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'n'           Name
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'fixInvariants' Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'isRed'       Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
')'           Punctuation
' '           Text
'&&'          Operator
' '           Text
'isBlack'     Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
')'           Punctuation
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'//ensure left-leaning property' Comment.Single
'\n      '    Text
'n'           Name
' '           Text
'='           Operator
' '           Text
'rotateLeft'  Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'isRed'       Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
')'           Punctuation
' '           Text
'&&'          Operator
' '           Text
'isRed'       Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
'.'           Punctuation
'left'        Name
')'           Punctuation
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'//balance 4-node' Comment.Single
'\n      '    Text
'n'           Name
' '           Text
'='           Operator
' '           Text
'rotateRight' Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'isRed'       Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
')'           Punctuation
' '           Text
'&&'          Operator
' '           Text
'isRed'       Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
')'           Punctuation
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'//split 4-node' Comment.Single
'\n      '    Text
'colorFlip'   Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'n'           Name
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'deleteMinNode' Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'n'           Name
'.'           Punctuation
'left'        Name
' '           Text
'=='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'//delete'    Comment.Single
'\n      '    Text
'--'          Operator
'nodeCount'   Name
';'           Punctuation
'\n      '    Text
'return'      Keyword
' '           Text
'null'        Keyword.Constant
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n\n    '    Text
'if'          Keyword
'('           Punctuation
' '           Text
'isBlack'     Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
')'           Punctuation
' '           Text
'&&'          Operator
' '           Text
'isBlack'     Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
'.'           Punctuation
'left'        Name
')'           Punctuation
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'n'           Name
' '           Text
'='           Operator
' '           Text
'moveRedLeft' Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n\n    '    Text
'n'           Name
'.'           Punctuation
'left'        Name
' '           Text
'='           Operator
' '           Text
'deleteMinNode' Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
')'           Punctuation
';'           Punctuation
'\n\n    '    Text
'return'      Keyword
' '           Text
'fixInvariants' Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'minNode'     Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'Debug'       Name
'.'           Punctuation
'assert'      Name
'('           Punctuation
'n'           Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
')'           Punctuation
';'           Punctuation
'\n\n    '    Text
'while'       Keyword
'('           Punctuation
' '           Text
'n'           Name
'.'           Punctuation
'left'        Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'n'           Name
' '           Text
'='           Operator
' '           Text
'n'           Name
'.'           Punctuation
'left'        Name
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'n'           Name
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'maxNode'     Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'Debug'       Name
'.'           Punctuation
'assert'      Name
'('           Punctuation
'n'           Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
')'           Punctuation
';'           Punctuation
'\n\n    '    Text
'while'       Keyword
'('           Punctuation
' '           Text
'n'           Name
'.'           Punctuation
'right'       Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'n'           Name
' '           Text
'='           Operator
' '           Text
'n'           Name
'.'           Punctuation
'right'       Name
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'n'           Name
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'/** Used to verify that the invariants of the tree hold **/' Comment.Multiline
'\n  '        Text
'private'     Keyword.Declaration
' '           Text
'inline'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'assertInvariants' Name.Function
'('           Punctuation
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n  '        Text
'#if'         Comment.Preproc
' '           Comment.Preproc
'DEBUG'       Comment.Preproc
'\n    '      Text
'Debug'       Name
'.'           Punctuation
'assert'      Name
'('           Punctuation
' '           Text
'isBlack'     Name
'('           Punctuation
'root'        Name
')'           Punctuation
','           Punctuation
' '           Text
'"'           Literal.String.Double
'r'           Literal.String.Double
'o'           Literal.String.Double
'o'           Literal.String.Double
't'           Literal.String.Double
' '           Literal.String.Double
'i'           Literal.String.Double
's'           Literal.String.Double
' '           Literal.String.Double
'b'           Literal.String.Double
'l'           Literal.String.Double
'a'           Literal.String.Double
'c'           Literal.String.Double
'k'           Literal.String.Double
':'           Literal.String.Double
' '           Literal.String.Double
'"'           Literal.String.Double
' '           Text
'+'           Operator
' '           Text
'root'        Name
' '           Text
')'           Punctuation
';'           Punctuation
'\n\n    '    Text
'assertIsTree' Name
'('           Punctuation
'root'        Name
','           Punctuation
'new'         Keyword
' '           Text
'List'        Name
'<'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'>'           Punctuation
'('           Punctuation
')'           Punctuation
')'           Punctuation
';'           Punctuation
'\n    '      Text
'assertBlackNodeCount' Name
'('           Punctuation
'root'        Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'assertBSTOrdering' Name
'('           Punctuation
'root'        Name
','           Punctuation
'comp'        Name
')'           Punctuation
';'           Punctuation
'\n  '        Text
'#end'        Comment.Preproc
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'assertIsTree' Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
':'           Punctuation
' '           Text
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
','           Punctuation
' '           Text
'visited'     Name
' '           Text
':'           Punctuation
'List'        Name
'<'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'n'           Name
' '           Text
'=='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'return'      Keyword
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n\n    '    Text
'for'         Keyword
'('           Punctuation
' '           Text
'r'           Name
' '           Text
'in'          Keyword
' '           Text
'visited'     Name
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'Debug'       Name
'.'           Punctuation
'assert'      Name
'('           Punctuation
' '           Text
'n'           Name
' '           Text
'!='          Operator
' '           Text
'r'           Name
' '           Text
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'visited'     Name
'.'           Punctuation
'push'        Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'assertIsTree' Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
','           Punctuation
'visited'     Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'assertIsTree' Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
','           Punctuation
'visited'     Name
')'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'assertBlackNodeCount' Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
':'           Punctuation
' '           Text
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
' '           Text
':'           Punctuation
'Int'         Name
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'n'           Name
' '           Text
'=='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'return'      Keyword
' '           Text
'1'           Literal.Number.Integer
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n\n    '    Text
'var'         Keyword.Declaration
' '           Text
'leftCount'   Text
'  '          Text
'='           Operator
' '           Text
'assertBlackNodeCount' Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'var'         Keyword.Declaration
' '           Text
'rightCount'  Text
' '           Text
'='           Operator
' '           Text
'assertBlackNodeCount' Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
')'           Punctuation
';'           Punctuation
'\n\n    '    Text
'Debug'       Name
'.'           Punctuation
'assert'      Name
'('           Punctuation
'\n      '    Text
'leftCount'   Name
' '           Text
'=='          Operator
' '           Text
'rightCount'  Name
','           Punctuation
'\n      '    Text
'"'           Literal.String.Double
'n'           Literal.String.Double
'u'           Literal.String.Double
'm'           Literal.String.Double
' '           Literal.String.Double
'o'           Literal.String.Double
'f'           Literal.String.Double
' '           Literal.String.Double
'b'           Literal.String.Double
'l'           Literal.String.Double
'a'           Literal.String.Double
'c'           Literal.String.Double
'k'           Literal.String.Double
' '           Literal.String.Double
'n'           Literal.String.Double
'o'           Literal.String.Double
'd'           Literal.String.Double
'e'           Literal.String.Double
's'           Literal.String.Double
' '           Literal.String.Double
'i'           Literal.String.Double
'n'           Literal.String.Double
' '           Literal.String.Double
'a'           Literal.String.Double
'l'           Literal.String.Double
'l'           Literal.String.Double
' '           Literal.String.Double
'p'           Literal.String.Double
'a'           Literal.String.Double
't'           Literal.String.Double
'h'           Literal.String.Double
's'           Literal.String.Double
' '           Literal.String.Double
'f'           Literal.String.Double
'o'           Literal.String.Double
'r'           Literal.String.Double
' '           Literal.String.Double
'l'           Literal.String.Double
'e'           Literal.String.Double
'f'           Literal.String.Double
't'           Literal.String.Double
' '           Literal.String.Double
'a'           Literal.String.Double
'n'           Literal.String.Double
'd'           Literal.String.Double
' '           Literal.String.Double
'r'           Literal.String.Double
'i'           Literal.String.Double
'g'           Literal.String.Double
'h'           Literal.String.Double
't'           Literal.String.Double
' '           Literal.String.Double
'c'           Literal.String.Double
'h'           Literal.String.Double
'i'           Literal.String.Double
'l'           Literal.String.Double
'd'           Literal.String.Double
' '           Literal.String.Double
'n'           Literal.String.Double
'o'           Literal.String.Double
't'           Literal.String.Double
' '           Literal.String.Double
'e'           Literal.String.Double
'q'           Literal.String.Double
'u'           Literal.String.Double
'a'           Literal.String.Double
'l'           Literal.String.Double
'"'           Literal.String.Double
' '           Text
'+'           Operator
' '           Text
'n'           Name
'\n    '      Text
')'           Punctuation
';'           Punctuation
'\n\n    '    Text
'return'      Keyword
' '           Text
'leftCount'   Name
' '           Text
'+'           Operator
' '           Text
'switch'      Keyword
'('           Punctuation
'n'           Name
'.'           Punctuation
'color'       Name
')'           Punctuation
' '           Text
'{'           Punctuation
'\n      '    Text
'case'        Keyword
' '           Text
'red'         Name
':'           Punctuation
' '           Text
''            Keyword
'0'           Literal.Number.Integer
';'           Punctuation
'\n      '    Text
'case'        Keyword
' '           Text
'black'       Name
':'           Punctuation
' '           Text
''            Keyword
'1'           Literal.Number.Integer
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'static'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'assertBSTOrdering' Name.Function
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'('           Punctuation
' '           Text
'n'           Name
':'           Punctuation
' '           Text
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
','           Punctuation
' '           Text
'compK'       Name
' '           Text
':'           Punctuation
'K'           Name
' '           Text
'->'          Punctuation
' '           Text
'K'           Name
' '           Text
'->'          Punctuation
' '           Text
'Int'         Name
' '           Text
')'           Punctuation
' '           Text
':'           Punctuation
'Void'        Name
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'n'           Name
' '           Text
'=='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'return'      Keyword
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n\n    '    Text
'if'          Keyword
'('           Punctuation
' '           Text
'n'           Name
'.'           Punctuation
'left'        Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
'&&'          Operator
' '           Text
'n'           Name
'.'           Punctuation
'left'        Name
'.'           Punctuation
'val'         Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'Debug'       Name
'.'           Punctuation
'assert'      Name
'('           Punctuation
' '           Text
'compK'       Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
'.'           Punctuation
'key'         Name
','           Punctuation
'n'           Name
'.'           Punctuation
'key'         Name
')'           Punctuation
' '           Text
'<'           Operator
' '           Text
'0'           Literal.Number.Integer
','           Punctuation
' '           Text
'"'           Literal.String.Double
'l'           Literal.String.Double
'e'           Literal.String.Double
'f'           Literal.String.Double
't'           Literal.String.Double
' '           Literal.String.Double
'c'           Literal.String.Double
'h'           Literal.String.Double
'i'           Literal.String.Double
'l'           Literal.String.Double
'd'           Literal.String.Double
' '           Literal.String.Double
'n'           Literal.String.Double
'o'           Literal.String.Double
't'           Literal.String.Double
' '           Literal.String.Double
'l'           Literal.String.Double
'e'           Literal.String.Double
's'           Literal.String.Double
's'           Literal.String.Double
' '           Literal.String.Double
't'           Literal.String.Double
'h'           Literal.String.Double
'a'           Literal.String.Double
'n'           Literal.String.Double
' '           Literal.String.Double
'i'           Literal.String.Double
't'           Literal.String.Double
's'           Literal.String.Double
' '           Literal.String.Double
'p'           Literal.String.Double
'a'           Literal.String.Double
'r'           Literal.String.Double
'e'           Literal.String.Double
'n'           Literal.String.Double
't'           Literal.String.Double
'"'           Literal.String.Double
' '           Text
'+'           Operator
' '           Text
'n'           Name
' '           Text
')'           Punctuation
';'           Punctuation
'\n      '    Text
'assertBSTOrdering' Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'left'        Name
','           Punctuation
'compK'       Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n\n    '    Text
'if'          Keyword
'('           Punctuation
' '           Text
'n'           Name
'.'           Punctuation
'right'       Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
'&&'          Operator
' '           Text
'n'           Name
'.'           Punctuation
'right'       Name
'.'           Punctuation
'val'         Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'Debug'       Name
'.'           Punctuation
'assert'      Name
'('           Punctuation
' '           Text
'compK'       Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'key'         Name
','           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
'.'           Punctuation
'key'         Name
')'           Punctuation
' '           Text
'<'           Operator
' '           Text
'0'           Literal.Number.Integer
','           Punctuation
' '           Text
'"'           Literal.String.Double
'p'           Literal.String.Double
'a'           Literal.String.Double
'r'           Literal.String.Double
'e'           Literal.String.Double
'n'           Literal.String.Double
't'           Literal.String.Double
' '           Literal.String.Double
'n'           Literal.String.Double
'o'           Literal.String.Double
't'           Literal.String.Double
' '           Literal.String.Double
'l'           Literal.String.Double
'e'           Literal.String.Double
's'           Literal.String.Double
's'           Literal.String.Double
' '           Literal.String.Double
't'           Literal.String.Double
'h'           Literal.String.Double
'a'           Literal.String.Double
'n'           Literal.String.Double
' '           Literal.String.Double
'i'           Literal.String.Double
't'           Literal.String.Double
's'           Literal.String.Double
' '           Literal.String.Double
'r'           Literal.String.Double
'i'           Literal.String.Double
'g'           Literal.String.Double
'h'           Literal.String.Double
't'           Literal.String.Double
' '           Literal.String.Double
'c'           Literal.String.Double
'h'           Literal.String.Double
'i'           Literal.String.Double
'l'           Literal.String.Double
'd'           Literal.String.Double
'"'           Literal.String.Double
' '           Text
'+'           Operator
' '           Text
'n'           Name
' '           Text
')'           Punctuation
';'           Punctuation
'\n      '    Text
'assertBSTOrdering' Name
'('           Punctuation
'n'           Name
'.'           Punctuation
'right'       Name
','           Punctuation
'compK'       Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n'          Text

'}'           Punctuation
'\n\n'        Text

'private'     Keyword.Declaration
' '           Text
'enum'        Keyword.Declaration
' '           Text
'Color'       Name
'\n'          Text

'{'           Punctuation
'\n  '        Text
'red'         Name
';'           Punctuation
'\n  '        Text
'black'       Name
';'           Punctuation
'\n'          Text

'}'           Punctuation
'\n\n'        Text

'private'     Keyword.Declaration
' '           Text
'class'       Keyword.Declaration
' '           Text
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
'/*implements Entry<K,V>*/' Comment.Multiline
'\n'          Text

'{'           Punctuation
'\n  '        Text
'public'      Keyword.Declaration
' '           Text
'var'         Keyword.Declaration
' '           Text
'left'        Text
'   '         Text
':'           Punctuation
'Null'        Name
'<'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'>'           Punctuation
';'           Punctuation
'\n  '        Text
'public'      Keyword.Declaration
' '           Text
'var'         Keyword.Declaration
' '           Text
'right'       Text
'  '          Text
':'           Punctuation
'Null'        Name
'<'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'>'           Punctuation
';'           Punctuation
'\n  '        Text
'public'      Keyword.Declaration
' '           Text
'var'         Keyword.Declaration
' '           Text
'color'       Text
'  '          Text
':'           Punctuation
'Color'       Name
';'           Punctuation
'\n\n  '      Text
'public'      Keyword.Declaration
' '           Text
'var'         Keyword.Declaration
' '           Text
'key'         Text
' '           Text
':'           Punctuation
'K'           Name
';'           Punctuation
'\n  '        Text
'public'      Keyword.Declaration
' '           Text
'var'         Keyword.Declaration
' '           Text
'val'         Text
' '           Text
':'           Punctuation
'V'           Name
';'           Punctuation
'\n\n  '      Text
'public'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'new'         Name.Function
'('           Punctuation
'k'           Name
' '           Text
':'           Punctuation
'K'           Name
','           Punctuation
' '           Text
'v'           Name
' '           Text
':'           Punctuation
'V'           Name
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'key'         Name
' '           Text
'='           Operator
' '           Text
'k'           Name
';'           Punctuation
'\n    '      Text
'val'         Name
' '           Text
'='           Operator
' '           Text
'v'           Name
';'           Punctuation
'\n    '      Text
'color'       Name
' '           Text
'='           Operator
' '           Text
'red'         Name
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n'          Text

'}'           Punctuation
'\n\n'        Text

'private'     Keyword.Declaration
' '           Text
'class'       Keyword.Declaration
' '           Text
'NodeIterator' Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'\n'          Text

'{'           Punctuation
'\n  '        Text
'private'     Keyword.Declaration
' '           Text
'var'         Keyword.Declaration
' '           Text
'curr'        Text
'   '         Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
';'           Punctuation
'\n  '        Text
'private'     Keyword.Declaration
' '           Text
'var'         Keyword.Declaration
' '           Text
'fringe'      Text
' '           Text
':'           Punctuation
'Array'       Name
'<'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'>'           Punctuation
';'           Punctuation
'\n\n  '      Text
'public'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'new'         Name.Function
'('           Punctuation
' '           Text
'root'        Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'fringe'      Name
' '           Text
'='           Operator
' '           Text
'new'         Keyword
' '           Text
'Array'       Name
'<'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'>'           Punctuation
'('           Punctuation
')'           Punctuation
';'           Punctuation
'\n    '      Text
'traverseToMin' Name
'('           Punctuation
'root'        Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'curr'        Name
' '           Text
'='           Operator
' '           Text
'fringe'      Name
'.'           Punctuation
'pop'         Name
'('           Punctuation
')'           Punctuation
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'public'      Keyword.Declaration
' '           Text
'inline'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'hasNext'     Name.Function
'('           Punctuation
')'           Punctuation
' '           Text
':'           Punctuation
'Bool'        Name
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'return'      Keyword
' '           Text
'curr'        Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'public'      Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'next'        Name.Function
'('           Punctuation
')'           Punctuation
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'if'          Keyword
'('           Punctuation
' '           Text
'!'           Operator
'hasNext'     Name
'('           Punctuation
')'           Punctuation
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'throw'       Keyword
' '           Text
'new'         Keyword
' '           Text
'NoSuchElement' Name
'('           Punctuation
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'var'         Keyword.Declaration
' '           Text
'ret'         Text
' '           Text
'='           Operator
' '           Text
'curr'        Name
';'           Punctuation
'\n\n    '    Text
'if'          Keyword
'('           Punctuation
' '           Text
'fringe'      Name
'.'           Punctuation
'length'      Name
' '           Text
'>'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'curr'        Name
' '           Text
'='           Operator
' '           Text
'fringe'      Name
'.'           Punctuation
'pop'         Name
'('           Punctuation
')'           Punctuation
';'           Punctuation
'\n      '    Text
'traverseToMin' Name
'('           Punctuation
'curr'        Name
'.'           Punctuation
'right'       Name
')'           Punctuation
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n    '      Text
'else'        Keyword
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'curr'        Name
' '           Text
'='           Operator
' '           Text
'null'        Keyword.Constant
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n\n    '    Text
'return'      Keyword
' '           Text
'ret'         Name
';'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n\n  '      Text
'private'     Keyword.Declaration
' '           Text
'function'    Keyword.Declaration
' '           Text
'traverseToMin' Name.Function
'('           Punctuation
' '           Text
'n'           Name
' '           Text
':'           Punctuation
'Node'        Name
'<'           Punctuation
'K'           Name
','           Punctuation
'V'           Name
'>'           Punctuation
' '           Text
')'           Punctuation
'\n  '        Text
'{'           Punctuation
'\n    '      Text
'while'       Keyword
'('           Punctuation
' '           Text
'n'           Name
' '           Text
'!='          Operator
' '           Text
'null'        Keyword.Constant
' '           Text
')'           Punctuation
'\n    '      Text
'{'           Punctuation
'\n      '    Text
'fringe'      Name
'.'           Punctuation
'push'        Name
'('           Punctuation
'n'           Name
')'           Punctuation
';'           Punctuation
'\n      '    Text
'n'           Name
' '           Text
'='           Operator
' '           Text
'n'           Name
'.'           Punctuation
'left'        Name
';'           Punctuation
'\n    '      Text
'}'           Punctuation
'\n  '        Text
'}'           Punctuation
'\n'          Text

'}'           Punctuation
'\n'          Text
