text: 'use strict';
  
  var chars = {},
      unesc,
      temp;
  
  function reverse(object, prepender) {
    return Object.keys(object).reduce(function (reversed, key) {
      var newKey = prepender ? prepender + key : key; // Optionally prepend a string to key.
      reversed[object[key]] = newKey; // Swap key and value.
      return reversed; // Return the result.
    }, {});
  }
  
  /**
   * Regex for common characters
   */
  
  chars.escapeRegex = {
    '?': /\?/g,
    '@': /\@/g,
    '!': /\!/g,
    '+': /\+/g,
    '*': /\*/g,
    '(': /\(/g,
    ')': /\)/g,
    '[': /\[/g,
    ']': /\]/g
  };
  
  /**
   * Escape characters
   */
  
  chars.ESC = {
    '?': '__UNESC_QMRK__',
    '@': '__UNESC_AMPE__',
    '!': '__UNESC_EXCL__',
    '+': '__UNESC_PLUS__',
    '*': '__UNESC_STAR__',
    ',': '__UNESC_COMMA__',
    '(': '__UNESC_LTPAREN__',
    ')': '__UNESC_RTPAREN__',
    '[': '__UNESC_LTBRACK__',
    ']': '__UNESC_RTBRACK__'
  };
  
  /**
   * Unescape characters
   */
  
  chars.UNESC = unesc || (unesc = reverse(chars.ESC, '\\'));
  
  chars.ESC_TEMP = {
    '?': '__TEMP_QMRK__',
    '@': '__TEMP_AMPE__',
    '!': '__TEMP_EXCL__',
    '*': '__TEMP_STAR__',
    '+': '__TEMP_PLUS__',
    ',': '__TEMP_COMMA__',
    '(': '__TEMP_LTPAREN__',
    ')': '__TEMP_RTPAREN__',
    '[': '__TEMP_LTBRACK__',
    ']': '__TEMP_RTBRACK__'
  };
  
  chars.TEMP = temp || (temp = reverse(chars.ESC_TEMP));
  
  module.exports = chars;