anchor.diff:  
     Lock;
     try
  -    if not fSavePoints.ContainsKey(aTick) then // Check if we don't have same tick save here too, since we work in multithread enviroment
  +    if not fSavePoints.ContainsKey(aTick) then // Check if we don't have same tick save here too, since we work in multithread environment
         fSavePoints.Add(aTick, TKMSavePoint.Create(aStream, aTick));
     finally
       Unlock;
  
positive.code: 
    TKMSavePointCollection = class
    private
      fAsyncSaveThreadsCnt: Byte; //Number of threads doing save atm. Usually should be not more then 1
      fWaitCS: TCriticalSection;
      fSaveCS: TCriticalSection;
      fSavePoints: TDictionary<Cardinal, TKMSavePoint>;
      //Properties to restore after load saved replay
      fLastTick: Cardinal;
  
      function GetCount(): Integer;
      function GetSavePoint(aTick: Cardinal): TKMSavePoint;
      function GetStream(aTick: Cardinal): TKMemoryStream;
      function GetLastTick: Cardinal;
      procedure SetLastTick(const aLastTick: Cardinal);
    public
      constructor Create();
      destructor Destroy; override;
  
      property LastTick: Cardinal read GetLastTick write SetLastTick;
  
negative.code: end;
  
  
  destructor TKMSavePoint.Destroy;
  begin
    fStream.Free;
  
  