anchor.diff:  
   let rec readCustomInstructionsText(r: TextReader, acc: StringBuilder, childAcc: CustomInstructionsNode list) = 
       match r.Read() with
  -    | -1 -> (acc.ToString(), childAcc)
  +    | -1 -> (acc.ToString().Trim(), childAcc)
       | i ->
           let c = char i
           match c with
  
positive.code:             Array.concat(
                  [|
                      JetSetRadio.ExtractJSRStringsDotStr(path, lessonEntryWithId.ID);
                      // TBD: extract CUSTOM\instructions*.txt
                      JetSetRadio.ExtractStringsFromSrt(path, lessonEntryWithId.ID);
                      JetSetRadio.ExtractStringsFromBinaries(path, lessonEntryWithId.ID)
                      JetSetRadio.ExtractStringsFromAssemblies(path, lessonEntryWithId.ID)
  
negative.code:             |> convertSrtBlockExtractedEntriesToCardRecords(lessonId)
              |> Array.ofSeq
  
      static member private ExtractStringsFromCustomInstructions(path: string, lessonId: int) = 
          let pathsAndLanguages = 
              [|
                  (Path.Combine(path, @"CUSTOM\instructions.txt"), "en");
                  (Path.Combine(path, @"CUSTOM\instructions_DE.txt"), "de");
                  (Path.Combine(path, @"CUSTOM\instructions_ES.txt"), "es");
                  (Path.Combine(path, @"CUSTOM\instructions_FR.txt"), "fr")
              |]
  
          let generateCardsForLanguage(p: string, l: string) = 
              use sr = new StreamReader(p)
              let n = readCustomInstructions(sr)
              getCustomInstructionsStrings(n)
              |> Array.mapi(createCardRecordForCustomInstructionsString(lessonId, l))
  
  
          pathsAndLanguages |> Array.collect generateCardsForLanguage
  
      static member ExtractJetSetRadio(path: string, db: LLDatabase, gameEntryWithId: GameRecord, args: string[]) = 
          let lessonEntry = {
              LessonRecord.GameID = gameEntryWithId.ID;
  