old_contents: 'use strict';
  
  var d              = require('d')
    , validateSymbol = require('./validate-symbol')
  
    , create = Object.create, defineProperties = Object.defineProperties
    , defineProperty = Object.defineProperty, objPrototype = Object.prototype
    , Symbol, HiddenSymbol, globalSymbols = create(null);
  
  var generateName = (function () {
  	var created = create(null);
  	return function (desc) {
  		var postfix = 0, name;
  		while (created[desc + (postfix || '')]) ++postfix;
  		desc += (postfix || '');
  		created[desc] = true;
  		name = '@@' + desc;
  		defineProperty(objPrototype, name, d.gs(null, function (value) {
  			defineProperty(this, name, d(value));
  		}));
  		return name;
  	};
  }());
  
  HiddenSymbol = function Symbol(description) {
  	if (this instanceof HiddenSymbol) throw new TypeError('TypeError: Symbol is not a constructor');
  	return Symbol(description);
  };
  module.exports = Symbol = function Symbol(description) {
  	var symbol;
  	if (this instanceof Symbol) throw new TypeError('TypeError: Symbol is not a constructor');
  	symbol = create(HiddenSymbol.prototype);
  	description = (description === undefined ? '' : String(description));
  	return defineProperties(symbol, {
  		__description__: d('', description),
  		__name__: d('', generateName(description))
  	});
  };
  defineProperties(Symbol, {
  	for: d(function (key) {
  		if (globalSymbols[key]) return globalSymbols[key];
  		return (globalSymbols[key] = Symbol(String(key)));
  	}),
  	keyFor: d(function (s) {
  		var key;
  		validateSymbol(s);
  		for (key in globalSymbols) if (globalSymbols[key] === s) return key;
  	}),
  	create: d('', Symbol('create')),
  	hasInstance: d('', Symbol('hasInstance')),
  	isConcatSpreadable: d('', Symbol('isConcatSpreadable')),
  	isRegExp: d('', Symbol('isRegExp')),
  	iterator: d('', Symbol('iterator')),
  	toPrimitive: d('', Symbol('toPrimitive')),
  	toStringTag: d('', Symbol('toStringTag')),
  	unscopables: d('', Symbol('unscopables'))
  });
  defineProperties(HiddenSymbol.prototype, {
  	constructor: d(Symbol),
  	toString: d('', function () { return this.__name__; })
  });
  
  defineProperty(Symbol.prototype, 'toString',
  	d(function () { return 'Symbol (' + this.__description__ + ')'; }));
  defineProperty(Symbol.prototype, Symbol.toPrimitive, d('',
  	function (hint) { throw new TypeError("Conversion of symbol objects is not allowed"); }));
  defineProperty(Symbol.prototype, Symbol.toStringTag, d('c', 'Symbol'));
  
  defineProperty(HiddenSymbol.prototype, Symbol.toPrimitive,
  	d('c', Symbol.prototype[Symbol.toPrimitive]));
  defineProperty(HiddenSymbol.prototype, Symbol.toStringTag,
  	d('c', Symbol.prototype[Symbol.toStringTag]));
  
new_contents: 'use strict';
  
  var d              = require('d')
    , validateSymbol = require('./validate-symbol')
  
    , create = Object.create, defineProperties = Object.defineProperties
    , defineProperty = Object.defineProperty, objPrototype = Object.prototype
    , Symbol, HiddenSymbol, globalSymbols = create(null);
  
  var generateName = (function () {
  	var created = create(null);
  	return function (desc) {
  		var postfix = 0, name;
  		while (created[desc + (postfix || '')]) ++postfix;
  		desc += (postfix || '');
  		created[desc] = true;
  		name = '@@' + desc;
  		defineProperty(objPrototype, name, d.gs(null, function (value) {
  			defineProperty(this, name, d(value));
  		}));
  		return name;
  	};
  }());
  
  HiddenSymbol = function Symbol(description) {
  	if (this instanceof HiddenSymbol) throw new TypeError('TypeError: Symbol is not a constructor');
  	return Symbol(description);
  };
  module.exports = Symbol = function Symbol(description) {
  	var symbol;
  	if (this instanceof Symbol) throw new TypeError('TypeError: Symbol is not a constructor');
  	symbol = create(HiddenSymbol.prototype);
  	description = (description === undefined ? '' : String(description));
  	return defineProperties(symbol, {
  		__description__: d('', description),
  		__name__: d('', generateName(description))
  	});
  };
  defineProperties(Symbol, {
  	for: d(function (key) {
  		if (globalSymbols[key]) return globalSymbols[key];
  		return (globalSymbols[key] = Symbol(String(key)));
  	}),
  	keyFor: d(function (s) {
  		var key;
  		validateSymbol(s);
  		for (key in globalSymbols) if (globalSymbols[key] === s) return key;
  	}),
  	hasInstance: d('', Symbol('hasInstance')),
  	isConcatSpreadable: d('', Symbol('isConcatSpreadable')),
  	isRegExp: d('', Symbol('isRegExp')),
  	iterator: d('', Symbol('iterator')),
  	toPrimitive: d('', Symbol('toPrimitive')),
  	toStringTag: d('', Symbol('toStringTag')),
  	unscopables: d('', Symbol('unscopables'))
  });
  defineProperties(HiddenSymbol.prototype, {
  	constructor: d(Symbol),
  	toString: d('', function () { return this.__name__; })
  });
  
  defineProperty(Symbol.prototype, 'toString',
  	d(function () { return 'Symbol (' + this.__description__ + ')'; }));
  defineProperty(Symbol.prototype, Symbol.toPrimitive, d('',
  	function (hint) { throw new TypeError("Conversion of symbol objects is not allowed"); }));
  defineProperty(Symbol.prototype, Symbol.toStringTag, d('c', 'Symbol'));
  
  defineProperty(HiddenSymbol.prototype, Symbol.toPrimitive,
  	d('c', Symbol.prototype[Symbol.toPrimitive]));
  defineProperty(HiddenSymbol.prototype, Symbol.toStringTag,
  	d('c', Symbol.prototype[Symbol.toStringTag]));
  
subject: Remove Symbol.create