text: 'use strict';
  
  var SourceMapGenerator = require('source-map').SourceMapGenerator;
  var trackNodes = {
      Atrule: true,
      Selector: true,
      Declaration: true
  };
  
  module.exports = function generateSourceMap(generator, ast) {
      var map = new SourceMapGenerator();
      var generated = {
          line: 1,
          column: 0
      };
      var original = {
          line: 0, // should be zero to add first mapping
          column: 0
      };
      var sourceMappingActive = false;
      var activatedGenerated = {
          line: 1,
          column: 0
      };
      var activatedMapping = {
          generated: activatedGenerated
      };
  
      var css = generator(ast, function(node, buffer, line, column) {
          if (!node.loc ||
              !node.loc.start ||
              !trackNodes.hasOwnProperty(node.type)) {
              return;
          }
  
          var nodeLine = node.loc.start.line;
          var nodeColumn = node.loc.start.column - 1;
  
          if (original.line !== nodeLine ||
              original.column !== nodeColumn) {
              original.line = nodeLine;
              original.column = nodeColumn;
  
              generated.line = line;
              generated.column = column;
  
              if (sourceMappingActive) {
                  sourceMappingActive = false;
                  if (generated.line !== activatedGenerated.line ||
                      generated.column !== activatedGenerated.column) {
                      map.addMapping(activatedMapping);
                  }
              }
  
              sourceMappingActive = true;
              map.addMapping({
                  source: node.loc.source,
                  original: original,
                  generated: generated
              });
          }
  
      }, function(node, buffer, line, column) {
          if (sourceMappingActive && trackNodes.hasOwnProperty(node.type)) {
              activatedGenerated.line = line;
              activatedGenerated.column = column;
          }
      });
  
      if (sourceMappingActive) {
          map.addMapping(activatedMapping);
      }
  
      return {
          css: css,
          map: map
      };
  };
  