WI.Object=class WebInspectorObject
{constructor()
{this._listeners=null;} 
static addEventListener(eventType,listener,thisObject)
{thisObject=thisObject||null;if(!eventType)
return;if(!listener)
return;if(!this._listeners)
this._listeners=new Map();let listenersTable=this._listeners.get(eventType);if(!listenersTable){listenersTable=new ListMultimap();this._listeners.set(eventType,listenersTable);}
listenersTable.add(thisObject,listener);}
static singleFireEventListener(eventType,listener,thisObject)
{let wrappedCallback=function(){this.removeEventListener(eventType,wrappedCallback,null);listener.apply(thisObject,arguments);}.bind(this);this.addEventListener(eventType,wrappedCallback,null);return wrappedCallback;}
static removeEventListener(eventType,listener,thisObject)
{eventType=eventType||null;listener=listener||null;thisObject=thisObject||null;if(!this._listeners)
return;if(thisObject&&!eventType){this._listeners.forEach(function(listenersTable){let listenerPairs=listenersTable.toArray();for(let i=0,length=listenerPairs.length;i<length;++i){let existingThisObject=listenerPairs[i][0];if(existingThisObject===thisObject)
listenersTable.deleteAll(existingThisObject);}});return;}
let listenersTable=this._listeners.get(eventType);if(!listenersTable||listenersTable.size===0)
return;let didDelete=listenersTable.delete(thisObject,listener);}
static hasEventListeners(eventType)
{if(!this._listeners)
return false;let listenersTable=this._listeners.get(eventType);return listenersTable&&listenersTable.size>0;}
static retainedObjectsWithPrototype(proto)
{let results=new Set;if(this._listeners){this._listeners.forEach(function(listenersTable,eventType){listenersTable.forEach(function(pair){let thisObject=pair[0];if(thisObject instanceof proto)
results.add(thisObject);});});}
return results;} 
addEventListener(){return WI.Object.addEventListener.apply(this,arguments);}
singleFireEventListener(){return WI.Object.singleFireEventListener.apply(this,arguments);}
removeEventListener(){return WI.Object.removeEventListener.apply(this,arguments);}
hasEventListeners(){return WI.Object.hasEventListeners.apply(this,arguments);}
retainedObjectsWithPrototype(){return WI.Object.retainedObjectsWithPrototype.apply(this,arguments);}
dispatchEventToListeners(eventType,eventData)
{let event=new WI.Event(this,eventType,eventData);function dispatch(object)
{if(!object||event._stoppedPropagation)
return;let listenerTypesMap=object._listeners;if(!listenerTypesMap||!object.hasOwnProperty("_listeners"))
return;let listenersTable=listenerTypesMap.get(eventType);if(!listenersTable)
return;let listeners=listenersTable.toArray();for(let i=0,length=listeners.length;i<length;++i){let[thisObject,listener]=listeners[i];listener.call(thisObject,event);if(event._stoppedPropagation)
break;}}
dispatch(this);event._stoppedPropagation=false;let constructor=this.constructor;while(constructor){dispatch(constructor);if(!constructor.prototype.__proto__)
break;constructor=constructor.prototype.__proto__.constructor;}
return event.defaultPrevented;}};WI.Event=class Event
{constructor(target,type,data)
{this.target=target;this.type=type;this.data=data;this.defaultPrevented=false;this._stoppedPropagation=false;}
stopPropagation()
{this._stoppedPropagation=true;}
preventDefault()
{this.defaultPrevented=true;}};WI.notifications=new WI.Object;WI.Notification={GlobalModifierKeysDidChange:"global-modifiers-did-change",PageArchiveStarted:"page-archive-started",PageArchiveEnded:"page-archive-ended",ExtraDomainsActivated:"extra-domains-activated",TabTypesChanged:"tab-types-changed",DebugUIEnabledDidChange:"debug-ui-enabled-did-change",};
