void function(){

var whatKey = function(k){
  // if ('char' in k) {
  //   return function whatKey(e){
  //     return (e.char || '').toLowerCase();
  //   };
  // }
  if ('keyIdentifier' in k) {
    return function whatKey(e){
      return e.keyIdentifier.toLowerCase();
    };
  } else if ('charCode' in k) {
    return function whatKey(e){
      return (e.charCode || '').toLowerCase();
    };
  }
}(document.createEvent('KeyboardEvent'));


function Keyboard(view){
  var self = this;
  this.keys = {};
  this.view = view;
  this.ctrl = false;
  this.shift = false;
  this.alt = false;
  this.meta = false;

  var events = {
    keydown: function(e){
      self.update(e);
      self.emit('down', e);
    },
    keyup: function(e){
      self.update(e);
      self.emit('up', e);
    },
    keypress: function(e){
      self.update(e);
      self.emit('press', e);
    }
  };

  for (var k in events) {
    view.addEventListener(k, events[k], true);
  }
}

Keyboard.prototype = {
  constructor: Keyboard,
  update: function update(evt){
    this.lastKey = whatKey(evt);
    this.lasyEvent = evt;
    this.ctrl = evt.ctrlKey;
    this.shift = evt.shiftKey;
    this.alt = evt.altKey;
    this.meta = evt.metaKey;
  },
  emit: function emit(type, evt){
    var listeners = this.keys[this.lastKey];
    if (listeners) {
      for (var i=0; i < listeners.length; i++) {
        listeners[i](type, evt);
      }
    }
  },
  on: function on(bind, listener){
    var self = this,
        current = 0,
        events = [],
        keys = bind.split('->');

    if (keys.length > 1) {

      keys.forEach(function(key, index){
        var listeners = self.keys[key] || (self.keys[key] = []);
        listeners.push(function(type, evt){
          if (type === 'down') {
            if (events.length === index) {
              events.push(evt);
              if (index === keys.length - 1) {
                listener.apply(self, events);
                events.length = 0;
              }
            }
          } else {
            events.length = 0;
          }
        });
      });

    } else if ((keys = bind.split('+')).length > 1) {

      keys.forEach(function(key, index){
        var listeners = self.keys[key] || (self.keys[key] = []);
        listeners.push(function(type, evt){
          if (evt.type === 'down') {
            current++;
            events[index] = evt;
            if (events.length === keys.length) {
              listener.apply(self, events);
              events.length = 0;
            }
          } else if (type === 'up') {
            current--;
            events[index] = null;
          }
        });
      });

    } else {
      var listeners = self.keys[bind] || (self.keys[bind] = []);
      listeners.push(function(type, evt){
        listener.call(self, evt);
      });
    }
  }
};


window.keyboard = new Keyboard(window);


}();

@@ -15,433 +15,77 @@
 )%7B%0A%0A
-var whatKey = function(k)%7B%0A  // if ('char' in k) %7B%0A  //   return function whatKey(e)%7B%0A  //     return (e.char %7C%7C '').toLowerCase();%0A  //   %7D;%0A  // %7D%0A  if ('keyIdentifier' in k) %7B%0A    return function whatKey(e)%7B%0A      return e.keyIdentifier.toLowerCase();%0A    %7D;%0A  %7D else if ('charCode' in k) %7B%0A    return function whatKey(e)%7B%0A      return (e.charCode %7C%7C '').toLowerCase();%0A    %7D;%0A  %7D%0A%7D(document.createEvent('KeyboardEvent'));
+function whatKey(evt)%7B%0A  return String.fromCharCode(evt.charCode);%0A%7D%0A
 %0A%0A%0Af
@@ -724,17 +724,17 @@
 this.las
-y
+t
 Event = 
@@ -1403,28 +1403,12 @@
 own'
-) %7B%0A            if (
+ && 
 even
@@ -1426,26 +1426,24 @@
 == index) %7B%0A
-  
             
@@ -1468,26 +1468,24 @@
             
-  
 if (index ==
@@ -1511,34 +1511,32 @@
 %7B%0A              
-  
 listener.apply(s
@@ -1541,34 +1541,32 @@
 (self, events);%0A
-  
               ev
@@ -1586,24 +1586,8 @@
  0;%0A
-              %7D%0A
     

fix it