anchor.diff:    private
       FDropBoxPanel: TKMPanel;
       FDropBox: TKMDropList;
  -    FLastIndex: Integer;
  +    FLastIndex: TKMHandStatType;
   
       FOnJumpToPlayer: TIntegerEvent;
       FSetViewportPos: TPointFEvent;
   
  -    FLinesAggregator: array of TKMGameSpectatorItemLinesAggregator;
  -    FLines: array of array[0..MAX_HANDS - 1] of TKMGUIGameSpectatorItemLine;
  -
  -    procedure AddLineType(aParent: TKMPanel; AIndex: Integer; ALineClass: TKMGUIGameSpectatorItemLineClass);
  +    FLinesAggregator: array [TKMHandStatType] of TKMGameSpectatorItemLinesAggregator;
  +    FLines: array [TKMHandStatType] of array [0..MAX_HANDS - 1] of TKMGUIGameSpectatorItemLine;
  +
  +    procedure AddLineType(aParent: TKMPanel; aLineType: TKMHandStatType; ALineClass: TKMGUIGameSpectatorItemLineClass);
       procedure ChangePage(Sender: TObject);
     public
       constructor Create(aParent: TKMPanel; aOnJumpToPlayer: TIntegerEvent; aSetViewportPos: TPointFEvent);
  
positive.code: 
  procedure TKMGUIGameSpectator.UpdateState(aTick: Cardinal);
  var
    I, K: Integer;
  begin
    //Updates could be done every 5 ticks
    if aTick mod 5 <> 0 then Exit;
  
    //Reset all aggregators first
    for I := Low(FLinesAggregator) to High(FLinesAggregator) do
      if FLinesAggregator[I] <> nil then
        FLinesAggregator[I].ResetItems;
  
    //Collect data from lines items - which to show and which not - into aggregator
    for I := Low(FLines) to High(FLines) do
      for K := 0 to Length(FLines[I]) - 1 do
        if FLines[I, K] <> nil then
          FLines[I, K].Update;
  
    //Set visibility for items, by aggregated data
    for I := Low(FLines) to High(FLines) do
      for K := 0 to Length(FLines[I]) - 1 do
        if FLines[I, K] <> nil then
          FLines[I, K].UpdateItemsVisibility;
  
negative.code: 
  destructor TKMGUIGameSpectator.Destroy;
  var
    I: TKMHandStatType;
  begin
    for I := Low(TKMHandStatType) to High(TKMHandStatType) do
      FreeAndNil(FLinesAggregator[I]);
  end;
  
  
  procedure TKMGUIGameSpectator.AddLineType(aParent: TKMPanel; aLineType: TKMHandStatType; ALineClass: TKMGUIGameSpectatorItemLineClass);
  var
    I: Integer;
  begin
    if ALineClass <> nil then
    begin
      FLinesAggregator[aLineType] := TKMGameSpectatorItemLinesAggregator.Create;
      for I := 0 to gHands.Count - 1 do
      begin
        FLines[aLineType, I] := ALineClass.Create(aParent, I, fOnJumpToPlayer, fSetViewportPos, FLinesAggregator[aLineType]);
        FLines[aLineType, I].Visible := False;
        FLinesAggregator[aLineType].SetCount(FLines[aLineType, I].GetTagCount);
      end;
    end;
  end;
  