text: "use strict";
  
  /**
   * Common type constants.
   * @namespace
   */
  var types = exports;
  
  var util = require("./util");
  
  var s = [
      "double",   // 0
      "float",    // 1
      "int32",    // 2
      "uint32",   // 3
      "sint32",   // 4
      "fixed32",  // 5
      "sfixed32", // 6
      "int64",    // 7
      "uint64",   // 8
      "sint64",   // 9
      "fixed64",  // 10
      "sfixed64", // 11
      "bool",     // 12
      "string",   // 13
      "bytes",    // 14
      "message"   // 15
  ];
  
  function bake(values, offset) {
      var i = 0, o = {};
      offset |= 0;
      while (i < values.length) o[s[i + offset]] = values[i++];
      return o;
  }
  
  /**
   * Basic type wire types.
   * @type {Object.<string,number>}
   * @property {number} double=1 Fixed64 wire type
   * @property {number} float=5 Fixed32 wire type
   * @property {number} int32=0 Varint wire type
   * @property {number} uint32=0 Varint wire type
   * @property {number} sint32=0 Varint wire type
   * @property {number} fixed32=5 Fixed32 wire type
   * @property {number} sfixed32=5 Fixed32 wire type
   * @property {number} int64=0 Varint wire type
   * @property {number} uint64=0 Varint wire type
   * @property {number} sint64=0 Varint wire type
   * @property {number} fixed64=1 Fixed64 wire type
   * @property {number} sfixed64=1 Fixed64 wire type
   * @property {number} bool=0 Varint wire type
   * @property {number} string=2 Ldelim wire type
   * @property {number} bytes=2 Ldelim wire type
   */
  types.basic = bake([
      /* double   */ 1,
      /* float    */ 5,
      /* int32    */ 0,
      /* uint32   */ 0,
      /* sint32   */ 0,
      /* fixed32  */ 5,
      /* sfixed32 */ 5,
      /* int64    */ 0,
      /* uint64   */ 0,
      /* sint64   */ 0,
      /* fixed64  */ 1,
      /* sfixed64 */ 1,
      /* bool     */ 0,
      /* string   */ 2,
      /* bytes    */ 2
  ]);
  
  /**
   * Basic type defaults.
   * @type {Object.<string,*>}
   * @property {number} double=0 Double default
   * @property {number} float=0 Float default
   * @property {number} int32=0 Int32 default
   * @property {number} uint32=0 Uint32 default
   * @property {number} sint32=0 Sint32 default
   * @property {number} fixed32=0 Fixed32 default
   * @property {number} sfixed32=0 Sfixed32 default
   * @property {number} int64=0 Int64 default
   * @property {number} uint64=0 Uint64 default
   * @property {number} sint64=0 Sint32 default
   * @property {number} fixed64=0 Fixed64 default
   * @property {number} sfixed64=0 Sfixed64 default
   * @property {boolean} bool=false Bool default
   * @property {string} string="" String default
   * @property {Array.<number>} bytes=Array(0) Bytes default
   * @property {Message} message=null Message default
   */
  types.defaults = bake([
      /* double   */ 0,
      /* float    */ 0,
      /* int32    */ 0,
      /* uint32   */ 0,
      /* sint32   */ 0,
      /* fixed32  */ 0,
      /* sfixed32 */ 0,
      /* int64    */ 0,
      /* uint64   */ 0,
      /* sint64   */ 0,
      /* fixed64  */ 0,
      /* sfixed64 */ 0,
      /* bool     */ false,
      /* string   */ "",
      /* bytes    */ util.emptyArray,
      /* message  */ null
  ]);
  
  /**
   * Basic long type wire types.
   * @type {Object.<string,number>}
   * @property {number} int64=0 Varint wire type
   * @property {number} uint64=0 Varint wire type
   * @property {number} sint64=0 Varint wire type
   * @property {number} fixed64=1 Fixed64 wire type
   * @property {number} sfixed64=1 Fixed64 wire type
   */
  types.long = bake([
      /* int64    */ 0,
      /* uint64   */ 0,
      /* sint64   */ 0,
      /* fixed64  */ 1,
      /* sfixed64 */ 1
  ], 7);
  
  /**
   * Allowed types for map keys with their associated wire type.
   * @type {Object.<string,number>}
   * @property {number} int32=0 Varint wire type
   * @property {number} uint32=0 Varint wire type
   * @property {number} sint32=0 Varint wire type
   * @property {number} fixed32=5 Fixed32 wire type
   * @property {number} sfixed32=5 Fixed32 wire type
   * @property {number} int64=0 Varint wire type
   * @property {number} uint64=0 Varint wire type
   * @property {number} sint64=0 Varint wire type
   * @property {number} fixed64=1 Fixed64 wire type
   * @property {number} sfixed64=1 Fixed64 wire type
   * @property {number} bool=0 Varint wire type
   * @property {number} string=2 Ldelim wire type
   */
  types.mapKey = bake([
      /* int32    */ 0,
      /* uint32   */ 0,
      /* sint32   */ 0,
      /* fixed32  */ 5,
      /* sfixed32 */ 5,
      /* int64    */ 0,
      /* uint64   */ 0,
      /* sint64   */ 0,
      /* fixed64  */ 1,
      /* sfixed64 */ 1,
      /* bool     */ 0,
      /* string   */ 2
  ], 2);
  
  /**
   * Allowed types for packed repeated fields with their associated wire type.
   * @type {Object.<string,number>}
   * @property {number} double=1 Fixed64 wire type
   * @property {number} float=5 Fixed32 wire type
   * @property {number} int32=0 Varint wire type
   * @property {number} uint32=0 Varint wire type
   * @property {number} sint32=0 Varint wire type
   * @property {number} fixed32=5 Fixed32 wire type
   * @property {number} sfixed32=5 Fixed32 wire type
   * @property {number} int64=0 Varint wire type
   * @property {number} uint64=0 Varint wire type
   * @property {number} sint64=0 Varint wire type
   * @property {number} fixed64=1 Fixed64 wire type
   * @property {number} sfixed64=1 Fixed64 wire type
   * @property {number} bool=0 Varint wire type
   */
  types.packed = bake([
      /* double   */ 1,
      /* float    */ 5,
      /* int32    */ 0,
      /* uint32   */ 0,
      /* sint32   */ 0,
      /* fixed32  */ 5,
      /* sfixed32 */ 5,
      /* int64    */ 0,
      /* uint64   */ 0,
      /* sint64   */ 0,
      /* fixed64  */ 1,
      /* sfixed64 */ 1,
      /* bool     */ 0
  ]);
  