var allDescriptors=[{"dependencies":["platform","common","host","ui","diff"],"name":"ui_lazy","scripts":[]},{"experiment":"promiseTracker","extensions":[{"name":"promises","title":"Promises","className":"WebInspector.PromisePane","type":"drawer-view","order":30,"persistence":"permanent"}],"name":"promises","dependencies":["components","ui_lazy"],"scripts":[]},{"experiment":"accessibilityInspection","extensions":[{"className":"WebInspector.AccessibilitySidebarView","type":"@WebInspector.Widget","location":"elements-panel","title":"Accessibility"}],"name":"accessibility","dependencies":["elements"],"scripts":[]},{"dependencies":["components","source_frame","snippets","ui_lazy","extensions"],"extensions":[{"className":"WebInspector.SourcesPanelFactory","order":30,"type":"@WebInspector.PanelFactory","name":"sources","title":"Sources"},{"className":"WebInspector.SourcesPanel.ContextMenuProvider","contextTypes":["WebInspector.UISourceCode","WebInspector.UILocation","WebInspector.RemoteObject","WebInspector.NetworkRequest"],"type":"@WebInspector.ContextMenu.Provider"},{"iconClass":"pause-toolbar-item","className":"WebInspector.SourcesPanel.RevealingActionDelegate","contextTypes":["WebInspector.SourcesPanel","WebInspector.ShortcutRegistry.ForwardedShortcut"],"actionId":"debugger.toggle-pause","bindings":[{"platform":"windows,linux","shortcut":"F8 Ctrl+\\"},{"platform":"mac","shortcut":"F8 Meta+\\"}],"type":"@WebInspector.ActionDelegate"},{"iconClass":"step-over-toolbar-item","title":"Step over next function call","className":"WebInspector.SourcesPanel.DebuggingActionDelegate","contextTypes":["WebInspector.SourcesPanel"],"actionId":"debugger.step-over","bindings":[{"platform":"windows,linux","shortcut":"F10 Ctrl+'"},{"platform":"mac","shortcut":"F10 Meta+'"}],"type":"@WebInspector.ActionDelegate"},{"iconClass":"step-in-toolbar-item","title":"Step into next function call","className":"WebInspector.SourcesPanel.DebuggingActionDelegate","contextTypes":["WebInspector.SourcesPanel"],"actionId":"debugger.step-into","bindings":[{"platform":"windows,linux","shortcut":"F11 Ctrl+;"},{"platform":"mac","shortcut":"F11 Meta+;"}],"type":"@WebInspector.ActionDelegate"},{"className":"WebInspector.SourcesPanel.DebuggingActionDelegate","experiment":"stepIntoAsync","contextTypes":["WebInspector.SourcesPanel"],"actionId":"debugger.step-into-async","bindings":[{"platform":"windows,linux","shortcut":"Alt+F11 Alt+Ctrl+;"},{"platform":"mac","shortcut":"Alt+F11 Alt+Meta+;"}],"type":"@WebInspector.ActionDelegate"},{"iconClass":"step-out-toolbar-item","title":"Step out of current function","className":"WebInspector.SourcesPanel.DebuggingActionDelegate","contextTypes":["WebInspector.SourcesPanel"],"actionId":"debugger.step-out","bindings":[{"platform":"windows,linux","shortcut":"Shift+F11 Shift+Ctrl+;"},{"platform":"mac","shortcut":"Shift+F11 Shift+Meta+;"}],"type":"@WebInspector.ActionDelegate"},{"iconClass":"play-toolbar-item","title":"Run snippet","className":"WebInspector.SourcesPanel.DebuggingActionDelegate","contextTypes":["WebInspector.SourcesPanel"],"actionId":"debugger.run-snippet","bindings":[{"platform":"windows,linux","shortcut":"Ctrl+Enter"},{"platform":"mac","shortcut":"Meta+Enter"}],"type":"@WebInspector.ActionDelegate"},{"className":"WebInspector.AdvancedSearchView.ActionDelegate","bindings":[{"platform":"mac","shortcut":"Meta+Alt+F"},{"platform":"windows,linux","shortcut":"Ctrl+Shift+F"}],"type":"@WebInspector.ActionDelegate","actionId":"sources.search.toggle","title":"Search all files"},{"iconClass":"breakpoint-toolbar-item","className":"WebInspector.SourcesPanel.DebuggingActionDelegate","contextTypes":["WebInspector.SourcesPanel"],"actionId":"debugger.toggle-breakpoints-active","bindings":[{"platform":"windows,linux","shortcut":"Ctrl+F8"},{"platform":"mac","shortcut":"Meta+F8"}],"type":"@WebInspector.ActionDelegate"},{"type":"context-menu-item","location":"mainMenu/navigate","actionId":"sources.search.toggle"},{"type":"context-menu-item","location":"navigatorMenu/navigate","actionId":"sources.go-to-source"},{"className":"WebInspector.SourcesPanel.UILocationRevealer","contextTypes":["WebInspector.UILocation"],"type":"@WebInspector.Revealer"},{"className":"WebInspector.SourcesPanel.DebuggerLocationRevealer","contextTypes":["WebInspector.DebuggerModel.Location"],"type":"@WebInspector.Revealer"},{"className":"WebInspector.SourcesPanel.UISourceCodeRevealer","contextTypes":["WebInspector.UISourceCode"],"type":"@WebInspector.Revealer"},{"className":"WebInspector.SourcesPanel.DebuggerPausedDetailsRevealer","contextTypes":["WebInspector.DebuggerPausedDetails"],"type":"@WebInspector.Revealer"},{"className":"WebInspector.InplaceFormatterEditorAction","type":"@WebInspector.SourcesView.EditorAction"},{"className":"WebInspector.ScriptFormatterEditorAction","type":"@WebInspector.SourcesView.EditorAction"},{"name":"sources","title":"Sources","className":"WebInspector.SourcesNavigatorView","type":"navigator-view","order":1,"persistence":"permanent"},{"name":"contentScripts","title":"Content scripts","className":"WebInspector.ContentScriptsNavigatorView","type":"navigator-view","order":2,"persistence":"permanent"},{"name":"snippets","title":"Snippets","className":"WebInspector.SnippetsNavigatorView","type":"navigator-view","order":3,"persistence":"permanent"},{"title":"Go to file...","className":"WebInspector.SourcesPanel.RevealingActionDelegate","actionId":"sources.go-to-source","bindings":[{"platform":"mac","shortcut":"Meta+P Meta+O"},{"platform":"windows,linux","shortcut":"Ctrl+P Ctrl+O"}],"type":"@WebInspector.ActionDelegate","order":100},{"className":"WebInspector.SourcesView.SwitchFileActionDelegate","contextTypes":["WebInspector.SourcesView"],"bindings":[{"shortcut":"Alt+O"}],"type":"@WebInspector.ActionDelegate","actionId":"sources.switch-file"},{"defaultValue":"true","type":"setting","settingName":"navigatorGroupByFolder","settingType":"boolean"},{"category":"Sources","title":"Search in content scripts","defaultValue":false,"settingName":"searchInContentScripts","settingType":"boolean","type":"setting"},{"category":"Sources","title":"Enable JavaScript source maps","defaultValue":true,"settingName":"jsSourceMapsEnabled","settingType":"boolean","type":"setting"},{"category":"Sources","title":"Detect indentation","defaultValue":true,"settingName":"textEditorAutoDetectIndent","settingType":"boolean","type":"setting"},{"category":"Sources","title":"Autocompletion","defaultValue":true,"settingName":"textEditorAutocompletion","settingType":"boolean","type":"setting"},{"category":"Sources","title":"Bracket matching","defaultValue":true,"settingName":"textEditorBracketMatching","settingType":"boolean","type":"setting"},{"category":"Sources","title":"Show whitespace characters:","defaultValue":"original","settingName":"showWhitespacesInEditor","settingType":"enum","type":"setting","options":[["None","none"],["All","all"],["Trailing","trailing"]]},{"category":"Sources","title":"Display variable values inline while debugging","defaultValue":true,"settingName":"inlineVariableValues","settingType":"boolean","type":"setting"},{"category":"Sources","title":"Enable CSS source maps","defaultValue":true,"settingName":"cssSourceMapsEnabled","settingType":"boolean","type":"setting"},{"title":"Auto-reload generated CSS","defaultValue":false,"parentSettingName":"cssSourceMapsEnabled","settingName":"cssReloadEnabled","settingType":"boolean","type":"setting"},{"name":"sources.search","title":"Search","className":"WebInspector.AdvancedSearchView","type":"drawer-view","order":100,"persistence":"closeable"},{"className":"WebInspector.RevisionHistoryView","type":"drawer-view","name":"sources.history","persistence":"temporary","title":"History"}],"name":"sources","scripts":[]},{"dependencies":["platform","ui","host","components"],"extensions":[{"className":"WebInspector.DevicesDialog.ActionDelegate","type":"@WebInspector.ActionDelegate","actionId":"devices.dialog.show","title":"Inspect devices\u2026"},{"actionId":"devices.dialog.show","type":"context-menu-item","location":"mainMenu/tools/open","order":50}],"name":"devices","scripts":[]},{"skip_compilation":["diff_match_patch.js"],"dependencies":["common"],"name":"diff","scripts":[]},{"dependencies":["components","extensions"],"extensions":[{"className":"WebInspector.AuditsPanelFactory","order":90,"type":"@WebInspector.PanelFactory","name":"audits","title":"Audits"}],"name":"audits","scripts":[]},{"dependencies":["sdk","platform","workspace"],"name":"bindings","scripts":[]},{"dependencies":["bindings"],"name":"snippets","scripts":[]},{"dependencies":["timeline"],"extensions":[{"className":"WebInspector.LayersPanelFactory","order":100,"type":"@WebInspector.PanelFactory","name":"layers","title":"Layers"},{"className":"WebInspector.LayersPanel.LayerTreeRevealer","contextTypes":["WebInspector.DeferredLayerTree"],"type":"@WebInspector.Revealer"}],"experiment":"layersPanel","scripts":[],"name":"layers"},{"dependencies":["components","ui_lazy"],"extensions":[{"className":"WebInspector.ConsolePanelFactory","order":20,"type":"@WebInspector.PanelFactory","name":"console","title":"Console"},{"name":"console","title":"Console","className":"WebInspector.ConsolePanel.WrapperView","type":"drawer-view","order":0,"persistence":"permanent"},{"className":"WebInspector.ConsolePanel.ConsoleRevealer","contextTypes":["WebInspector.Console"],"type":"@WebInspector.Revealer"},{"className":"WebInspector.ConsoleView.ActionDelegate","bindings":[{"shortcut":"Ctrl+`"}],"type":"@WebInspector.ActionDelegate","actionId":"console.show"},{"iconClass":"clear-toolbar-item","title":"Clear console","className":"WebInspector.ConsoleView.ActionDelegate","actionId":"console.clear","bindings":[{"platform":"windows,linux","shortcut":"Ctrl+L"},{"platform":"mac","shortcut":"Ctrl+L Meta+K"}],"type":"@WebInspector.ActionDelegate"},{"category":"Console","title":"Hide network messages","defaultValue":false,"settingName":"hideNetworkMessages","settingType":"boolean","type":"setting"},{"category":"Console","title":"Log XMLHttpRequests","defaultValue":false,"settingName":"monitoringXHREnabled","settingType":"boolean","type":"setting"},{"category":"Console","title":"Preserve log upon navigation","defaultValue":false,"settingName":"preserveConsoleLog","settingType":"boolean","type":"setting"},{"category":"Console","title":"Show timestamps","defaultValue":false,"settingName":"consoleTimestampsEnabled","settingType":"boolean","type":"setting"}],"name":"console","scripts":[]},{"dependencies":["source_frame","components","components_lazy","ui_lazy"],"extensions":[{"className":"WebInspector.NetworkPanelFactory","order":40,"type":"@WebInspector.PanelFactory","name":"network","title":"Network"},{"className":"WebInspector.NetworkPanel.ContextMenuProvider","contextTypes":["WebInspector.NetworkRequest","WebInspector.Resource","WebInspector.UISourceCode"],"type":"@WebInspector.ContextMenu.Provider"},{"className":"WebInspector.NetworkPanel.RequestRevealer","contextTypes":["WebInspector.NetworkRequest"],"type":"@WebInspector.Revealer"},{"category":"Network","title":"Show primary load waterfall","defaultValue":false,"experiment":"showPrimaryLoadWaterfallInNetworkTimeline","settingName":"networkShowPrimaryLoadWaterfall","settingType":"boolean","type":"setting"},{"category":"Network","title":"Color-code resource types","defaultValue":false,"settingName":"networkColorCodeResourceTypes","settingType":"boolean","type":"setting"},{"className":"WebInspector.BlockedURLsPane.ActionDelegate","iconClass":"block-toolbar-item","type":"@WebInspector.ActionDelegate","actionId":"network.blocked-urls.show","title":"Block network requests"},{"iconClass":"record-toolbar-item","className":"WebInspector.NetworkPanel.RecordActionDelegate","contextTypes":["WebInspector.NetworkPanel"],"actionId":"network.toggle-recording","bindings":[{"platform":"windows,linux","shortcut":"Ctrl+E"},{"platform":"mac","shortcut":"Meta+E"}],"type":"@WebInspector.ActionDelegate"},{"name":"network.blocked-urls","title":"Request blocking","className":"WebInspector.BlockedURLsPane","experiment":"requestBlocking","type":"drawer-view","order":60,"persistence":"closeable"},{"className":"WebInspector.NetworkConfigView.ShowActionDelegate","type":"@WebInspector.ActionDelegate","actionId":"network.show-config","title":"Network conditions"},{"actionId":"network.show-config","type":"context-menu-item","location":"mainMenu/tools/open","order":60},{"name":"network.config","title":"Network conditions","className":"WebInspector.NetworkConfigView","type":"drawer-view","order":40,"persistence":"closeable"}],"name":"network","scripts":[]},{"remote":true,"name":"cm_modes","dependencies":["source_frame"],"extensions":[{"className":"WebInspector.DefaultCodeMirrorMimeMode","mimeTypes":["text/x-csrc","text/x-c","text/x-chdr","text/x-c++src","text/x-c++hdr","text/x-java","text/x-csharp","text/x-scala","x-shader/x-vertex","x-shader/x-fragment"],"type":"@WebInspector.CodeMirrorMimeMode","fileName":"clike.js"},{"className":"WebInspector.DefaultCodeMirrorMimeMode","mimeTypes":["text/x-coffeescript"],"type":"@WebInspector.CodeMirrorMimeMode","fileName":"coffeescript.js"},{"className":"WebInspector.DefaultCodeMirrorMimeMode","mimeTypes":["application/x-httpd-php","application/x-httpd-php-open","text/x-php"],"dependencies":["clike.js"],"type":"@WebInspector.CodeMirrorMimeMode","fileName":"php.js"},{"className":"WebInspector.DefaultCodeMirrorMimeMode","mimeTypes":["text/x-python","text/x-cython"],"type":"@WebInspector.CodeMirrorMimeMode","fileName":"python.js"},{"className":"WebInspector.DefaultCodeMirrorMimeMode","mimeTypes":["text/x-sh"],"type":"@WebInspector.CodeMirrorMimeMode","fileName":"shell.js"},{"className":"WebInspector.DefaultCodeMirrorMimeMode","mimeTypes":["text/x-livescript"],"type":"@WebInspector.CodeMirrorMimeMode","fileName":"livescript.js"},{"className":"WebInspector.DefaultCodeMirrorMimeMode","mimeTypes":["text/x-clojure"],"type":"@WebInspector.CodeMirrorMimeMode","fileName":"clojure.js"},{"className":"WebInspector.DefaultCodeMirrorMimeMode","mimeTypes":["text/x-styl"],"type":"@WebInspector.CodeMirrorMimeMode","fileName":"stylus.js"}],"scripts":[]},{"dependencies":[],"name":"platform","scripts":[]},{"dependencies":["elements"],"extensions":[{"className":"WebInspector.AnimationTimeline.ButtonProvider","type":"@WebInspector.ToolbarItem.Provider","order":2,"location":"styles-sidebarpane-toolbar"},{"name":"animations","title":"Animations","className":"WebInspector.AnimationTimeline","type":"drawer-view","order":0,"persistence":"closeable"}],"name":"animation","scripts":[]},{"dependencies":["components"],"extensions":[{"className":"WebInspector.CodeMirrorUtils","type":"@WebInspector.InplaceEditor"},{"className":"WebInspector.CodeMirrorUtils.TokenizerFactory","type":"@WebInspector.TokenizerFactory"},{"category":"Sources","title":"Default indentation:","defaultValue":"    ","settingName":"textEditorIndent","settingType":"enum","type":"setting","options":[["2 spaces","  "],["4 spaces","    "],["8 spaces","        "],["Tab character","\t"]]}],"name":"source_frame","scripts":[],"skip_compilation":["../cm/codemirror.js","../cm/css.js","../cm/javascript.js","../cm/simple.js","../cm/xml.js","../cm/htmlmixed.js","../cm/htmlembedded.js","../cm/matchbrackets.js","../cm/closebrackets.js","../cm/markselection.js","../cm/comment.js","../cm/overlay.js","../cm/activeline.js"]},{"dependencies":["extensions","host","platform","sdk","emulation"],"extensions":[{"className":"WebInspector.AdvancedAppProvider","type":"@WebInspector.AppProvider","order":0,"condition":"can_dock"},{"className":"WebInspector.SimpleAppProvider","type":"@WebInspector.AppProvider","order":10},{"className":"WebInspector.HandlerRegistry.ContextMenuProvider","contextTypes":["WebInspector.UISourceCode","WebInspector.Resource","WebInspector.NetworkRequest","Node"],"type":"@WebInspector.ContextMenu.Provider"},{"className":"WebInspector.Main.ReloadActionDelegate","bindings":[{"platform":"windows,linux","shortcut":"F5 Ctrl+R"},{"platform":"mac","shortcut":"Meta+R"}],"type":"@WebInspector.ActionDelegate","actionId":"main.reload"},{"className":"WebInspector.Main.ReloadActionDelegate","bindings":[{"platform":"windows,linux","shortcut":"Shift+F5 Ctrl+F5 Ctrl+Shift+F5 Shift+Ctrl+R"},{"platform":"mac","shortcut":"Shift+Meta+R"}],"type":"@WebInspector.ActionDelegate","actionId":"main.hard-reload"},{"className":"WebInspector.InspectorView.DrawerToggleActionDelegate","bindings":[{"shortcut":"Esc"}],"type":"@WebInspector.ActionDelegate","actionId":"main.toggle-drawer","order":100},{"className":"WebInspector.Main.ReloadActionDelegate","bindings":[{"shortcut":"Alt+R"}],"type":"@WebInspector.ActionDelegate","actionId":"main.debug-reload"},{"className":"WebInspector.DockController.ToggleDockActionDelegate","bindings":[{"platform":"windows,linux","shortcut":"Ctrl+Shift+D"},{"platform":"mac","shortcut":"Meta+Shift+D"}],"type":"@WebInspector.ActionDelegate","actionId":"main.toggle-dock"},{"className":"WebInspector.Main.ZoomActionDelegate","bindings":[{"platform":"windows,linux","shortcut":"Ctrl+Plus Ctrl+Shift+Plus Ctrl+NumpadPlus Ctrl+Shift+NumpadPlus"},{"platform":"mac","shortcut":"Meta+Plus Meta+Shift+Plus Meta+NumpadPlus Meta+Shift+NumpadPlus"}],"type":"@WebInspector.ActionDelegate","actionId":"main.zoom-in"},{"className":"WebInspector.Main.ZoomActionDelegate","bindings":[{"platform":"windows,linux","shortcut":"Ctrl+Minus Ctrl+Shift+Minus Ctrl+NumpadMinus Ctrl+Shift+NumpadMinus"},{"platform":"mac","shortcut":"Meta+Minus Meta+Shift+Minus Meta+NumpadMinus Meta+Shift+NumpadMinus"}],"type":"@WebInspector.ActionDelegate","actionId":"main.zoom-out"},{"className":"WebInspector.Main.ZoomActionDelegate","bindings":[{"platform":"windows,linux","shortcut":"Ctrl+0 Ctrl+Numpad0"},{"platform":"mac","shortcut":"Meta+0 Meta+Numpad0"}],"type":"@WebInspector.ActionDelegate","actionId":"main.zoom-reset"},{"className":"WebInspector.Main.SearchActionDelegate","bindings":[{"platform":"windows,linux","shortcut":"Ctrl+F"},{"platform":"mac","shortcut":"Meta+F F3"}],"type":"@WebInspector.ActionDelegate","actionId":"main.search-in-panel.find"},{"className":"WebInspector.Main.SearchActionDelegate","bindings":[{"shortcut":"Esc"}],"type":"@WebInspector.ActionDelegate","actionId":"main.search-in-panel.cancel","order":10},{"className":"WebInspector.Main.SearchActionDelegate","bindings":[{"platform":"mac","shortcut":"Meta+G"}],"type":"@WebInspector.ActionDelegate","actionId":"main.search-in-panel.find-next"},{"className":"WebInspector.Main.SearchActionDelegate","bindings":[{"platform":"mac","shortcut":"Meta+Shift+G"}],"type":"@WebInspector.ActionDelegate","actionId":"main.search-in-panel.find-previous"},{"className":"WebInspector.RenderingOptionsView.ShowActionDelegate","type":"@WebInspector.ActionDelegate","actionId":"main.show-rendering-options","title":"Rendering settings"},{"separator":true,"type":"@WebInspector.ToolbarItem.Provider","location":"main-toolbar-left","order":100},{"className":"WebInspector.Main.WarningErrorCounter","type":"@WebInspector.ToolbarItem.Provider","order":1,"location":"main-toolbar-right"},{"separator":true,"type":"@WebInspector.ToolbarItem.Provider","order":98,"location":"main-toolbar-right"},{"className":"WebInspector.Main.MainMenuItem","type":"@WebInspector.ToolbarItem.Provider","order":99,"location":"main-toolbar-right"},{"className":"WebInspector.DockController.CloseButtonProvider","type":"@WebInspector.ToolbarItem.Provider","order":100,"location":"main-toolbar-right"},{"category":"","title":"Disable cache (while DevTools is open)","defaultValue":false,"settingName":"cacheDisabled","settingType":"boolean","type":"setting"},{"category":"","title":"Disable JavaScript","defaultValue":false,"settingName":"javaScriptDisabled","settingType":"boolean","type":"setting"},{"category":"Appearance","title":"Theme:","defaultValue":"default","settingName":"uiTheme","settingType":"enum","type":"setting","options":[["Default","default"],["Dark","dark"]]},{"category":"Appearance","title":"Panel layout:","defaultValue":"auto","settingName":"sidebarPosition","settingType":"enum","type":"setting","options":[["horizontal","bottom"],["vertical","right"],["auto","auto"]]},{"category":"Appearance","title-mac":"Enable Cmd + 1-9 shortcut to switch panels","title":"Enable Ctrl + 1-9 shortcut to switch panels","defaultValue":false,"settingName":"shortcutPanelSwitch","settingType":"boolean","type":"setting"},{"category":"Appearance","title":"Don't show emulation warnings","defaultValue":false,"settingName":"disableOverridesWarning","settingType":"boolean","type":"setting"},{"category":"Appearance","title":"Don't show Chrome Data Saver warning","defaultValue":false,"settingName":"disableDataSaverInfobar","settingType":"boolean","type":"setting"},{"category":"Appearance","title":"Disable paused state overlay","defaultValue":false,"settingName":"disablePausedStateOverlay","settingType":"boolean","type":"setting"},{"category":"Extensions","className":"WebInspector.HandlerRegistry.OpenAnchorLocationSettingUI","type":"@WebInspector.SettingUI"},{"subMenuId":"mainMenu/tools","order":80,"type":"context-menu-item","location":"mainMenu/navigate","title":"More tools"},{"actionId":"main.show-rendering-options","type":"context-menu-item","location":"mainMenu/tools/open","order":80},{"name":"rendering","title":"Rendering","className":"WebInspector.RenderingOptionsView","type":"drawer-view","order":50,"persistence":"closeable"}],"name":"main","scripts":[],"skip_compilation":["Tests.js"]},{"dependencies":["source_frame","ui_lazy","components_lazy"],"extensions":[{"className":"WebInspector.ResourcesPanelFactory","order":70,"type":"@WebInspector.PanelFactory","name":"resources","title":"Resources"},{"className":"WebInspector.ResourcesPanel.ResourceRevealer","contextTypes":["WebInspector.Resource"],"type":"@WebInspector.Revealer"}],"name":"resources","scripts":[]},{"skip_compilation":["../acorn/acorn.js","../cm/headlesscodemirror.js","../cm/css.js","../cm/xml.js","../cm/htmlmixed.js"],"name":"script_formatter_worker","scripts":[]},{"dependencies":["components","extensions"],"extensions":[{"className":"WebInspector.ElementsPanelFactory","order":10,"type":"@WebInspector.PanelFactory","name":"elements","title":"Elements"},{"className":"WebInspector.ElementsPanel.ContextMenuProvider","contextTypes":["WebInspector.RemoteObject","WebInspector.DOMNode","WebInspector.DeferredDOMNode"],"type":"@WebInspector.ContextMenu.Provider"},{"className":"WebInspector.ElementsTreeOutline.Renderer","contextTypes":["WebInspector.DOMNode","WebInspector.RemoteObject"],"type":"@WebInspector.Renderer"},{"className":"WebInspector.ElementsPanel.DOMNodeRevealer","contextTypes":["WebInspector.DOMNode","WebInspector.DeferredDOMNode","WebInspector.RemoteObject"],"type":"@WebInspector.Revealer"},{"category":"Elements","title":"Color format:","defaultValue":"original","options":[["As authored","original"],["HEX: #DAC0DE","hex",true],["RGB: rgb(128, 255, 255)","rgb",true],["HSL: hsl(300, 80%, 90%)","hsl",true]],"settingName":"colorFormat","settingType":"enum","type":"setting","order":0},{"category":"Elements","title":"Show user agent shadow DOM","defaultValue":false,"settingName":"showUAShadowDOM","settingType":"boolean","type":"setting","order":1},{"category":"Elements","title":"Word wrap","defaultValue":true,"settingName":"domWordWrap","settingType":"boolean","type":"setting","order":2},{"category":"Elements","title":"Show rulers","defaultValue":false,"settingName":"showMetricsRulers","settingType":"boolean","type":"setting","order":3},{"category":"Elements","title":"Reveal DOM node on hover.","defaultValue":true,"settingName":"highlightNodeOnHoverInOverlay","settingType":"boolean","type":"setting","order":4},{"className":"WebInspector.ClassesPaneWidget.ButtonProvider","type":"@WebInspector.ToolbarItem.Provider","order":1,"location":"styles-sidebarpane-toolbar"},{"className":"WebInspector.ElementStatePaneWidget.ButtonProvider","type":"@WebInspector.ToolbarItem.Provider","order":1,"location":"styles-sidebarpane-toolbar"},{"className":"WebInspector.ElementsActionDelegate","contextTypes":["WebInspector.ElementsPanel"],"bindings":[{"shortcut":"H"}],"type":"@WebInspector.ActionDelegate","actionId":"elements.hide-element"},{"className":"WebInspector.ElementsActionDelegate","contextTypes":["WebInspector.ElementsPanel"],"bindings":[{"shortcut":"F2"}],"type":"@WebInspector.ActionDelegate","actionId":"elements.edit-as-html"},{"className":"WebInspector.ElementsPanel.PseudoStateMarkerDecorator","marker":"pseudo-state-marker","type":"@WebInspector.DOMPresentationUtils.MarkerDecorator"},{"className":"WebInspector.DOMPresentationUtils.GenericDecorator","marker":"hidden-marker","type":"@WebInspector.DOMPresentationUtils.MarkerDecorator","color":"#555","title":"Element is hidden"},{"iconClass":"node-search-toolbar-item","title":"Select an element in the page to inspect it","className":"WebInspector.InspectElementModeController.ToggleSearchActionDelegate","actionId":"elements.toggle-element-search","bindings":[{"platform":"windows,linux","shortcut":"Ctrl+Shift+C"},{"platform":"mac","shortcut":"Meta+Shift+C"}],"type":"@WebInspector.ActionDelegate"},{"order":0,"type":"@WebInspector.ToolbarItem.Provider","actionId":"elements.toggle-element-search","location":"main-toolbar-left"},{"className":"WebInspector.InspectElementModeController.LayoutEditorButtonProvider","experiment":"layoutEditor","type":"@WebInspector.ToolbarItem.Provider","order":4,"location":"styles-sidebarpane-toolbar"}],"name":"elements","scripts":[]},{"dependencies":["common","host","platform"],"name":"workspace","scripts":[]},{"dependencies":["components","components_lazy","ui_lazy"],"extensions":[{"className":"WebInspector.TimelinePanelFactory","order":50,"type":"@WebInspector.PanelFactory","name":"timeline","title":"Timeline"},{"category":"Profiler","title":"Hide chrome frame in Layers view","defaultValue":false,"settingName":"frameViewerHideChromeWindow","settingType":"boolean","type":"setting"},{"className":"WebInspector.LoadTimelineHandler","type":"@WebInspector.QueryParamHandler","name":"loadTimelineFromURL"},{"iconClass":"record-toolbar-item","className":"WebInspector.TimelinePanel.ActionDelegate","contextTypes":["WebInspector.TimelinePanel"],"actionId":"timeline.toggle-recording","bindings":[{"platform":"windows,linux","shortcut":"Ctrl+E"},{"platform":"mac","shortcut":"Meta+E"}],"type":"@WebInspector.ActionDelegate"},{"className":"WebInspector.TimelinePanel.ActionDelegate","contextTypes":["WebInspector.TimelinePanel"],"bindings":[{"platform":"windows,linux","shortcut":"Ctrl+S"},{"platform":"mac","shortcut":"Meta+S"}],"type":"@WebInspector.ActionDelegate","actionId":"timeline.save-to-file"},{"className":"WebInspector.TimelinePanel.ActionDelegate","contextTypes":["WebInspector.TimelinePanel"],"actionId":"timeline.load-from-file","bindings":[{"platform":"windows,linux","shortcut":"Ctrl+O"},{"platform":"mac","shortcut":"Meta+O"}],"type":"@WebInspector.ActionDelegate","order":"10"},{"className":"WebInspector.TimelinePanel.ActionDelegate","contextTypes":["WebInspector.TimelinePanel"],"bindings":[{"shortcut":"["}],"type":"@WebInspector.ActionDelegate","actionId":"timeline.jump-to-previous-frame"},{"className":"WebInspector.TimelinePanel.ActionDelegate","contextTypes":["WebInspector.TimelinePanel"],"bindings":[{"shortcut":"]"}],"type":"@WebInspector.ActionDelegate","actionId":"timeline.jump-to-next-frame"}],"name":"timeline","scripts":[]},{"name":"heap_snapshot_worker","scripts":[]},{"dependencies":["common","platform"],"name":"host","scripts":[]},{"dependencies":["bindings","components","platform","ui"],"extensions":[{"name":"emulation","title":"Emulation","className":"WebInspector.OverridesView","experiment":"!deviceMode","type":"drawer-view","order":10,"persistence":"closeable"},{"className":"WebInspector.DeviceModeButtonProvider","experiment":"!deviceMode","location":"main-toolbar-left","type":"@WebInspector.ToolbarItem.Provider","order":1,"condition":"can_dock"},{"iconClass":"emulation-toolbar-item","title":"Toggle device mode","className":"WebInspector.ToggleDeviceModeActionDelegate","experiment":"!deviceMode","actionId":"emulation.toggle-device-mode","bindings":[{"platform":"windows,linux","shortcut":"Shift+Ctrl+M"},{"platform":"mac","shortcut":"Shift+Meta+M"}],"type":"@WebInspector.ActionDelegate","condition":"can_dock"},{"className":"WebInspector.DeviceModeView.ActionDelegate","bindings":[{"platform":"windows,linux","shortcut":"Shift+Ctrl+M"},{"platform":"mac","shortcut":"Shift+Meta+M"}],"experiment":"deviceMode","type":"@WebInspector.ActionDelegate","actionId":"emulation.toggle-device-mode"},{"className":"WebInspector.DeviceModeView.ActionDelegate","experiment":"deviceMode","type":"@WebInspector.ActionDelegate","actionId":"emulation.toggle-device-toolbar","title":"Toggle device toolbar"},{"className":"WebInspector.OverridesView.Revealer","contextTypes":["WebInspector.OverridesSupport"],"type":"@WebInspector.Revealer"},{"name":"devices","settings":["standardEmulatedDeviceList","customEmulatedDeviceList"],"title":"Devices","className":"WebInspector.DevicesSettingsTab","type":"settings-view","order":"30"},{"className":"WebInspector.SensorsView.ShowActionDelegate","type":"@WebInspector.ActionDelegate","actionId":"emulation.show-sensors","title":"Sensors"},{"actionId":"emulation.show-sensors","type":"context-menu-item","location":"mainMenu/tools/open","order":100},{"actionId":"emulation.toggle-device-toolbar","type":"context-menu-item","location":"mainMenu/navigate","order":10},{"name":"sensors","title":"Sensors","className":"WebInspector.SensorsView","type":"drawer-view","order":100,"persistence":"closeable"}],"name":"emulation","scripts":[]},{"dependencies":["platform","common","host"],"name":"ui","scripts":[]},{"skip_compilation":["../InspectorBackendCommands.js","../SupportedCSSProperties.js"],"dependencies":["common","host","platform"],"extensions":[{"defaultValue":[],"type":"setting","settingName":"blockedURLs","settingType":"array"},{"defaultValue":"","type":"setting","settingName":"skipStackFramesPattern","settingType":"regex"},{"defaultValue":false,"type":"setting","settingName":"skipContentScripts","settingType":"boolean"},{"defaultValue":false,"type":"setting","settingName":"pauseOnExceptionEnabled","settingType":"boolean"},{"defaultValue":false,"type":"setting","settingName":"pauseOnCaughtException","settingType":"boolean"},{"defaultValue":false,"type":"setting","settingName":"enableAsyncStackTraces","settingType":"boolean"}],"name":"sdk","scripts":[]},{"name":"temp_storage_shared_worker","scripts":[]},{"dependencies":["platform","common","diff","sdk"],"name":"sass","scripts":[]},{"dependencies":["components"],"extensions":[{"className":"WebInspector.SettingsController.ActionDelegate","bindings":[{"shortcut":"F1 Shift+?"}],"type":"@WebInspector.ActionDelegate","actionId":"settings.show","title":"Settings"},{"className":"WebInspector.SettingsController.ActionDelegate","type":"@WebInspector.ActionDelegate","actionId":"settings.help","title":"Help"},{"className":"WebInspector.SettingsController.ActionDelegate","type":"@WebInspector.ActionDelegate","actionId":"settings.shortcuts","title":"Shortcuts"},{"className":"WebInspector.SettingsController.Revealer","contextTypes":["WebInspector.Setting"],"type":"@WebInspector.Revealer"},{"actionId":"settings.shortcuts","type":"context-menu-item","location":"mainMenu/footer","order":10},{"actionId":"settings.show","type":"context-menu-item","location":"mainMenu/footer","order":20},{"actionId":"settings.help","type":"context-menu-item","location":"mainMenu/footer","order":30}],"name":"settings","scripts":[]},{"dependencies":["sdk","ui","ui_lazy"],"name":"components_lazy","scripts":[]},{"dependencies":["components","ui_lazy"],"extensions":[{"className":"WebInspector.ProfilesPanelFactory","order":60,"type":"@WebInspector.PanelFactory","name":"profiles","title":"Profiles"},{"className":"WebInspector.ProfilesPanel.ContextMenuProvider","contextTypes":["WebInspector.RemoteObject"],"type":"@WebInspector.ContextMenu.Provider"},{"category":"Profiler","title":"Show advanced heap snapshot properties","defaultValue":false,"settingName":"showAdvancedHeapSnapshotProperties","settingType":"boolean","type":"setting"},{"category":"Profiler","title":"Record heap allocation stack traces","defaultValue":false,"settingName":"recordAllocationStacks","settingType":"boolean","type":"setting"},{"category":"Profiler","title":"High resolution CPU profiling","defaultValue":true,"settingName":"highResolutionCpuProfiling","settingType":"boolean","type":"setting"},{"category":"Profiler","title":"Show native functions in JS Profile","defaultValue":false,"settingName":"showNativeFunctionsInJSProfile","settingType":"boolean","type":"setting"},{"iconClass":"record-toolbar-item","className":"WebInspector.ProfilesPanel.RecordActionDelegate","contextTypes":["WebInspector.ProfilesPanel"],"actionId":"profiler.toggle-recording","bindings":[{"platform":"windows,linux","shortcut":"Ctrl+E"},{"platform":"mac","shortcut":"Meta+E"}],"type":"@WebInspector.ActionDelegate"}],"name":"profiler","scripts":[]},{"remote":true,"name":"screencast","dependencies":["components"],"extensions":[{"className":"WebInspector.ScreencastAppProvider","type":"@WebInspector.AppProvider","order":1},{"className":"WebInspector.ScreencastApp.ToolbarButtonProvider","type":"@WebInspector.ToolbarItem.Provider","order":1,"location":"main-toolbar-left"}],"scripts":[],"condition":"remoteFrontend"},{"dependencies":["components"],"name":"extensions","scripts":[]},{"skip_compilation":["TestBase.js"],"dependencies":["platform"],"name":"common","scripts":[]},{"dependencies":["bindings","platform","ui"],"extensions":[{"category":"Console","title":"Enable custom formatters","defaultValue":false,"settingName":"customFormatters","settingType":"boolean","type":"setting"},{"className":"WebInspector.DOMPresentationUtils.GenericDecorator","marker":"breakpoint-marker","type":"@WebInspector.DOMPresentationUtils.MarkerDecorator","color":"rgb(105, 140, 254)","title":"DOM Breakpoint"},{"defaultValue":[],"type":"setting","settingName":"networkConditionsCustomProfiles","settingType":"array"},{"name":"network-conditions","settings":["networkConditionsCustomProfiles"],"title":"Throttling","className":"WebInspector.NetworkConditionsSettingsTab","type":"settings-view","order":"35"}],"name":"components","scripts":[]},{"experiment":"securityPanel","extensions":[{"className":"WebInspector.SecurityPanelFactory","order":80,"type":"@WebInspector.PanelFactory","name":"security","title":"Security"}],"name":"security","dependencies":["network","platform","ui","sdk"],"scripts":[]},{"remote":true,"name":"emulated_devices","dependencies":["emulation"],"extensions":[{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"iPhone 4","screen":{"horizontal":{"width":480,"height":320},"device-pixel-ratio":2,"vertical":{"width":320,"height":480}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1","type":"phone"},"type":"emulated-device"},{"device":{"show-by-default":true,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"iPhone 5","screen":{"horizontal":{"width":568,"height":320},"device-pixel-ratio":2,"vertical":{"width":320,"height":568}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1","type":"phone"},"type":"emulated-device","order":40},{"device":{"show-by-default":true,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"iPhone 6","screen":{"horizontal":{"width":667,"height":375},"device-pixel-ratio":2,"vertical":{"width":375,"height":667}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1","type":"phone"},"type":"emulated-device","order":50},{"device":{"show-by-default":true,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"iPhone 6 Plus","screen":{"horizontal":{"width":736,"height":414},"device-pixel-ratio":3,"vertical":{"width":414,"height":736}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1","type":"phone"},"type":"emulated-device","order":60},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"BlackBerry Z30","screen":{"horizontal":{"width":640,"height":360},"device-pixel-ratio":2,"vertical":{"width":360,"height":640}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+","type":"phone"},"type":"emulated-device"},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Nexus 4","screen":{"horizontal":{"width":640,"height":384},"device-pixel-ratio":2,"vertical":{"width":384,"height":640}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36","type":"phone"},"type":"emulated-device"},{"device":{"show-by-default":false,"modes":[{"insets":{"top":25,"right":0,"bottom":48,"left":0},"image":"@url(google-nexus-5-vertical-default-1x.png) 1x, @url(google-nexus-5-vertical-default-2x.png) 2x","orientation":"vertical","title":"default"},{"insets":{"top":80,"right":0,"bottom":48,"left":0},"image":"@url(google-nexus-5-vertical-navigation-1x.png) 1x, @url(google-nexus-5-vertical-navigation-2x.png) 2x","orientation":"vertical","title":"navigation bar"},{"insets":{"top":80,"right":0,"bottom":312,"left":0},"image":"@url(google-nexus-5-vertical-keyboard-1x.png) 1x, @url(google-nexus-5-vertical-keyboard-2x.png) 2x","orientation":"vertical","title":"keyboard"},{"insets":{"top":25,"right":42,"bottom":0,"left":0},"image":"@url(google-nexus-5-horizontal-default-1x.png) 1x, @url(google-nexus-5-horizontal-default-2x.png) 2x","orientation":"horizontal","title":"default"},{"insets":{"top":80,"right":42,"bottom":0,"left":0},"image":"@url(google-nexus-5-horizontal-navigation-1x.png) 1x, @url(google-nexus-5-horizontal-navigation-2x.png) 2x","orientation":"horizontal","title":"navigation bar"},{"insets":{"top":80,"right":42,"bottom":202,"left":0},"image":"@url(google-nexus-5-horizontal-keyboard-1x.png) 1x, @url(google-nexus-5-horizontal-keyboard-2x.png) 2x","orientation":"horizontal","title":"keyboard"}],"title":"Nexus 5","screen":{"horizontal":{"width":640,"height":360},"device-pixel-ratio":3,"vertical":{"width":360,"height":640}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36","type":"phone"},"type":"emulated-device"},{"device":{"show-by-default":true,"modes":[{"insets":{"top":24,"right":0,"bottom":48,"left":0},"image":"@url(google-nexus-5x-vertical-default-1x.png) 1x, @url(google-nexus-5x-vertical-default-2x.png) 2x","orientation":"vertical","title":"default"},{"insets":{"top":80,"right":0,"bottom":48,"left":0},"image":"@url(google-nexus-5x-vertical-navigation-1x.png) 1x, @url(google-nexus-5x-vertical-navigation-2x.png) 2x","orientation":"vertical","title":"navigation bar"},{"insets":{"top":80,"right":0,"bottom":342,"left":0},"image":"@url(google-nexus-5x-vertical-keyboard-1x.png) 1x, @url(google-nexus-5x-vertical-keyboard-2x.png) 2x","orientation":"vertical","title":"keyboard"},{"insets":{"top":24,"right":48,"bottom":0,"left":0},"image":"@url(google-nexus-5x-horizontal-default-1x.png) 1x, @url(google-nexus-5x-horizontal-default-2x.png) 2x","orientation":"horizontal","title":"default"},{"insets":{"top":80,"right":48,"bottom":0,"left":0},"image":"@url(google-nexus-5x-horizontal-navigation-1x.png) 1x, @url(google-nexus-5x-horizontal-navigation-2x.png) 2x","orientation":"horizontal","title":"navigation bar"},{"insets":{"top":80,"right":48,"bottom":222,"left":0},"image":"@url(google-nexus-5x-horizontal-keyboard-1x.png) 1x, @url(google-nexus-5x-horizontal-keyboard-2x.png) 2x","orientation":"horizontal","title":"keyboard"}],"title":"Nexus 5X","screen":{"horizontal":{"width":731,"height":411},"device-pixel-ratio":2.625,"vertical":{"width":411,"height":731}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36","type":"phone"},"type":"emulated-device","order":20},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Nexus 6","screen":{"horizontal":{"width":732,"height":412},"device-pixel-ratio":3.5,"vertical":{"width":412,"height":732}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36","type":"phone"},"type":"emulated-device"},{"device":{"show-by-default":true,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Nexus 6P","screen":{"horizontal":{"width":773,"height":435},"device-pixel-ratio":3.3,"vertical":{"width":435,"height":773}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36","type":"phone"},"type":"emulated-device","order":30},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"LG Optimus L70","screen":{"horizontal":{"width":640,"height":384},"device-pixel-ratio":1.25,"vertical":{"width":384,"height":640}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.23 Mobile Safari/537.36","type":"phone"},"type":"emulated-device"},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Nokia N9","screen":{"horizontal":{"width":640,"height":360},"device-pixel-ratio":1,"vertical":{"width":360,"height":640}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13","type":"phone"},"type":"emulated-device"},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Nokia Lumia 520","screen":{"horizontal":{"width":533,"height":320},"device-pixel-ratio":1.4,"vertical":{"width":320,"height":533}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)","type":"phone"},"type":"emulated-device"},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Galaxy S III","screen":{"horizontal":{"width":640,"height":360},"device-pixel-ratio":2,"vertical":{"width":360,"height":640}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30","type":"phone"},"type":"emulated-device"},{"device":{"show-by-default":true,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Galaxy S5","screen":{"horizontal":{"width":640,"height":360},"device-pixel-ratio":3,"vertical":{"width":360,"height":640}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36","type":"phone"},"type":"emulated-device","order":10},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Kindle Fire HDX","screen":{"horizontal":{"width":2560,"height":1600},"device-pixel-ratio":2,"vertical":{"width":1600,"height":2560}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true","type":"tablet"},"type":"emulated-device"},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"iPad Mini","screen":{"horizontal":{"width":1024,"height":768},"device-pixel-ratio":2,"vertical":{"width":768,"height":1024}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1","type":"tablet"},"type":"emulated-device"},{"device":{"show-by-default":true,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"iPad","screen":{"horizontal":{"width":1024,"height":768},"device-pixel-ratio":2,"vertical":{"width":768,"height":1024}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1","type":"tablet"},"type":"emulated-device","order":70},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Blackberry PlayBook","screen":{"horizontal":{"width":1024,"height":600},"device-pixel-ratio":1,"vertical":{"width":600,"height":1024}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+","type":"tablet"},"type":"emulated-device"},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Nexus 10","screen":{"horizontal":{"width":1280,"height":800},"device-pixel-ratio":2,"vertical":{"width":800,"height":1280}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Safari/537.36","type":"tablet"},"type":"emulated-device"},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Nexus 7","screen":{"horizontal":{"width":960,"height":600},"device-pixel-ratio":2,"vertical":{"width":600,"height":960}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Safari/537.36","type":"tablet"},"type":"emulated-device"},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Galaxy Note 3","screen":{"horizontal":{"width":640,"height":360},"device-pixel-ratio":3,"vertical":{"width":360,"height":640}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30","type":"phone"},"type":"emulated-device"},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"vertical","title":"default"},{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Galaxy Note II","screen":{"horizontal":{"width":640,"height":360},"device-pixel-ratio":2,"vertical":{"width":360,"height":640}},"capabilities":["touch","mobile"],"user-agent":"Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30","type":"phone"},"type":"emulated-device"},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Laptop with touch","screen":{"horizontal":{"width":1280,"height":950},"device-pixel-ratio":1,"vertical":{"width":950,"height":1280}},"capabilities":["touch"],"user-agent":"","type":"notebook"},"type":"emulated-device"},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Laptop with HiDPI screen","screen":{"horizontal":{"width":1440,"height":900},"device-pixel-ratio":2,"vertical":{"width":900,"height":1440}},"capabilities":[],"user-agent":"","type":"notebook"},"type":"emulated-device"},{"device":{"show-by-default":false,"modes":[{"insets":{"top":0,"right":0,"bottom":0,"left":0},"orientation":"horizontal","title":"default"}],"title":"Laptop with MDPI screen","screen":{"horizontal":{"width":1280,"height":800},"device-pixel-ratio":1,"vertical":{"width":800,"height":1280}},"capabilities":[],"user-agent":"","type":"notebook"},"type":"emulated-device"}],"scripts":[]}];var applicationDescriptor;var _loadedScripts={};for(var k of[]){};function loadResourcePromise(url)
{return new Promise(load);function load(fulfill,reject)
{var xhr=new XMLHttpRequest();xhr.open("GET",url,true);xhr.onreadystatechange=onreadystatechange;function onreadystatechange(e)
{if(xhr.readyState!==4)
return;if([0,200,304].indexOf(xhr.status)===-1)
reject(new Error("While loading from url "+url+" server responded with a status of "+xhr.status));else
fulfill(e.target.response);}
xhr.send(null);}}
function normalizePath(path)
{if(path.indexOf("..")===-1&&path.indexOf('.')===-1)
return path;var normalizedSegments=[];var segments=path.split("/");for(var i=0;i<segments.length;i++){var segment=segments[i];if(segment===".")
continue;else if(segment==="..")
normalizedSegments.pop();else if(segment)
normalizedSegments.push(segment);}
var normalizedPath=normalizedSegments.join("/");if(normalizedPath[normalizedPath.length-1]==="/")
return normalizedPath;if(path[0]==="/"&&normalizedPath)
normalizedPath="/"+normalizedPath;if((path[path.length-1]==="/")||(segments[segments.length-1]===".")||(segments[segments.length-1]===".."))
normalizedPath=normalizedPath+"/";return normalizedPath;}
function loadScriptsPromise(scriptNames,base)
{var promises=[];var urls=[];var sources=new Array(scriptNames.length);var scriptToEval=0;for(var i=0;i<scriptNames.length;++i){var scriptName=scriptNames[i];var sourceURL=(base||self._importScriptPathPrefix)+scriptName;var schemaIndex=sourceURL.indexOf("://")+3;sourceURL=sourceURL.substring(0,schemaIndex)+normalizePath(sourceURL.substring(schemaIndex));if(_loadedScripts[sourceURL])
continue;urls.push(sourceURL);promises.push(loadResourcePromise(sourceURL).then(scriptSourceLoaded.bind(null,i),scriptSourceLoaded.bind(null,i,undefined)));}
return Promise.all(promises).then(undefined);function scriptSourceLoaded(scriptNumber,scriptSource)
{sources[scriptNumber]=scriptSource||"";while(typeof sources[scriptToEval]!=="undefined"){evaluateScript(urls[scriptToEval],sources[scriptToEval]);++scriptToEval;}}
function evaluateScript(sourceURL,scriptSource)
{_loadedScripts[sourceURL]=true;if(!scriptSource){console.error("Empty response arrived for script '"+sourceURL+"'");return;}
self.eval(scriptSource+"\n//# sourceURL="+sourceURL);}}
(function(){var baseUrl=self.location?self.location.origin+self.location.pathname:"";self._importScriptPathPrefix=baseUrl.substring(0,baseUrl.lastIndexOf("/")+1);})();function Runtime(descriptors,coreModuleNames)
{this._modules=[];this._modulesMap={};this._extensions=[];this._cachedTypeClasses={};this._descriptorsMap={};for(var i=0;i<descriptors.length;++i)
this._registerModule(descriptors[i]);if(coreModuleNames)
this._loadAutoStartModules(coreModuleNames);}
Runtime._queryParamsObject={__proto__:null};Runtime.cachedResources={__proto__:null};Runtime.isReleaseMode=function()
{return!!allDescriptors.length;}
Runtime.startApplication=function(appName)
{console.timeStamp("Runtime.startApplication");var allDescriptorsByName={};for(var i=0;Runtime.isReleaseMode()&&i<allDescriptors.length;++i){var d=allDescriptors[i];allDescriptorsByName[d["name"]]=d;}
var applicationPromise;if(applicationDescriptor)
applicationPromise=Promise.resolve(applicationDescriptor);else
applicationPromise=loadResourcePromise(appName+".json").then(JSON.parse.bind(JSON));applicationPromise.then(parseModuleDescriptors);function parseModuleDescriptors(configuration)
{var moduleJSONPromises=[];var coreModuleNames=[];for(var i=0;i<configuration.length;++i){var descriptor=configuration[i];if(descriptor["type"]==="worker")
continue;var name=descriptor["name"];var moduleJSON=allDescriptorsByName[name];if(moduleJSON)
moduleJSONPromises.push(Promise.resolve(moduleJSON));else
moduleJSONPromises.push(loadResourcePromise(name+"/module.json").then(JSON.parse.bind(JSON)));if(descriptor["type"]==="autostart")
coreModuleNames.push(name);}
Promise.all(moduleJSONPromises).then(instantiateRuntime);function instantiateRuntime(moduleDescriptors)
{for(var i=0;!Runtime.isReleaseMode()&&i<moduleDescriptors.length;++i){moduleDescriptors[i]["name"]=configuration[i]["name"];moduleDescriptors[i]["condition"]=configuration[i]["condition"];}
self.runtime=new Runtime(moduleDescriptors,coreModuleNames);}}}
Runtime.queryParam=function(name)
{return Runtime._queryParamsObject[name]||null;}
Runtime.constructQueryParams=function(banned)
{var params=[];for(var key in Runtime._queryParamsObject){if(!key||banned.indexOf(key)!==-1)
continue;params.push(key+"="+Runtime._queryParamsObject[key]);}
return params.length?"?"+params.join("&"):"";}
Runtime._experimentsSetting=function()
{try{return(JSON.parse(self.localStorage&&self.localStorage["experiments"]?self.localStorage["experiments"]:"{}"));}catch(e){console.error("Failed to parse localStorage['experiments']");return{};}}
Runtime._some=function(promises)
{var all=[];var wasRejected=[];for(var i=0;i<promises.length;++i){var handlerFunction=(handler.bind(promises[i],i));all.push(promises[i].catch(handlerFunction));}
return Promise.all(all).then(filterOutFailuresResults);function filterOutFailuresResults(results)
{var filtered=[];for(var i=0;i<results.length;++i){if(!wasRejected[i])
filtered.push(results[i]);}
return filtered;}
function handler(index,e)
{wasRejected[index]=true;console.error(e.stack);}}
Runtime._console=console;Runtime._originalAssert=console.assert;Runtime._assert=function(value,message)
{if(value)
return;Runtime._originalAssert.call(Runtime._console,value,message+" "+new Error().stack);}
Runtime.prototype={useTestBase:function()
{Runtime._remoteBase="http://localhost:8000/inspector-sources/";},_registerModule:function(descriptor)
{var module=new Runtime.Module(this,descriptor);this._modules.push(module);this._modulesMap[descriptor["name"]]=module;},loadModulePromise:function(moduleName)
{return this._modulesMap[moduleName]._loadPromise();},_loadAutoStartModules:function(moduleNames)
{var promises=[];for(var i=0;i<moduleNames.length;++i){if(Runtime.isReleaseMode())
this._modulesMap[moduleNames[i]]._loaded=true;else
promises.push(this.loadModulePromise(moduleNames[i]));}
return Promise.all(promises);},_checkExtensionApplicability:function(extension,predicate)
{if(!predicate)
return false;var contextTypes=(extension.descriptor().contextTypes);if(!contextTypes)
return true;for(var i=0;i<contextTypes.length;++i){var contextType=this._resolve(contextTypes[i]);var isMatching=!!contextType&&predicate(contextType);if(isMatching)
return true;}
return false;},isExtensionApplicableToContext:function(extension,context)
{if(!context)
return true;return this._checkExtensionApplicability(extension,isInstanceOf);function isInstanceOf(targetType)
{return context instanceof targetType;}},isExtensionApplicableToContextTypes:function(extension,currentContextTypes)
{if(!extension.descriptor().contextTypes)
return true;return this._checkExtensionApplicability(extension,currentContextTypes?isContextTypeKnown:null);function isContextTypeKnown(targetType)
{return currentContextTypes.has(targetType);}},extensions:function(type,context)
{return this._extensions.filter(filter).sort(orderComparator);function filter(extension)
{if(extension._type!==type&&extension._typeClass()!==type)
return false;if(!extension.enabled())
return false;return!context||extension.isApplicable(context);}
function orderComparator(extension1,extension2)
{var order1=extension1.descriptor()["order"]||0;var order2=extension2.descriptor()["order"]||0;return order1-order2;}},extension:function(type,context)
{return this.extensions(type,context)[0]||null;},instancesPromise:function(type,context)
{var extensions=this.extensions(type,context);var promises=[];for(var i=0;i<extensions.length;++i)
promises.push(extensions[i].instancePromise());return Runtime._some(promises);},instancePromise:function(type,context)
{var extension=this.extension(type,context);if(!extension)
return Promise.reject(new Error("No such extension: "+type+" in given context."));return extension.instancePromise();},_resolve:function(typeName)
{if(!this._cachedTypeClasses[typeName]){var path=typeName.split(".");var object=window;for(var i=0;object&&(i<path.length);++i)
object=object[path[i]];if(object)
this._cachedTypeClasses[typeName]=(object);}
return this._cachedTypeClasses[typeName]||null;}}
Runtime.ModuleDescriptor=function()
{this.name;this.extensions;this.dependencies;this.scripts;this.remote;}
Runtime.ExtensionDescriptor=function()
{this.type;this.className;this.contextTypes;}
Runtime.Module=function(manager,descriptor)
{this._manager=manager;this._descriptor=descriptor;this._name=descriptor.name;this._instanceMap={};var extensions=(descriptor.extensions);for(var i=0;extensions&&i<extensions.length;++i)
this._manager._extensions.push(new Runtime.Extension(this,extensions[i]));this._loaded=false;}
Runtime.Module.prototype={name:function()
{return this._name;},enabled:function()
{var activatorExperiment=this._descriptor["experiment"];if(activatorExperiment&&!Runtime.experiments.isEnabled(activatorExperiment))
return false;var condition=this._descriptor["condition"];if(condition&&!Runtime.queryParam(condition))
return false;return true;},resource:function(name)
{var fullName=this._name+"/"+name;var content=Runtime.cachedResources[fullName];if(!content)
throw new Error(fullName+" not preloaded. Check module.json");return content;},_loadPromise:function()
{if(this._loaded)
return Promise.resolve();if(!this.enabled())
return Promise.reject(new Error("Module "+this._name+" is not enabled"));if(this._pendingLoadPromise)
return this._pendingLoadPromise;var dependencies=this._descriptor.dependencies;var dependencyPromises=[];for(var i=0;dependencies&&i<dependencies.length;++i)
dependencyPromises.push(this._manager._modulesMap[dependencies[i]]._loadPromise());this._pendingLoadPromise=Promise.all(dependencyPromises).then(this._loadResources.bind(this)).then(this._loadScripts.bind(this)).then(markAsLoaded.bind(this));return this._pendingLoadPromise;function markAsLoaded()
{delete this._pendingLoadPromise;this._loaded=true;}},_loadResources:function()
{var resources=this._descriptor["resources"];if(!resources)
return Promise.resolve();var promises=[];for(var i=0;i<resources.length;++i){var url=this._modularizeURL(resources[i]);promises.push(loadResourcePromise(url).then(cacheResource.bind(this,url),cacheResource.bind(this,url,undefined)));}
return Promise.all(promises).then(undefined);function cacheResource(path,content)
{if(!content){console.error("Failed to load resource: "+path);return;}
Runtime.cachedResources[path]=content+Runtime.resolveSourceURL(path);}},_loadScripts:function()
{if(!this._descriptor.scripts)
return Promise.resolve();if(Runtime.isReleaseMode())
return loadScriptsPromise([this._name+"_module.js"],this._remoteBase());return loadScriptsPromise(this._descriptor.scripts.map(this._modularizeURL,this));},_modularizeURL:function(resourceName)
{return normalizePath(this._name+"/"+resourceName);},_remoteBase:function()
{return this._descriptor.remote&&Runtime._remoteBase||undefined;},substituteURL:function(value)
{var base=this._remoteBase()||"";return value.replace(/@url\(([^\)]*?)\)/g,convertURL.bind(this));function convertURL(match,url)
{return base+this._modularizeURL(url);}},_instance:function(className,extension)
{if(className in this._instanceMap)
return this._instanceMap[className];var constructorFunction=window.eval(className);if(!(constructorFunction instanceof Function)){this._instanceMap[className]=null;return null;}
var instance=new constructorFunction(extension);this._instanceMap[className]=instance;return instance;}}
Runtime.Extension=function(module,descriptor)
{this._module=module;this._descriptor=descriptor;this._type=descriptor.type;this._hasTypeClass=this._type.charAt(0)==="@";this._className=descriptor.className||null;}
Runtime.Extension.prototype={descriptor:function()
{return this._descriptor;},module:function()
{return this._module;},enabled:function()
{var activatorExperiment=this.descriptor()["experiment"];if(activatorExperiment&&activatorExperiment.startsWith("!")&&Runtime.experiments.isEnabled(activatorExperiment.substring(1)))
return false;if(activatorExperiment&&!activatorExperiment.startsWith("!")&&!Runtime.experiments.isEnabled(activatorExperiment))
return false;var condition=this.descriptor()["condition"];if(condition&&!Runtime.queryParam(condition))
return false;return this._module.enabled();},_typeClass:function()
{if(!this._hasTypeClass)
return null;return this._module._manager._resolve(this._type.substring(1));},isApplicable:function(context)
{return this._module._manager.isExtensionApplicableToContext(this,context);},instancePromise:function()
{if(!this._className)
return Promise.reject(new Error("No class name in extension"));var className=this._className;if(this._instance)
return Promise.resolve(this._instance);return this._module._loadPromise().then(constructInstance.bind(this));function constructInstance()
{var result=this._module._instance(className,this);if(!result)
return Promise.reject("Could not instantiate: "+className);return result;}},title:function(platform)
{return this._descriptor["title-"+platform]||this._descriptor["title"];}}
Runtime.ExperimentsSupport=function()
{this._supportEnabled=Runtime.queryParam("experiments")!==null;this._experiments=[];this._experimentNames={};this._enabledTransiently={};}
Runtime.ExperimentsSupport.prototype={allConfigurableExperiments:function()
{var result=[];for(var i=0;i<this._experiments.length;i++){var experiment=this._experiments[i];if(!this._enabledTransiently[experiment.name])
result.push(experiment);}
return result;},supportEnabled:function()
{return this._supportEnabled;},_setExperimentsSetting:function(value)
{if(!self.localStorage)
return;self.localStorage["experiments"]=JSON.stringify(value);},register:function(experimentName,experimentTitle,hidden)
{Runtime._assert(!this._experimentNames[experimentName],"Duplicate registration of experiment "+experimentName);this._experimentNames[experimentName]=true;this._experiments.push(new Runtime.Experiment(this,experimentName,experimentTitle,!!hidden));},isEnabled:function(experimentName)
{this._checkExperiment(experimentName);if(this._enabledTransiently[experimentName])
return true;if(!this.supportEnabled())
return false;return!!Runtime._experimentsSetting()[experimentName];},setEnabled:function(experimentName,enabled)
{this._checkExperiment(experimentName);var experimentsSetting=Runtime._experimentsSetting();experimentsSetting[experimentName]=enabled;this._setExperimentsSetting(experimentsSetting);},setDefaultExperiments:function(experimentNames)
{for(var i=0;i<experimentNames.length;++i){this._checkExperiment(experimentNames[i]);this._enabledTransiently[experimentNames[i]]=true;}},enableForTest:function(experimentName)
{this._checkExperiment(experimentName);this._enabledTransiently[experimentName]=true;},clearForTest:function()
{this._experiments=[];this._experimentNames={};this._enabledTransiently={};},cleanUpStaleExperiments:function()
{var experimentsSetting=Runtime._experimentsSetting();var cleanedUpExperimentSetting={};for(var i=0;i<this._experiments.length;++i){var experimentName=this._experiments[i].name;if(experimentsSetting[experimentName])
cleanedUpExperimentSetting[experimentName]=true;}
this._setExperimentsSetting(cleanedUpExperimentSetting);},_checkExperiment:function(experimentName)
{Runtime._assert(this._experimentNames[experimentName],"Unknown experiment "+experimentName);}}
Runtime.Experiment=function(experiments,name,title,hidden)
{this.name=name;this.title=title;this.hidden=hidden;this._experiments=experiments;}
Runtime.Experiment.prototype={isEnabled:function()
{return this._experiments.isEnabled(this.name);},setEnabled:function(enabled)
{this._experiments.setEnabled(this.name,enabled);}}
{(function parseQueryParameters()
{var queryParams=location.search;if(!queryParams)
return;var params=queryParams.substring(1).split("&");for(var i=0;i<params.length;++i){var pair=params[i].split("=");var name=pair.shift();Runtime._queryParamsObject[name]=pair.join("=");}})();}
Runtime.experiments=new Runtime.ExperimentsSupport();Runtime._remoteBase=Runtime.queryParam("remoteBase");Runtime.resolveSourceURL=function(path)
{var sourceURL=window.location.href;if(window.location.search)
sourceURL=sourceURL.replace(window.location.search,"");sourceURL=sourceURL.substring(0,sourceURL.lastIndexOf("/")+1)+path;return"\n/*# sourceURL="+sourceURL+" */";}
var runtime;console=console;console.__originalAssert=console.assert;console.assert=function(value,message)
{if(value)
return;console.__originalAssert(value,message);}
var ArrayLike;Object.isEmpty=function(obj)
{for(var i in obj)
return false;return true;}
Object.values=function(obj)
{var result=Object.keys(obj);var length=result.length;for(var i=0;i<length;++i)
result[i]=obj[result[i]];return result;}
function mod(m,n)
{return((m%n)+n)%n;}
String.prototype.findAll=function(string)
{var matches=[];var i=this.indexOf(string);while(i!==-1){matches.push(i);i=this.indexOf(string,i+string.length);}
return matches;}
String.prototype.lineEndings=function()
{if(!this._lineEndings){this._lineEndings=this.findAll("\n");this._lineEndings.push(this.length);}
return this._lineEndings;}
String.prototype.lineCount=function()
{var lineEndings=this.lineEndings();return lineEndings.length;}
String.prototype.lineAt=function(lineNumber)
{var lineEndings=this.lineEndings();var lineStart=lineNumber>0?lineEndings[lineNumber-1]+1:0;var lineEnd=lineEndings[lineNumber];var lineContent=this.substring(lineStart,lineEnd);if(lineContent.length>0&&lineContent.charAt(lineContent.length-1)==="\r")
lineContent=lineContent.substring(0,lineContent.length-1);return lineContent;}
String.prototype.escapeCharacters=function(chars)
{var foundChar=false;for(var i=0;i<chars.length;++i){if(this.indexOf(chars.charAt(i))!==-1){foundChar=true;break;}}
if(!foundChar)
return String(this);var result="";for(var i=0;i<this.length;++i){if(chars.indexOf(this.charAt(i))!==-1)
result+="\\";result+=this.charAt(i);}
return result;}
String.regexSpecialCharacters=function()
{return"^[]{}()\\.^$*+?|-,";}
String.prototype.escapeForRegExp=function()
{return this.escapeCharacters(String.regexSpecialCharacters());}
String.prototype.escapeHTML=function()
{return this.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");}
String.prototype.unescapeHTML=function()
{return this.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&#58;/g,":").replace(/&quot;/g,"\"").replace(/&#60;/g,"<").replace(/&#62;/g,">").replace(/&amp;/g,"&");}
String.prototype.collapseWhitespace=function()
{return this.replace(/[\s\xA0]+/g," ");}
String.prototype.trimMiddle=function(maxLength)
{if(this.length<=maxLength)
return String(this);var leftHalf=maxLength>>1;var rightHalf=maxLength-leftHalf-1;return this.substr(0,leftHalf)+"\u2026"+this.substr(this.length-rightHalf,rightHalf);}
String.prototype.trimEnd=function(maxLength)
{if(this.length<=maxLength)
return String(this);return this.substr(0,maxLength-1)+"\u2026";}
String.prototype.trimURL=function(baseURLDomain)
{var result=this.replace(/^(https|http|file):\/\//i,"");if(baseURLDomain){if(result.toLowerCase().startsWith(baseURLDomain.toLowerCase()))
result=result.substr(baseURLDomain.length);}
return result;}
String.prototype.toTitleCase=function()
{return this.substring(0,1).toUpperCase()+this.substring(1);}
String.prototype.compareTo=function(other)
{if(this>other)
return 1;if(this<other)
return-1;return 0;}
function sanitizeHref(href)
{return href&&href.trim().toLowerCase().startsWith("javascript:")?null:href;}
String.prototype.removeURLFragment=function()
{var fragmentIndex=this.indexOf("#");if(fragmentIndex==-1)
fragmentIndex=this.length;return this.substring(0,fragmentIndex);}
String.hashCode=function(string)
{if(!string)
return 0;var result=0;for(var i=0;i<string.length;++i)
result=(result*3+string.charCodeAt(i))|0;return result;}
String.isDigitAt=function(string,index)
{var c=string.charCodeAt(index);return 48<=c&&c<=57;}
String.prototype.toBase64=function()
{function encodeBits(b)
{return b<26?b+65:b<52?b+71:b<62?b-4:b===62?43:b===63?47:65;}
var encoder=new TextEncoder();var data=encoder.encode(this.toString());var n=data.length;var encoded="";if(n===0)
return encoded;var shift;var v=0;for(var i=0;i<n;i++){shift=i%3;v|=data[i]<<(16>>>shift&24);if(shift===2){encoded+=String.fromCharCode(encodeBits(v>>>18&63),encodeBits(v>>>12&63),encodeBits(v>>>6&63),encodeBits(v&63));v=0;}}
if(shift===0)
encoded+=String.fromCharCode(encodeBits(v>>>18&63),encodeBits(v>>>12&63),61,61);else if(shift===1)
encoded+=String.fromCharCode(encodeBits(v>>>18&63),encodeBits(v>>>12&63),encodeBits(v>>>6&63),61);return encoded;}
String.naturalOrderComparator=function(a,b)
{var chunk=/^\d+|^\D+/;var chunka,chunkb,anum,bnum;while(1){if(a){if(!b)
return 1;}else{if(b)
return-1;else
return 0;}
chunka=a.match(chunk)[0];chunkb=b.match(chunk)[0];anum=!isNaN(chunka);bnum=!isNaN(chunkb);if(anum&&!bnum)
return-1;if(bnum&&!anum)
return 1;if(anum&&bnum){var diff=chunka-chunkb;if(diff)
return diff;if(chunka.length!==chunkb.length){if(!+chunka&&!+chunkb)
return chunka.length-chunkb.length;else
return chunkb.length-chunka.length;}}else if(chunka!==chunkb)
return(chunka<chunkb)?-1:1;a=a.substring(chunka.length);b=b.substring(chunkb.length);}}
String.caseInsensetiveComparator=function(a,b)
{a=a.toUpperCase();b=b.toUpperCase();if(a===b)
return 0;return a>b?1:-1;}
Number.constrain=function(num,min,max)
{if(num<min)
num=min;else if(num>max)
num=max;return num;}
Number.gcd=function(a,b)
{if(b===0)
return a;else
return Number.gcd(b,a%b);}
Number.toFixedIfFloating=function(value)
{if(!value||isNaN(value))
return value;var number=Number(value);return number%1?number.toFixed(3):String(number);}
Date.prototype.toISO8601Compact=function()
{function leadZero(x)
{return(x>9?"":"0")+x;}
return this.getFullYear()+
leadZero(this.getMonth()+1)+
leadZero(this.getDate())+"T"+
leadZero(this.getHours())+
leadZero(this.getMinutes())+
leadZero(this.getSeconds());}
Date.prototype.toConsoleTime=function()
{function leadZero2(x)
{return(x>9?"":"0")+x;}
function leadZero3(x)
{return"0".repeat(3-x.toString().length)+x;}
return this.getFullYear()+"-"+
leadZero2(this.getMonth()+1)+"-"+
leadZero2(this.getDate())+" "+
leadZero2(this.getHours())+":"+
leadZero2(this.getMinutes())+":"+
leadZero2(this.getSeconds())+"."+
leadZero3(this.getMilliseconds());}
Object.defineProperty(Array.prototype,"remove",{value:function(value,firstOnly)
{var index=this.indexOf(value);if(index===-1)
return false;if(firstOnly){this.splice(index,1);return true;}
for(var i=index+1,n=this.length;i<n;++i){if(this[i]!==value)
this[index++]=this[i];}
this.length=index;return true;}});Object.defineProperty(Array.prototype,"keySet",{value:function()
{var keys={};for(var i=0;i<this.length;++i)
keys[this[i]]=true;return keys;}});Object.defineProperty(Array.prototype,"pushAll",{value:function(array)
{Array.prototype.push.apply(this,array);}});Object.defineProperty(Array.prototype,"rotate",{value:function(index)
{var result=[];for(var i=index;i<index+this.length;++i)
result.push(this[i%this.length]);return result;}});Object.defineProperty(Array.prototype,"sortNumbers",{value:function()
{function numericComparator(a,b)
{return a-b;}
this.sort(numericComparator);}});Object.defineProperty(Uint32Array.prototype,"sort",{value:Array.prototype.sort});(function(){var partition={value:function(comparator,left,right,pivotIndex)
{function swap(array,i1,i2)
{var temp=array[i1];array[i1]=array[i2];array[i2]=temp;}
var pivotValue=this[pivotIndex];swap(this,right,pivotIndex);var storeIndex=left;for(var i=left;i<right;++i){if(comparator(this[i],pivotValue)<0){swap(this,storeIndex,i);++storeIndex;}}
swap(this,right,storeIndex);return storeIndex;}};Object.defineProperty(Array.prototype,"partition",partition);Object.defineProperty(Uint32Array.prototype,"partition",partition);var sortRange={value:function(comparator,leftBound,rightBound,sortWindowLeft,sortWindowRight)
{function quickSortRange(array,comparator,left,right,sortWindowLeft,sortWindowRight)
{if(right<=left)
return;var pivotIndex=Math.floor(Math.random()*(right-left))+left;var pivotNewIndex=array.partition(comparator,left,right,pivotIndex);if(sortWindowLeft<pivotNewIndex)
quickSortRange(array,comparator,left,pivotNewIndex-1,sortWindowLeft,sortWindowRight);if(pivotNewIndex<sortWindowRight)
quickSortRange(array,comparator,pivotNewIndex+1,right,sortWindowLeft,sortWindowRight);}
if(leftBound===0&&rightBound===(this.length-1)&&sortWindowLeft===0&&sortWindowRight>=rightBound)
this.sort(comparator);else
quickSortRange(this,comparator,leftBound,rightBound,sortWindowLeft,sortWindowRight);return this;}}
Object.defineProperty(Array.prototype,"sortRange",sortRange);Object.defineProperty(Uint32Array.prototype,"sortRange",sortRange);})();Object.defineProperty(Array.prototype,"stableSort",{value:function(comparator)
{function defaultComparator(a,b)
{return a<b?-1:(a>b?1:0);}
comparator=comparator||defaultComparator;var indices=new Array(this.length);for(var i=0;i<this.length;++i)
indices[i]=i;var self=this;function indexComparator(a,b)
{var result=comparator(self[a],self[b]);return result?result:a-b;}
indices.sort(indexComparator);for(var i=0;i<this.length;++i){if(indices[i]<0||i===indices[i])
continue;var cyclical=i;var saved=this[i];while(true){var next=indices[cyclical];indices[cyclical]=-1;if(next===i){this[cyclical]=saved;break;}else{this[cyclical]=this[next];cyclical=next;}}}
return this;}});Object.defineProperty(Array.prototype,"qselect",{value:function(k,comparator)
{if(k<0||k>=this.length)
return;if(!comparator)
comparator=function(a,b){return a-b;}
var low=0;var high=this.length-1;for(;;){var pivotPosition=this.partition(comparator,low,high,Math.floor((high+low)/2));if(pivotPosition===k)
return this[k];else if(pivotPosition>k)
high=pivotPosition-1;else
low=pivotPosition+1;}}});Object.defineProperty(Array.prototype,"lowerBound",{value:function(object,comparator,left,right)
{function defaultComparator(a,b)
{return a<b?-1:(a>b?1:0);}
comparator=comparator||defaultComparator;var l=left||0;var r=right!==undefined?right:this.length;while(l<r){var m=(l+r)>>1;if(comparator(object,this[m])>0)
l=m+1;else
r=m;}
return r;}});Object.defineProperty(Array.prototype,"upperBound",{value:function(object,comparator,left,right)
{function defaultComparator(a,b)
{return a<b?-1:(a>b?1:0);}
comparator=comparator||defaultComparator;var l=left||0;var r=right!==undefined?right:this.length;while(l<r){var m=(l+r)>>1;if(comparator(object,this[m])>=0)
l=m+1;else
r=m;}
return r;}});Object.defineProperty(Uint32Array.prototype,"lowerBound",{value:Array.prototype.lowerBound});Object.defineProperty(Uint32Array.prototype,"upperBound",{value:Array.prototype.upperBound});Object.defineProperty(Float64Array.prototype,"lowerBound",{value:Array.prototype.lowerBound});Object.defineProperty(Array.prototype,"binaryIndexOf",{value:function(value,comparator)
{var index=this.lowerBound(value,comparator);return index<this.length&&comparator(value,this[index])===0?index:-1;}});Object.defineProperty(Array.prototype,"select",{value:function(field)
{var result=new Array(this.length);for(var i=0;i<this.length;++i)
result[i]=this[i][field];return result;}});Object.defineProperty(Array.prototype,"peekLast",{value:function()
{return this[this.length-1];}});(function(){function mergeOrIntersect(array1,array2,comparator,mergeNotIntersect)
{var result=[];var i=0;var j=0;while(i<array1.length&&j<array2.length){var compareValue=comparator(array1[i],array2[j]);if(mergeNotIntersect||!compareValue)
result.push(compareValue<=0?array1[i]:array2[j]);if(compareValue<=0)
i++;if(compareValue>=0)
j++;}
if(mergeNotIntersect){while(i<array1.length)
result.push(array1[i++]);while(j<array2.length)
result.push(array2[j++]);}
return result;}
Object.defineProperty(Array.prototype,"intersectOrdered",{value:function(array,comparator)
{return mergeOrIntersect(this,array,comparator,false);}});Object.defineProperty(Array.prototype,"mergeOrdered",{value:function(array,comparator)
{return mergeOrIntersect(this,array,comparator,true);}});}());function insertionIndexForObjectInListSortedByFunction(object,list,comparator,insertionIndexAfter)
{if(insertionIndexAfter)
return list.upperBound(object,comparator);else
return list.lowerBound(object,comparator);}
String.sprintf=function(format,var_arg)
{return String.vsprintf(format,Array.prototype.slice.call(arguments,1));}
String.tokenizeFormatString=function(format,formatters)
{var tokens=[];var substitutionIndex=0;function addStringToken(str)
{if(tokens.length&&tokens[tokens.length-1].type==="string")
tokens[tokens.length-1].value+=str;else
tokens.push({type:"string",value:str});}
function addSpecifierToken(specifier,precision,substitutionIndex)
{tokens.push({type:"specifier",specifier:specifier,precision:precision,substitutionIndex:substitutionIndex});}
var index=0;for(var precentIndex=format.indexOf("%",index);precentIndex!==-1;precentIndex=format.indexOf("%",index)){if(format.length===index)
break;addStringToken(format.substring(index,precentIndex));index=precentIndex+1;if(format[index]==="%"){addStringToken("%");++index;continue;}
if(String.isDigitAt(format,index)){var number=parseInt(format.substring(index),10);while(String.isDigitAt(format,index))
++index;if(number>0&&format[index]==="$"){substitutionIndex=(number-1);++index;}}
var precision=-1;if(format[index]==="."){++index;precision=parseInt(format.substring(index),10);if(isNaN(precision))
precision=0;while(String.isDigitAt(format,index))
++index;}
if(!(format[index]in formatters)){addStringToken(format.substring(precentIndex,index+1));++index;continue;}
addSpecifierToken(format[index],precision,substitutionIndex);++substitutionIndex;++index;}
addStringToken(format.substring(index));return tokens;}
String.standardFormatters={d:function(substitution)
{return!isNaN(substitution)?substitution:0;},f:function(substitution,token)
{if(substitution&&token.precision>-1)
substitution=substitution.toFixed(token.precision);return!isNaN(substitution)?substitution:(token.precision>-1?Number(0).toFixed(token.precision):0);},s:function(substitution)
{return substitution;}}
String.vsprintf=function(format,substitutions)
{return String.format(format,substitutions,String.standardFormatters,"",function(a,b){return a+b;}).formattedResult;}
String.format=function(format,substitutions,formatters,initialValue,append,tokenizedFormat)
{if(!format||!substitutions||!substitutions.length)
return{formattedResult:append(initialValue,format),unusedSubstitutions:substitutions};function prettyFunctionName()
{return"String.format(\""+format+"\", \""+Array.prototype.join.call(substitutions,"\", \"")+"\")";}
function warn(msg)
{console.warn(prettyFunctionName()+": "+msg);}
function error(msg)
{console.error(prettyFunctionName()+": "+msg);}
var result=initialValue;var tokens=tokenizedFormat||String.tokenizeFormatString(format,formatters);var usedSubstitutionIndexes={};for(var i=0;i<tokens.length;++i){var token=tokens[i];if(token.type==="string"){result=append(result,token.value);continue;}
if(token.type!=="specifier"){error("Unknown token type \""+token.type+"\" found.");continue;}
if(token.substitutionIndex>=substitutions.length){error("not enough substitution arguments. Had "+substitutions.length+" but needed "+(token.substitutionIndex+1)+", so substitution was skipped.");result=append(result,"%"+(token.precision>-1?token.precision:"")+token.specifier);continue;}
usedSubstitutionIndexes[token.substitutionIndex]=true;if(!(token.specifier in formatters)){warn("unsupported format character \u201C"+token.specifier+"\u201D. Treating as a string.");result=append(result,substitutions[token.substitutionIndex]);continue;}
result=append(result,formatters[token.specifier](substitutions[token.substitutionIndex],token));}
var unusedSubstitutions=[];for(var i=0;i<substitutions.length;++i){if(i in usedSubstitutionIndexes)
continue;unusedSubstitutions.push(substitutions[i]);}
return{formattedResult:result,unusedSubstitutions:unusedSubstitutions};}
function createSearchRegex(query,caseSensitive,isRegex)
{var regexFlags=caseSensitive?"g":"gi";var regexObject;if(isRegex){try{regexObject=new RegExp(query,regexFlags);}catch(e){}}
if(!regexObject)
regexObject=createPlainTextSearchRegex(query,regexFlags);return regexObject;}
function createPlainTextSearchRegex(query,flags)
{var regexSpecialCharacters=String.regexSpecialCharacters();var regex="";for(var i=0;i<query.length;++i){var c=query.charAt(i);if(regexSpecialCharacters.indexOf(c)!=-1)
regex+="\\";regex+=c;}
return new RegExp(regex,flags||"");}
function countRegexMatches(regex,content)
{var text=content;var result=0;var match;while(text&&(match=regex.exec(text))){if(match[0].length>0)
++result;text=text.substring(match.index+1);}
return result;}
function spacesPadding(spacesCount)
{return"\u00a0".repeat(spacesCount);}
function numberToStringWithSpacesPadding(value,symbolsCount)
{var numberString=value.toString();var paddingLength=Math.max(0,symbolsCount-numberString.length);return spacesPadding(paddingLength)+numberString;}
Array.from=function(iterator)
{var values=[];for(var iteratorValue=iterator.next();!iteratorValue.done;iteratorValue=iterator.next())
values.push(iteratorValue.value);return values;}
Set.prototype.valuesArray=function()
{return Array.from(this.values());}
Map.prototype.remove=function(key)
{var value=this.get(key);this.delete(key);return value;}
Map.prototype.valuesArray=function()
{return Array.from(this.values());}
Map.prototype.keysArray=function()
{return Array.from(this.keys());}
var Multimap=function()
{this._map=new Map();}
Multimap.prototype={set:function(key,value)
{var set=this._map.get(key);if(!set){set=new Set();this._map.set(key,set);}
set.add(value);},get:function(key)
{var result=this._map.get(key);if(!result)
result=new Set();return result;},has:function(key)
{return this._map.has(key);},get size()
{return this._map.size;},remove:function(key,value)
{var values=this.get(key);values.delete(value);if(!values.size)
this._map.delete(key);},removeAll:function(key)
{this._map.delete(key);},keysArray:function()
{return this._map.keysArray();},valuesArray:function()
{var result=[];var keys=this.keysArray();for(var i=0;i<keys.length;++i)
result.pushAll(this.get(keys[i]).valuesArray());return result;},clear:function()
{this._map.clear();}}
function loadXHR(url)
{return new Promise(load);function load(successCallback,failureCallback)
{function onReadyStateChanged()
{if(xhr.readyState!==XMLHttpRequest.DONE)
return;if(xhr.status!==200){xhr.onreadystatechange=null;failureCallback(new Error(xhr.status));return;}
xhr.onreadystatechange=null;successCallback(xhr.responseText);}
var xhr=new XMLHttpRequest();xhr.withCredentials=false;xhr.open("GET",url,true);xhr.onreadystatechange=onReadyStateChanged;xhr.send(null);}}
function CallbackBarrier()
{this._pendingIncomingCallbacksCount=0;}
CallbackBarrier.prototype={createCallback:function(userCallback)
{console.assert(!this._outgoingCallback,"CallbackBarrier.createCallback() is called after CallbackBarrier.callWhenDone()");++this._pendingIncomingCallbacksCount;return this._incomingCallback.bind(this,userCallback);},callWhenDone:function(callback)
{console.assert(!this._outgoingCallback,"CallbackBarrier.callWhenDone() is called multiple times");this._outgoingCallback=callback;if(!this._pendingIncomingCallbacksCount)
this._outgoingCallback();},donePromise:function()
{return new Promise(promiseConstructor.bind(this));function promiseConstructor(success)
{this.callWhenDone(success);}},_incomingCallback:function(userCallback)
{console.assert(this._pendingIncomingCallbacksCount>0);if(userCallback){var args=Array.prototype.slice.call(arguments,1);userCallback.apply(null,args);}
if(!--this._pendingIncomingCallbacksCount&&this._outgoingCallback)
this._outgoingCallback();}}
function suppressUnused(value)
{}
self.setImmediate=function(callback)
{Promise.resolve().then(callback);return 0;}
Promise.prototype.spread=function(callback)
{return this.then(spreadPromise);function spreadPromise(arg)
{return callback.apply(null,arg);}}
Promise.prototype.catchException=function(defaultValue){return this.catch(function(error){console.error(error);return defaultValue;});};Node.prototype.rangeOfWord=function(offset,stopCharacters,stayWithinNode,direction)
{var startNode;var startOffset=0;var endNode;var endOffset=0;if(!stayWithinNode)
stayWithinNode=this;if(!direction||direction==="backward"||direction==="both"){var node=this;while(node){if(node===stayWithinNode){if(!startNode)
startNode=stayWithinNode;break;}
if(node.nodeType===Node.TEXT_NODE){var start=(node===this?(offset-1):(node.nodeValue.length-1));for(var i=start;i>=0;--i){if(stopCharacters.indexOf(node.nodeValue[i])!==-1){startNode=node;startOffset=i+1;break;}}}
if(startNode)
break;node=node.traversePreviousNode(stayWithinNode);}
if(!startNode){startNode=stayWithinNode;startOffset=0;}}else{startNode=this;startOffset=offset;}
if(!direction||direction==="forward"||direction==="both"){node=this;while(node){if(node===stayWithinNode){if(!endNode)
endNode=stayWithinNode;break;}
if(node.nodeType===Node.TEXT_NODE){var start=(node===this?offset:0);for(var i=start;i<node.nodeValue.length;++i){if(stopCharacters.indexOf(node.nodeValue[i])!==-1){endNode=node;endOffset=i;break;}}}
if(endNode)
break;node=node.traverseNextNode(stayWithinNode);}
if(!endNode){endNode=stayWithinNode;endOffset=stayWithinNode.nodeType===Node.TEXT_NODE?stayWithinNode.nodeValue.length:stayWithinNode.childNodes.length;}}else{endNode=this;endOffset=offset;}
var result=this.ownerDocument.createRange();result.setStart(startNode,startOffset);result.setEnd(endNode,endOffset);return result;}
Node.prototype.traverseNextTextNode=function(stayWithin)
{var node=this.traverseNextNode(stayWithin);if(!node)
return null;var nonTextTags={"STYLE":1,"SCRIPT":1};while(node&&(node.nodeType!==Node.TEXT_NODE||nonTextTags[node.parentElement.nodeName]))
node=node.traverseNextNode(stayWithin);return node;}
Element.prototype.positionAt=function(x,y,relativeTo)
{var shift={x:0,y:0};if(relativeTo)
shift=relativeTo.boxInWindow(this.ownerDocument.defaultView);if(typeof x==="number")
this.style.setProperty("left",(shift.x+x)+"px");else
this.style.removeProperty("left");if(typeof y==="number")
this.style.setProperty("top",(shift.y+y)+"px");else
this.style.removeProperty("top");if(typeof x==="number"||typeof y==="number")
this.style.setProperty("position","absolute");else
this.style.removeProperty("position");}
Element.prototype.isScrolledToBottom=function()
{return Math.abs(this.scrollTop+this.clientHeight-this.scrollHeight)<=2;}
function removeSubsequentNodes(fromNode,toNode)
{for(var node=fromNode;node&&node!==toNode;){var nodeToRemove=node;node=node.nextSibling;nodeToRemove.remove();}}
Element.prototype.containsEventPoint=function(event)
{var box=this.getBoundingClientRect();return box.left<event.x&&event.x<box.right&&box.top<event.y&&event.y<box.bottom;}
Node.prototype.enclosingNodeOrSelfWithNodeNameInArray=function(nameArray)
{for(var node=this;node&&node!==this.ownerDocument;node=node.parentNodeOrShadowHost()){for(var i=0;i<nameArray.length;++i){if(node.nodeName.toLowerCase()===nameArray[i].toLowerCase())
return node;}}
return null;}
Node.prototype.enclosingNodeOrSelfWithNodeName=function(nodeName)
{return this.enclosingNodeOrSelfWithNodeNameInArray([nodeName]);}
Node.prototype.enclosingNodeOrSelfWithClass=function(className,stayWithin)
{return this.enclosingNodeOrSelfWithClassList([className],stayWithin);}
Node.prototype.enclosingNodeOrSelfWithClassList=function(classNames,stayWithin)
{for(var node=this;node&&node!==stayWithin&&node!==this.ownerDocument;node=node.parentNodeOrShadowHost()){if(node.nodeType===Node.ELEMENT_NODE){var containsAll=true;for(var i=0;i<classNames.length&&containsAll;++i){if(!node.classList.contains(classNames[i]))
containsAll=false;}
if(containsAll)
return(node);}}
return null;}
Node.prototype.parentElementOrShadowHost=function()
{var node=this.parentNode;if(!node)
return null;if(node.nodeType===Node.ELEMENT_NODE)
return(node);if(node.nodeType===Node.DOCUMENT_FRAGMENT_NODE)
return(node.host);return null;}
Node.prototype.parentNodeOrShadowHost=function()
{return this.parentNode||this.host||null;}
Node.prototype.getComponentSelection=function()
{var parent=this.parentNode;while(parent&&parent.nodeType!==Node.DOCUMENT_FRAGMENT_NODE)
parent=parent.parentNode;return parent instanceof ShadowRoot?parent.getSelection():this.window().getSelection();}
Node.prototype.isComponentSelectionCollapsed=function()
{var selection=this.getComponentSelection();return selection&&selection.rangeCount?selection.getRangeAt(0).collapsed:true;}
Node.prototype.getDeepSelection=function()
{var activeElement=this.ownerDocument.activeElement;var shadowRoot=null;while(activeElement&&activeElement.shadowRoot){shadowRoot=activeElement.shadowRoot;activeElement=shadowRoot.activeElement;}
return shadowRoot?shadowRoot.getSelection():this.window().getSelection();}
Node.prototype.window=function()
{return this.ownerDocument.defaultView;}
Element.prototype.query=function(query)
{return this.ownerDocument.evaluate(query,this,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue;}
Element.prototype.removeChildren=function()
{if(this.firstChild)
this.textContent="";}
Element.prototype.isInsertionCaretInside=function()
{var selection=this.getComponentSelection();if(!selection.rangeCount||!selection.isCollapsed)
return false;var selectionRange=selection.getRangeAt(0);return selectionRange.startContainer.isSelfOrDescendant(this);}
function createElement(tagName,customElementType)
{return document.createElement(tagName,customElementType||"");}
function createEvent(type,bubbles,cancelable)
{var event=document.createEvent("Event");event.initEvent(type,bubbles,cancelable);return event;}
function createTextNode(data)
{return document.createTextNode(data);}
Document.prototype.createElementWithClass=function(elementName,className,customElementType)
{var element=this.createElement(elementName,customElementType||"");if(className)
element.className=className;return element;}
function createElementWithClass(elementName,className,customElementType)
{return document.createElementWithClass(elementName,className,customElementType);}
Document.prototype.createSVGElement=function(childType,className)
{var element=this.createElementNS("https://www.w3.org/2000/svg",childType);if(className)
element.setAttribute("class",className);return element;}
function createSVGElement(childType,className)
{return document.createSVGElement(childType,className);}
function createDocumentFragment()
{return document.createDocumentFragment();}
Element.prototype.createChild=function(elementName,className,customElementType)
{var element=this.ownerDocument.createElementWithClass(elementName,className,customElementType);this.appendChild(element);return element;}
DocumentFragment.prototype.createChild=Element.prototype.createChild;Element.prototype.createTextChild=function(text)
{var element=this.ownerDocument.createTextNode(text);this.appendChild(element);return element;}
DocumentFragment.prototype.createTextChild=Element.prototype.createTextChild;Element.prototype.createTextChildren=function(var_args)
{for(var i=0,n=arguments.length;i<n;++i)
this.createTextChild(arguments[i]);}
DocumentFragment.prototype.createTextChildren=Element.prototype.createTextChildren;Element.prototype.totalOffsetLeft=function()
{return this.totalOffset().left;}
Element.prototype.totalOffsetTop=function()
{return this.totalOffset().top;}
Element.prototype.totalOffset=function()
{var rect=this.getBoundingClientRect();return{left:rect.left,top:rect.top};}
Element.prototype.scrollOffset=function()
{var curLeft=0;var curTop=0;for(var element=this;element;element=element.scrollParent){curLeft+=element.scrollLeft;curTop+=element.scrollTop;}
return{left:curLeft,top:curTop};}
Element.prototype.createSVGChild=function(childType,className)
{var child=this.ownerDocument.createSVGElement(childType,className);this.appendChild(child);return child;}
function AnchorBox(x,y,width,height)
{this.x=x||0;this.y=y||0;this.width=width||0;this.height=height||0;}
AnchorBox.prototype.relativeTo=function(box)
{return new AnchorBox(this.x-box.x,this.y-box.y,this.width,this.height);}
AnchorBox.prototype.relativeToElement=function(element)
{return this.relativeTo(element.boxInWindow(element.ownerDocument.defaultView));}
AnchorBox.prototype.equals=function(anchorBox)
{return!!anchorBox&&this.x===anchorBox.x&&this.y===anchorBox.y&&this.width===anchorBox.width&&this.height===anchorBox.height;}
Element.prototype.offsetRelativeToWindow=function(targetWindow)
{var elementOffset=new AnchorBox();var curElement=this;var curWindow=this.ownerDocument.defaultView;while(curWindow&&curElement){elementOffset.x+=curElement.totalOffsetLeft();elementOffset.y+=curElement.totalOffsetTop();if(curWindow===targetWindow)
break;curElement=curWindow.frameElement;curWindow=curWindow.parent;}
return elementOffset;}
Element.prototype.boxInWindow=function(targetWindow)
{targetWindow=targetWindow||this.ownerDocument.defaultView;var anchorBox=this.offsetRelativeToWindow(window);anchorBox.width=Math.min(this.offsetWidth,window.innerWidth-anchorBox.x);anchorBox.height=Math.min(this.offsetHeight,window.innerHeight-anchorBox.y);return anchorBox;}
Element.prototype.setTextAndTitle=function(text)
{this.textContent=text;this.title=text;}
KeyboardEvent.prototype.__defineGetter__("data",function()
{switch(this.type){case"keypress":if(!this.ctrlKey&&!this.metaKey)
return String.fromCharCode(this.charCode);else
return"";case"keydown":case"keyup":if(!this.ctrlKey&&!this.metaKey&&!this.altKey)
return String.fromCharCode(this.which);else
return"";}});Event.prototype.consume=function(preventDefault)
{this.stopImmediatePropagation();if(preventDefault)
this.preventDefault();this.handled=true;}
Text.prototype.select=function(start,end)
{start=start||0;end=end||this.textContent.length;if(start<0)
start=end+start;var selection=this.getComponentSelection();selection.removeAllRanges();var range=this.ownerDocument.createRange();range.setStart(this,start);range.setEnd(this,end);selection.addRange(range);return this;}
Element.prototype.selectionLeftOffset=function()
{var selection=this.getComponentSelection();if(!selection.containsNode(this,true))
return null;var leftOffset=selection.anchorOffset;var node=selection.anchorNode;while(node!==this){while(node.previousSibling){node=node.previousSibling;leftOffset+=node.textContent.length;}
node=node.parentNodeOrShadowHost();}
return leftOffset;}
HTMLImageElement.prototype.completePromise=function()
{var element=this;if(element.complete)
return Promise.resolve(element);return new Promise(promiseBody);function promiseBody(resolve)
{element.addEventListener("load",oncomplete);element.addEventListener("error",oncomplete);function oncomplete()
{resolve(element);}}}
Node.prototype.appendChildren=function(var_args)
{for(var i=0,n=arguments.length;i<n;++i)
this.appendChild(arguments[i]);}
Node.prototype.deepTextContent=function()
{return this.childTextNodes().map(function(node){return node.textContent;}).join("");}
Node.prototype.childTextNodes=function()
{var node=this.traverseNextTextNode(this);var result=[];var nonTextTags={"STYLE":1,"SCRIPT":1};while(node){if(!nonTextTags[node.parentElement.nodeName])
result.push(node);node=node.traverseNextTextNode(this);}
return result;}
Node.prototype.isAncestor=function(node)
{if(!node)
return false;var currentNode=node.parentNodeOrShadowHost();while(currentNode){if(this===currentNode)
return true;currentNode=currentNode.parentNodeOrShadowHost();}
return false;}
Node.prototype.isDescendant=function(descendant)
{return!!descendant&&descendant.isAncestor(this);}
Node.prototype.isSelfOrAncestor=function(node)
{return!!node&&(node===this||this.isAncestor(node));}
Node.prototype.isSelfOrDescendant=function(node)
{return!!node&&(node===this||this.isDescendant(node));}
Node.prototype.traverseNextNode=function(stayWithin)
{if(this.shadowRoot)
return this.shadowRoot;var distributedNodes=this.getDistributedNodes?this.getDistributedNodes():[];if(distributedNodes.length)
return distributedNodes[0];if(this.firstChild)
return this.firstChild;var node=this;while(node){if(stayWithin&&node===stayWithin)
return null;var sibling=nextSibling(node);if(sibling)
return sibling;node=insertionPoint(node)||node.parentNodeOrShadowHost();}
function nextSibling(node)
{var parent=insertionPoint(node);if(!parent)
return node.nextSibling;var distributedNodes=parent.getDistributedNodes?parent.getDistributedNodes():[];var position=Array.prototype.indexOf.call(distributedNodes,node);if(position+1<distributedNodes.length)
return distributedNodes[position+1];return null;}
function insertionPoint(node)
{var insertionPoints=node.getDestinationInsertionPoints?node.getDestinationInsertionPoints():[];return insertionPoints.length>0?insertionPoints[insertionPoints.length-1]:null;}
return null;}
Node.prototype.traversePreviousNode=function(stayWithin)
{if(stayWithin&&this===stayWithin)
return null;var node=this.previousSibling;while(node&&node.lastChild)
node=node.lastChild;if(node)
return node;return this.parentNodeOrShadowHost();}
Node.prototype.setTextContentTruncatedIfNeeded=function(text,placeholder)
{const maxTextContentLength=10000;if(typeof text==="string"&&text.length>maxTextContentLength){this.textContent=typeof placeholder==="string"?placeholder:text.trimMiddle(maxTextContentLength);return true;}
this.textContent=text;return false;}
Event.prototype.deepElementFromPoint=function()
{var node=this.target;while(node&&node.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&node.nodeType!==Node.DOCUMENT_NODE)
node=node.parentNode;if(!node)
return null;node=node.elementFromPoint(this.pageX,this.pageY);while(node&&node.shadowRoot)
node=node.shadowRoot.elementFromPoint(this.pageX,this.pageY);return node;}
Event.prototype.deepActiveElement=function()
{var activeElement=this.target&&this.target.ownerDocument?this.target.ownerDocument.activeElement:null;while(activeElement&&activeElement.shadowRoot)
activeElement=activeElement.shadowRoot.activeElement;return activeElement;}
Document.prototype.deepElementFromPoint=function(x,y)
{var node=this.elementFromPoint(x,y);while(node&&node.shadowRoot)
node=node.shadowRoot.elementFromPoint(x,y);return node;}
function isEnterKey(event)
{return event.keyCode!==229&&event.keyIdentifier==="Enter";}
function isEscKey(event)
{return event.keyCode===27;}
function consumeEvent(e)
{e.consume();}
function runOnWindowLoad(callback)
{function windowLoaded()
{window.removeEventListener("DOMContentLoaded",windowLoaded,false);callback();}
if(document.readyState==="complete"||document.readyState==="interactive")
callback();else
window.addEventListener("DOMContentLoaded",windowLoaded,false);};var WorkerRuntime={};WorkerRuntime.startSharedWorker=function(moduleName,workerName)
{if(Runtime.isReleaseMode()){try{var worker=new SharedWorker(moduleName+"_module.js",workerName);return Promise.resolve(worker);}catch(e){return Promise.reject(e);}}
return loadResourcePromise(moduleName+"/module.json").then(start,start.bind(null,undefined));function start(content)
{if(!content)
throw new Error("Worker is not defined: "+moduleName+" "+new Error().stack);var scripts=JSON.parse(content)["scripts"];if(scripts.length!==1)
throw new Error("WorkerRuntime.startSharedWorker supports modules with only one script!");return new SharedWorker(moduleName+"/"+scripts[0],workerName);}}
WorkerRuntime.startWorker=function(moduleName)
{if(Runtime.isReleaseMode())
return Promise.resolve(new Worker(moduleName+"_module.js"));var loader=function(){self.onmessage=function(event){self.onmessage=null;var scripts=event.data;for(var i=0;i<scripts.length;++i){var source=scripts[i]["source"];self.eval(source+"\n//# sourceURL="+scripts[i]["url"]);}};};return loadResourcePromise(moduleName+"/module.json").then(start,start.bind(null,undefined));function start(content)
{if(!content)
throw new Error("Worker is not defined: "+moduleName+" "+new Error().stack);var message=[];var scripts=JSON.parse(content)["scripts"];var promise=Promise.resolve();for(var i=0;i<scripts.length;++i){var url=self._importScriptPathPrefix+moduleName+"/"+scripts[i];var parts=url.split("://");url=parts.length===1?url:parts[0]+"://"+normalizePath(parts[1]);promise=promise.then(promiseGetter(loadResourcePromise(moduleName+"/"+scripts[i]))).then(pushSource.bind(null,url),pushSource.bind(null,null,null));}
return promise.then(createWorker);function promiseGetter(promise)
{return function(){return promise;};}
function pushSource(url,source)
{if(!url){console.error("Failed to load "+url);return;}
message.push({source:source,url:url});}
function createWorker()
{var blob=new Blob(["("+loader.toString()+")()\n//# sourceURL="+moduleName],{type:"text/javascript"});var workerURL=window.URL.createObjectURL(blob);try{var worker=new Worker(workerURL);worker.postMessage(message);return worker;}finally{window.URL.revokeObjectURL(workerURL);}}}}
WorkerRuntime.Worker=function(moduleName,workerName)
{this._workerPromise=workerName?WorkerRuntime.startSharedWorker(moduleName,(workerName)):WorkerRuntime.startWorker(moduleName);}
WorkerRuntime.Worker.prototype={postMessage:function(message)
{this._workerPromise.then(postToWorker.bind(this));function postToWorker(worker)
{if(!this._disposed)
worker.postMessage(message);}},dispose:function()
{this._disposed=true;this._workerPromise.then(terminate);function terminate(worker)
{worker.terminate();}},terminate:function()
{this.dispose();},set onmessage(listener)
{this._workerPromise.then(setOnMessage);function setOnMessage(worker)
{worker.onmessage=listener;}},set onerror(listener)
{this._workerPromise.then(setOnError);function setOnError(worker)
{worker.onerror=listener;}},get port()
{return new WorkerRuntime.Worker.FuturePort(this);}}
WorkerRuntime.Worker.FuturePort=function(worker)
{this._worker=worker;}
WorkerRuntime.Worker.FuturePort.prototype={set onmessage(listener)
{this._worker._workerPromise.then(setOnMessage);function setOnMessage(worker)
{worker.port.onmessage=listener;}},set onerror(listener)
{this._worker._workerPromise.then(setOnError);function setOnError(worker)
{worker.port.onerror=listener;}}};self.WebInspector={};WebInspector.TextDictionary=function()
{this._words={};}
WebInspector.TextDictionary.prototype={addWord:function(word)
{if(!this._words[word])
this._words[word]=1;else
++this._words[word];},removeWord:function(word)
{if(!this._words[word])
return;if(this._words[word]===1)
delete this._words[word];else
--this._words[word];},wordsWithPrefix:function(prefix)
{var words=[];for(var i in this._words){if(i.startsWith(prefix))
words.push(i);}
return words;},hasWord:function(word)
{return!!this._words[word];},wordCount:function(word)
{return this._words[word]?this._words[word]:0;},reset:function()
{this._words={};}};WebInspector.Object=function(){}
WebInspector.Object.prototype={addEventListener:function(eventType,listener,thisObject)
{if(!listener)
console.assert(false);if(!this._listeners)
this._listeners=new Map();if(!this._listeners.has(eventType))
this._listeners.set(eventType,[]);this._listeners.get(eventType).push({thisObject:thisObject,listener:listener});return new WebInspector.EventTarget.EventDescriptor(this,eventType,thisObject,listener);},removeEventListener:function(eventType,listener,thisObject)
{console.assert(listener);if(!this._listeners||!this._listeners.has(eventType))
return;var listeners=this._listeners.get(eventType);for(var i=0;i<listeners.length;++i){if(listeners[i].listener===listener&&listeners[i].thisObject===thisObject)
listeners.splice(i--,1);}
if(!listeners.length)
this._listeners.delete(eventType);},removeAllListeners:function()
{delete this._listeners;},hasEventListeners:function(eventType)
{if(!this._listeners||!this._listeners.has(eventType))
return false;return true;},dispatchEventToListeners:function(eventType,eventData)
{if(!this._listeners||!this._listeners.has(eventType))
return false;var event=new WebInspector.Event(this,eventType,eventData);var listeners=this._listeners.get(eventType).slice(0);for(var i=0;i<listeners.length;++i){listeners[i].listener.call(listeners[i].thisObject,event);if(event._stoppedPropagation)
break;}
return event.defaultPrevented;}}
WebInspector.Event=function(target,type,data)
{this.target=target;this.type=type;this.data=data;this.defaultPrevented=false;this._stoppedPropagation=false;}
WebInspector.Event.prototype={stopPropagation:function()
{this._stoppedPropagation=true;},preventDefault:function()
{this.defaultPrevented=true;},consume:function(preventDefault)
{this.stopPropagation();if(preventDefault)
this.preventDefault();}}
WebInspector.EventTarget=function()
{}
WebInspector.EventTarget.removeEventListeners=function(eventList)
{for(var i=0;i<eventList.length;++i){var eventInfo=eventList[i];eventInfo.eventTarget.removeEventListener(eventInfo.eventType,eventInfo.method,eventInfo.receiver);}}
WebInspector.EventTarget.prototype={addEventListener:function(eventType,listener,thisObject){},removeEventListener:function(eventType,listener,thisObject){},removeAllListeners:function(){},hasEventListeners:function(eventType){},dispatchEventToListeners:function(eventType,eventData){},}
WebInspector.EventTarget.EventDescriptor=function(eventTarget,eventType,receiver,method)
{this.eventTarget=eventTarget;this.eventType=eventType;this.receiver=receiver;this.method=method;};WebInspector.NotificationService=function(){}
WebInspector.NotificationService.prototype={__proto__:WebInspector.Object.prototype}
WebInspector.NotificationService.Events={InspectorAgentEnabledForTests:"InspectorAgentEnabledForTests",SelectedNodeChanged:"SelectedNodeChanged"}
WebInspector.notifications=new WebInspector.NotificationService();;WebInspector.Color=function(rgba,format,originalText)
{this._rgba=rgba;this._originalText=originalText||null;this._originalTextIsValid=!!this._originalText;this._format=format;if(typeof this._rgba[3]==="undefined")
this._rgba[3]=1;for(var i=0;i<4;++i){if(this._rgba[i]<0){this._rgba[i]=0;this._originalTextIsValid=false;}
if(this._rgba[i]>1){this._rgba[i]=1;this._originalTextIsValid=false;}}}
WebInspector.Color.Format={Original:"original",Nickname:"nickname",HEX:"hex",ShortHEX:"shorthex",RGB:"rgb",RGBA:"rgba",HSL:"hsl",HSLA:"hsla"}
WebInspector.Color.parse=function(text)
{var value=text.toLowerCase().replace(/\s+/g,"");var simple=/^(?:#([0-9a-f]{3}|[0-9a-f]{6})|rgb\(((?:-?\d+%?,){2}-?\d+%?)\)|(\w+)|hsl\((-?\d+\.?\d*(?:,-?\d+\.?\d*%){2})\))$/i;var match=value.match(simple);if(match){if(match[1]){var hex=match[1].toUpperCase();var format;if(hex.length===3){format=WebInspector.Color.Format.ShortHEX;hex=hex.charAt(0)+hex.charAt(0)+hex.charAt(1)+hex.charAt(1)+hex.charAt(2)+hex.charAt(2);}else
format=WebInspector.Color.Format.HEX;var r=parseInt(hex.substring(0,2),16);var g=parseInt(hex.substring(2,4),16);var b=parseInt(hex.substring(4,6),16);return new WebInspector.Color([r/255,g/255,b/255,1],format,text);}
if(match[2]){var rgbString=match[2].split(/\s*,\s*/);var rgba=[WebInspector.Color._parseRgbNumeric(rgbString[0]),WebInspector.Color._parseRgbNumeric(rgbString[1]),WebInspector.Color._parseRgbNumeric(rgbString[2]),1];return new WebInspector.Color(rgba,WebInspector.Color.Format.RGB,text);}
if(match[3]){var nickname=match[3].toLowerCase();if(nickname in WebInspector.Color.Nicknames){var rgba=WebInspector.Color.Nicknames[nickname];var color=WebInspector.Color.fromRGBA(rgba);color._format=WebInspector.Color.Format.Nickname;color._originalText=text;return color;}
return null;}
if(match[4]){var hslString=match[4].replace(/%/g,"").split(/\s*,\s*/);var hsla=[WebInspector.Color._parseHueNumeric(hslString[0]),WebInspector.Color._parseSatLightNumeric(hslString[1]),WebInspector.Color._parseSatLightNumeric(hslString[2]),1];var rgba=[];WebInspector.Color.hsl2rgb(hsla,rgba);return new WebInspector.Color(rgba,WebInspector.Color.Format.HSL,text);}
return null;}
var advanced=/^(?:rgba\(((?:-?\d+%?,){3}-?(?:\d+|\d*\.\d+))\)|hsla\((-?(?:\d+|\d*\.\d+)(?:,-?(?:\d+|\d*\.\d+)*%){2},-?(?:\d+|\d*\.\d+))\))$/;match=value.match(advanced);if(match){if(match[1]){var rgbaString=match[1].split(/\s*,\s*/);var rgba=[WebInspector.Color._parseRgbNumeric(rgbaString[0]),WebInspector.Color._parseRgbNumeric(rgbaString[1]),WebInspector.Color._parseRgbNumeric(rgbaString[2]),WebInspector.Color._parseAlphaNumeric(rgbaString[3])];return new WebInspector.Color(rgba,WebInspector.Color.Format.RGBA,text);}
if(match[2]){var hslaString=match[2].replace(/%/g,"").split(/\s*,\s*/);var hsla=[WebInspector.Color._parseHueNumeric(hslaString[0]),WebInspector.Color._parseSatLightNumeric(hslaString[1]),WebInspector.Color._parseSatLightNumeric(hslaString[2]),WebInspector.Color._parseAlphaNumeric(hslaString[3])];var rgba=[];WebInspector.Color.hsl2rgb(hsla,rgba);return new WebInspector.Color(rgba,WebInspector.Color.Format.HSLA,text);}}
return null;}
WebInspector.Color.fromRGBA=function(rgba)
{return new WebInspector.Color([rgba[0]/255,rgba[1]/255,rgba[2]/255,rgba[3]],WebInspector.Color.Format.RGBA);}
WebInspector.Color.fromHSVA=function(hsva)
{var rgba=[];WebInspector.Color.hsva2rgba(hsva,rgba);return new WebInspector.Color(rgba,WebInspector.Color.Format.HSLA);}
WebInspector.Color.prototype={format:function()
{return this._format;},hsla:function()
{if(this._hsla)
return this._hsla;var r=this._rgba[0];var g=this._rgba[1];var b=this._rgba[2];var max=Math.max(r,g,b);var min=Math.min(r,g,b);var diff=max-min;var add=max+min;if(min===max)
var h=0;else if(r===max)
var h=((1/6*(g-b)/diff)+1)%1;else if(g===max)
var h=(1/6*(b-r)/diff)+1/3;else
var h=(1/6*(r-g)/diff)+2/3;var l=0.5*add;if(l===0)
var s=0;else if(l===1)
var s=0;else if(l<=0.5)
var s=diff/add;else
var s=diff/(2-add);this._hsla=[h,s,l,this._rgba[3]];return this._hsla;},canonicalHSLA:function()
{var hsla=this.hsla();return[Math.round(hsla[0]*360),Math.round(hsla[1]*100),Math.round(hsla[2]*100),hsla[3]];},hsva:function()
{var hsla=this.hsla();var h=hsla[0];var s=hsla[1];var l=hsla[2];s*=l<0.5?l:1-l;return[h,s!==0?2*s/(l+s):0,(l+s),hsla[3]];},hasAlpha:function()
{return this._rgba[3]!==1;},canBeShortHex:function()
{if(this.hasAlpha())
return false;for(var i=0;i<3;++i){var c=Math.round(this._rgba[i]*255);if(c%17)
return false;}
return true;},asString:function(format)
{if(format===this._format&&this._originalTextIsValid)
return this._originalText;if(!format)
format=this._format;function toRgbValue(value)
{return Math.round(value*255);}
function toHexValue(value)
{var hex=Math.round(value*255).toString(16);return hex.length===1?"0"+hex:hex;}
function toShortHexValue(value)
{return(Math.round(value*255)/17).toString(16);}
switch(format){case WebInspector.Color.Format.Original:return this._originalText;case WebInspector.Color.Format.RGB:if(this.hasAlpha())
return null;return String.sprintf("rgb(%d, %d, %d)",toRgbValue(this._rgba[0]),toRgbValue(this._rgba[1]),toRgbValue(this._rgba[2]));case WebInspector.Color.Format.RGBA:return String.sprintf("rgba(%d, %d, %d, %f)",toRgbValue(this._rgba[0]),toRgbValue(this._rgba[1]),toRgbValue(this._rgba[2]),this._rgba[3]);case WebInspector.Color.Format.HSL:if(this.hasAlpha())
return null;var hsl=this.hsla();return String.sprintf("hsl(%d, %d%, %d%)",Math.round(hsl[0]*360),Math.round(hsl[1]*100),Math.round(hsl[2]*100));case WebInspector.Color.Format.HSLA:var hsla=this.hsla();return String.sprintf("hsla(%d, %d%, %d%, %f)",Math.round(hsla[0]*360),Math.round(hsla[1]*100),Math.round(hsla[2]*100),hsla[3]);case WebInspector.Color.Format.HEX:if(this.hasAlpha())
return null;return String.sprintf("#%s%s%s",toHexValue(this._rgba[0]),toHexValue(this._rgba[1]),toHexValue(this._rgba[2])).toUpperCase();case WebInspector.Color.Format.ShortHEX:if(!this.canBeShortHex())
return null;return String.sprintf("#%s%s%s",toShortHexValue(this._rgba[0]),toShortHexValue(this._rgba[1]),toShortHexValue(this._rgba[2])).toUpperCase();case WebInspector.Color.Format.Nickname:return this.nickname();}
return this._originalText;},rgba:function()
{return this._rgba.slice();},canonicalRGBA:function()
{var rgba=new Array(4);for(var i=0;i<3;++i)
rgba[i]=Math.round(this._rgba[i]*255);rgba[3]=this._rgba[3];return rgba;},nickname:function()
{if(!WebInspector.Color._rgbaToNickname){WebInspector.Color._rgbaToNickname={};for(var nickname in WebInspector.Color.Nicknames){var rgba=WebInspector.Color.Nicknames[nickname];if(rgba.length!==4)
rgba=rgba.concat(1);WebInspector.Color._rgbaToNickname[rgba]=nickname;}}
return WebInspector.Color._rgbaToNickname[this.canonicalRGBA()]||null;},toProtocolRGBA:function()
{var rgba=this.canonicalRGBA();var result={r:rgba[0],g:rgba[1],b:rgba[2]};if(rgba[3]!==1)
result.a=rgba[3];return result;},invert:function()
{var rgba=[];rgba[0]=1-this._rgba[0];rgba[1]=1-this._rgba[1];rgba[2]=1-this._rgba[2];rgba[3]=this._rgba[3];return new WebInspector.Color(rgba,WebInspector.Color.Format.RGBA);},setAlpha:function(alpha)
{var rgba=this._rgba.slice();rgba[3]=alpha;return new WebInspector.Color(rgba,WebInspector.Color.Format.RGBA);}}
WebInspector.Color._parseRgbNumeric=function(value)
{var parsed=parseInt(value,10);if(value.indexOf("%")!==-1)
parsed/=100;else
parsed/=255;return parsed;}
WebInspector.Color._parseHueNumeric=function(value)
{return isNaN(value)?0:(parseFloat(value)/360)%1;}
WebInspector.Color._parseSatLightNumeric=function(value)
{return Math.min(1,parseFloat(value)/100);}
WebInspector.Color._parseAlphaNumeric=function(value)
{return isNaN(value)?0:parseFloat(value);}
WebInspector.Color._hsva2hsla=function(hsva,out_hsla)
{var h=hsva[0];var s=hsva[1];var v=hsva[2];var t=(2-s)*v;if(v===0||s===0)
s=0;else
s*=v/(t<1?t:2-t);out_hsla[0]=h;out_hsla[1]=s;out_hsla[2]=t/2;out_hsla[3]=hsva[3];}
WebInspector.Color.hsl2rgb=function(hsl,out_rgb)
{var h=hsl[0];var s=hsl[1];var l=hsl[2];function hue2rgb(p,q,h)
{if(h<0)
h+=1;else if(h>1)
h-=1;if((h*6)<1)
return p+(q-p)*h*6;else if((h*2)<1)
return q;else if((h*3)<2)
return p+(q-p)*((2/3)-h)*6;else
return p;}
if(s<0)
s=0;if(l<=0.5)
var q=l*(1+s);else
var q=l+s-(l*s);var p=2*l-q;var tr=h+(1/3);var tg=h;var tb=h-(1/3);out_rgb[0]=hue2rgb(p,q,tr);out_rgb[1]=hue2rgb(p,q,tg);out_rgb[2]=hue2rgb(p,q,tb);out_rgb[3]=hsl[3];}
WebInspector.Color.hsva2rgba=function(hsva,out_rgba)
{WebInspector.Color._hsva2hsla(hsva,WebInspector.Color.hsva2rgba._tmpHSLA);WebInspector.Color.hsl2rgb(WebInspector.Color.hsva2rgba._tmpHSLA,out_rgba);for(var i=0;i<WebInspector.Color.hsva2rgba._tmpHSLA.length;i++)
WebInspector.Color.hsva2rgba._tmpHSLA[i]=0;};WebInspector.Color.hsva2rgba._tmpHSLA=[0,0,0,0];WebInspector.Color.luminance=function(rgba)
{var rSRGB=rgba[0];var gSRGB=rgba[1];var bSRGB=rgba[2];var r=rSRGB<=0.03928?rSRGB/12.92:Math.pow(((rSRGB+0.055)/1.055),2.4);var g=gSRGB<=0.03928?gSRGB/12.92:Math.pow(((gSRGB+0.055)/1.055),2.4);var b=bSRGB<=0.03928?bSRGB/12.92:Math.pow(((bSRGB+0.055)/1.055),2.4);return 0.2126*r+0.7152*g+0.0722*b;}
WebInspector.Color.blendColors=function(fgRGBA,bgRGBA,out_blended)
{var alpha=fgRGBA[3];out_blended[0]=((1-alpha)*bgRGBA[0])+(alpha*fgRGBA[0]);out_blended[1]=((1-alpha)*bgRGBA[1])+(alpha*fgRGBA[1]);out_blended[2]=((1-alpha)*bgRGBA[2])+(alpha*fgRGBA[2]);out_blended[3]=alpha+(bgRGBA[3]*(1-alpha));}
WebInspector.Color.calculateContrastRatio=function(fgRGBA,bgRGBA)
{WebInspector.Color.blendColors(fgRGBA,bgRGBA,WebInspector.Color.calculateContrastRatio._blendedFg);var fgLuminance=WebInspector.Color.luminance(WebInspector.Color.calculateContrastRatio._blendedFg);var bgLuminance=WebInspector.Color.luminance(bgRGBA);var contrastRatio=(Math.max(fgLuminance,bgLuminance)+0.05)/(Math.min(fgLuminance,bgLuminance)+0.05);for(var i=0;i<WebInspector.Color.calculateContrastRatio._blendedFg.length;i++)
WebInspector.Color.calculateContrastRatio._blendedFg[i]=0;return contrastRatio;}
WebInspector.Color.calculateContrastRatio._blendedFg=[0,0,0,0];WebInspector.Color.desiredLuminance=function(luminance,contrast,lighter)
{function computeLuminance()
{if(lighter)
return(luminance+0.05)*contrast-0.05;else
return(luminance+0.05)/contrast-0.05;}
var desiredLuminance=computeLuminance();if(desiredLuminance<0||desiredLuminance>1){lighter=!lighter;desiredLuminance=computeLuminance();}
return desiredLuminance;};WebInspector.Color.Nicknames={"aliceblue":[240,248,255],"antiquewhite":[250,235,215],"aqua":[0,255,255],"aquamarine":[127,255,212],"azure":[240,255,255],"beige":[245,245,220],"bisque":[255,228,196],"black":[0,0,0],"blanchedalmond":[255,235,205],"blue":[0,0,255],"blueviolet":[138,43,226],"brown":[165,42,42],"burlywood":[222,184,135],"cadetblue":[95,158,160],"chartreuse":[127,255,0],"chocolate":[210,105,30],"coral":[255,127,80],"cornflowerblue":[100,149,237],"cornsilk":[255,248,220],"crimson":[237,20,61],"cyan":[0,255,255],"darkblue":[0,0,139],"darkcyan":[0,139,139],"darkgoldenrod":[184,134,11],"darkgray":[169,169,169],"darkgrey":[169,169,169],"darkgreen":[0,100,0],"darkkhaki":[189,183,107],"darkmagenta":[139,0,139],"darkolivegreen":[85,107,47],"darkorange":[255,140,0],"darkorchid":[153,50,204],"darkred":[139,0,0],"darksalmon":[233,150,122],"darkseagreen":[143,188,143],"darkslateblue":[72,61,139],"darkslategray":[47,79,79],"darkslategrey":[47,79,79],"darkturquoise":[0,206,209],"darkviolet":[148,0,211],"deeppink":[255,20,147],"deepskyblue":[0,191,255],"dimgray":[105,105,105],"dimgrey":[105,105,105],"dodgerblue":[30,144,255],"firebrick":[178,34,34],"floralwhite":[255,250,240],"forestgreen":[34,139,34],"fuchsia":[255,0,255],"gainsboro":[220,220,220],"ghostwhite":[248,248,255],"gold":[255,215,0],"goldenrod":[218,165,32],"gray":[128,128,128],"grey":[128,128,128],"green":[0,128,0],"greenyellow":[173,255,47],"honeydew":[240,255,240],"hotpink":[255,105,180],"indianred":[205,92,92],"indigo":[75,0,130],"ivory":[255,255,240],"khaki":[240,230,140],"lavender":[230,230,250],"lavenderblush":[255,240,245],"lawngreen":[124,252,0],"lemonchiffon":[255,250,205],"lightblue":[173,216,230],"lightcoral":[240,128,128],"lightcyan":[224,255,255],"lightgoldenrodyellow":[250,250,210],"lightgreen":[144,238,144],"lightgray":[211,211,211],"lightgrey":[211,211,211],"lightpink":[255,182,193],"lightsalmon":[255,160,122],"lightseagreen":[32,178,170],"lightskyblue":[135,206,250],"lightslategray":[119,136,153],"lightslategrey":[119,136,153],"lightsteelblue":[176,196,222],"lightyellow":[255,255,224],"lime":[0,255,0],"limegreen":[50,205,50],"linen":[250,240,230],"magenta":[255,0,255],"maroon":[128,0,0],"mediumaquamarine":[102,205,170],"mediumblue":[0,0,205],"mediumorchid":[186,85,211],"mediumpurple":[147,112,219],"mediumseagreen":[60,179,113],"mediumslateblue":[123,104,238],"mediumspringgreen":[0,250,154],"mediumturquoise":[72,209,204],"mediumvioletred":[199,21,133],"midnightblue":[25,25,112],"mintcream":[245,255,250],"mistyrose":[255,228,225],"moccasin":[255,228,181],"navajowhite":[255,222,173],"navy":[0,0,128],"oldlace":[253,245,230],"olive":[128,128,0],"olivedrab":[107,142,35],"orange":[255,165,0],"orangered":[255,69,0],"orchid":[218,112,214],"palegoldenrod":[238,232,170],"palegreen":[152,251,152],"paleturquoise":[175,238,238],"palevioletred":[219,112,147],"papayawhip":[255,239,213],"peachpuff":[255,218,185],"peru":[205,133,63],"pink":[255,192,203],"plum":[221,160,221],"powderblue":[176,224,230],"purple":[128,0,128],"rebeccapurple":[102,51,153],"red":[255,0,0],"rosybrown":[188,143,143],"royalblue":[65,105,225],"saddlebrown":[139,69,19],"salmon":[250,128,114],"sandybrown":[244,164,96],"seagreen":[46,139,87],"seashell":[255,245,238],"sienna":[160,82,45],"silver":[192,192,192],"skyblue":[135,206,235],"slateblue":[106,90,205],"slategray":[112,128,144],"slategrey":[112,128,144],"snow":[255,250,250],"springgreen":[0,255,127],"steelblue":[70,130,180],"tan":[210,180,140],"teal":[0,128,128],"thistle":[216,191,216],"tomato":[255,99,71],"turquoise":[64,224,208],"violet":[238,130,238],"wheat":[245,222,179],"white":[255,255,255],"whitesmoke":[245,245,245],"yellow":[255,255,0],"yellowgreen":[154,205,50],"transparent":[0,0,0,0],};WebInspector.Color.PageHighlight={Content:WebInspector.Color.fromRGBA([111,168,220,.66]),ContentLight:WebInspector.Color.fromRGBA([111,168,220,.5]),ContentOutline:WebInspector.Color.fromRGBA([9,83,148]),Padding:WebInspector.Color.fromRGBA([147,196,125,.55]),PaddingLight:WebInspector.Color.fromRGBA([147,196,125,.4]),Border:WebInspector.Color.fromRGBA([255,229,153,.66]),BorderLight:WebInspector.Color.fromRGBA([255,229,153,.5]),Margin:WebInspector.Color.fromRGBA([246,178,107,.66]),MarginLight:WebInspector.Color.fromRGBA([246,178,107,.5]),EventTarget:WebInspector.Color.fromRGBA([255,196,196,.66]),Shape:WebInspector.Color.fromRGBA([96,82,177,0.8]),ShapeMargin:WebInspector.Color.fromRGBA([96,82,127,.6])}
WebInspector.Color.detectColorFormat=function(color)
{const cf=WebInspector.Color.Format;var format;var formatSetting=WebInspector.moduleSetting("colorFormat").get();if(formatSetting===cf.Original)
format=cf.Original;else if(formatSetting===cf.RGB)
format=(color.hasAlpha()?cf.RGBA:cf.RGB);else if(formatSetting===cf.HSL)
format=(color.hasAlpha()?cf.HSLA:cf.HSL);else if(!color.hasAlpha())
format=(color.canBeShortHex()?cf.ShortHEX:cf.HEX);else
format=cf.RGBA;return format;};WebInspector.Geometry={};WebInspector.Geometry._Eps=1e-5;WebInspector.Geometry.Vector=function(x,y,z)
{this.x=x;this.y=y;this.z=z;}
WebInspector.Geometry.Vector.prototype={length:function()
{return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z);},normalize:function()
{var length=this.length();if(length<=WebInspector.Geometry._Eps)
return;this.x/=length;this.y/=length;this.z/=length;}}
WebInspector.Geometry.Point=function(x,y){this.x=x;this.y=y;}
WebInspector.Geometry.Point.prototype={distanceTo:function(p)
{return Math.sqrt(Math.pow(p.x-this.x,2)+Math.pow(p.y-this.y,2));},toString:function()
{return Math.round(this.x*100)/100+", "+Math.round(this.y*100)/100;}}
WebInspector.Geometry.CubicBezier=function(point1,point2)
{this.controlPoints=[point1,point2];}
WebInspector.Geometry.CubicBezier.KeywordValues={"linear":"cubic-bezier(0, 0, 1, 1)","ease":"cubic-bezier(0.25, 0.1, 0.25, 1)","ease-in":"cubic-bezier(0.42, 0, 1, 1)","ease-in-out":"cubic-bezier(0.42, 0, 0.58, 1)","ease-out":"cubic-bezier(0, 0, 0.58, 1)"}
WebInspector.Geometry.CubicBezier.parse=function(text)
{var keywordValues=WebInspector.Geometry.CubicBezier.KeywordValues;var value=text.toLowerCase().replace(/\s+/g,"");if(Object.keys(keywordValues).indexOf(value)!=-1)
return WebInspector.Geometry.CubicBezier.parse(keywordValues[value]);var bezierRegex=/^cubic-bezier\(([^,]+),([^,]+),([^,]+),([^,]+)\)$/;var match=value.match(bezierRegex);if(match){var control1=new WebInspector.Geometry.Point(parseFloat(match[1]),parseFloat(match[2]));var control2=new WebInspector.Geometry.Point(parseFloat(match[3]),parseFloat(match[4]));return new WebInspector.Geometry.CubicBezier(control1,control2);}
return null;}
WebInspector.Geometry.CubicBezier.prototype={evaluateAt:function(t)
{function evaluate(v1,v2,t)
{return 3*(1-t)*(1-t)*t*v1+3*(1-t)*t*t*v2+Math.pow(t,3);}
var x=evaluate(this.controlPoints[0].x,this.controlPoints[1].x,t);var y=evaluate(this.controlPoints[0].y,this.controlPoints[1].y,t);return new WebInspector.Geometry.Point(x,y);},asCSSText:function()
{var raw="cubic-bezier("+this.controlPoints.join(", ")+")";var keywordValues=WebInspector.Geometry.CubicBezier.KeywordValues;for(var keyword in keywordValues){if(raw===keywordValues[keyword])
return keyword;}
return raw;}}
WebInspector.Geometry.EulerAngles=function(alpha,beta,gamma)
{this.alpha=alpha;this.beta=beta;this.gamma=gamma;}
WebInspector.Geometry.EulerAngles.fromRotationMatrix=function(rotationMatrix)
{var beta=Math.atan2(rotationMatrix.m23,rotationMatrix.m33);var gamma=Math.atan2(-rotationMatrix.m13,Math.sqrt(rotationMatrix.m11*rotationMatrix.m11+rotationMatrix.m12*rotationMatrix.m12));var alpha=Math.atan2(rotationMatrix.m12,rotationMatrix.m11);return new WebInspector.Geometry.EulerAngles(WebInspector.Geometry.radToDeg(alpha),WebInspector.Geometry.radToDeg(beta),WebInspector.Geometry.radToDeg(gamma));}
WebInspector.Geometry.scalarProduct=function(u,v)
{return u.x*v.x+u.y*v.y+u.z*v.z;}
WebInspector.Geometry.crossProduct=function(u,v)
{var x=u.y*v.z-u.z*v.y;var y=u.z*v.x-u.x*v.z;var z=u.x*v.y-u.y*v.x;return new WebInspector.Geometry.Vector(x,y,z);}
WebInspector.Geometry.subtract=function(u,v)
{var x=u.x-v.x;var y=u.y-v.y;var z=u.z-v.z;return new WebInspector.Geometry.Vector(x,y,z);}
WebInspector.Geometry.multiplyVectorByMatrixAndNormalize=function(v,m)
{var t=v.x*m.m14+v.y*m.m24+v.z*m.m34+m.m44;var x=(v.x*m.m11+v.y*m.m21+v.z*m.m31+m.m41)/t;var y=(v.x*m.m12+v.y*m.m22+v.z*m.m32+m.m42)/t;var z=(v.x*m.m13+v.y*m.m23+v.z*m.m33+m.m43)/t;return new WebInspector.Geometry.Vector(x,y,z);}
WebInspector.Geometry.calculateAngle=function(u,v)
{var uLength=u.length();var vLength=v.length();if(uLength<=WebInspector.Geometry._Eps||vLength<=WebInspector.Geometry._Eps)
return 0;var cos=WebInspector.Geometry.scalarProduct(u,v)/uLength/vLength;if(Math.abs(cos)>1)
return 0;return WebInspector.Geometry.radToDeg(Math.acos(cos));}
WebInspector.Geometry.radToDeg=function(rad)
{return rad*180/Math.PI;}
WebInspector.Geometry.boundsForTransformedPoints=function(matrix,points,aggregateBounds)
{if(!aggregateBounds)
aggregateBounds={minX:Infinity,maxX:-Infinity,minY:Infinity,maxY:-Infinity};if(points.length%3)
console.assert("Invalid size of points array");for(var p=0;p<points.length;p+=3){var vector=new WebInspector.Geometry.Vector(points[p],points[p+1],points[p+2]);vector=WebInspector.Geometry.multiplyVectorByMatrixAndNormalize(vector,matrix);aggregateBounds.minX=Math.min(aggregateBounds.minX,vector.x);aggregateBounds.maxX=Math.max(aggregateBounds.maxX,vector.x);aggregateBounds.minY=Math.min(aggregateBounds.minY,vector.y);aggregateBounds.maxY=Math.max(aggregateBounds.maxY,vector.y);}
return aggregateBounds;}
function Size(width,height)
{this.width=width;this.height=height;}
Size.prototype.isEqual=function(size)
{return!!size&&this.width===size.width&&this.height===size.height;};Size.prototype.widthToMax=function(size)
{return new Size(Math.max(this.width,(typeof size==="number"?size:size.width)),this.height);};Size.prototype.addWidth=function(size)
{return new Size(this.width+(typeof size==="number"?size:size.width),this.height);};Size.prototype.heightToMax=function(size)
{return new Size(this.width,Math.max(this.height,(typeof size==="number"?size:size.height)));};Size.prototype.addHeight=function(size)
{return new Size(this.width,this.height+(typeof size==="number"?size:size.height));};function Insets(left,top,right,bottom)
{this.left=left;this.top=top;this.right=right;this.bottom=bottom;}
Insets.prototype={isEqual:function(insets)
{return!!insets&&this.left===insets.left&&this.top===insets.top&&this.right==insets.right&&this.bottom==insets.bottom;}}
WebInspector.Rect=function(left,top,width,height)
{this.left=left;this.top=top;this.width=width;this.height=height;}
WebInspector.Rect.prototype={isEqual:function(rect)
{return!!rect&&this.left===rect.left&&this.top===rect.top&&this.width==rect.width&&this.height==rect.height;},scale:function(scale)
{return new WebInspector.Rect(this.left*scale,this.top*scale,this.width*scale,this.height*scale);},size:function()
{return new Size(this.width,this.height);}}
function Constraints(minimum,preferred)
{this.minimum=minimum||new Size(0,0);this.preferred=preferred||this.minimum;if(this.minimum.width>this.preferred.width||this.minimum.height>this.preferred.height)
throw new Error("Minimum size is greater than preferred.");}
Constraints.prototype.isEqual=function(constraints)
{return!!constraints&&this.minimum.isEqual(constraints.minimum)&&this.preferred.isEqual(constraints.preferred);}
Constraints.prototype.widthToMax=function(value)
{if(typeof value==="number")
return new Constraints(this.minimum.widthToMax(value),this.preferred.widthToMax(value));return new Constraints(this.minimum.widthToMax(value.minimum),this.preferred.widthToMax(value.preferred));}
Constraints.prototype.addWidth=function(value)
{if(typeof value==="number")
return new Constraints(this.minimum.addWidth(value),this.preferred.addWidth(value));return new Constraints(this.minimum.addWidth(value.minimum),this.preferred.addWidth(value.preferred));}
Constraints.prototype.heightToMax=function(value)
{if(typeof value==="number")
return new Constraints(this.minimum.heightToMax(value),this.preferred.heightToMax(value));return new Constraints(this.minimum.heightToMax(value.minimum),this.preferred.heightToMax(value.preferred));}
Constraints.prototype.addHeight=function(value)
{if(typeof value==="number")
return new Constraints(this.minimum.addHeight(value),this.preferred.addHeight(value));return new Constraints(this.minimum.addHeight(value.minimum),this.preferred.addHeight(value.preferred));};WebInspector.Console=function()
{this._messages=[];}
WebInspector.Console.Events={MessageAdded:"messageAdded"}
WebInspector.Console.MessageLevel={Log:"log",Warning:"warning",Error:"error"}
WebInspector.Console.Message=function(text,level,timestamp,show)
{this.text=text;this.level=level;this.timestamp=(typeof timestamp==="number")?timestamp:Date.now();this.show=show;}
WebInspector.Console.UIDelegate=function()
{}
WebInspector.Console.UIDelegate.prototype={showConsole:function(){}}
WebInspector.Console.prototype={setUIDelegate:function(uiDelegate)
{this._uiDelegate=uiDelegate;},addMessage:function(text,level,show)
{var message=new WebInspector.Console.Message(text,level||WebInspector.Console.MessageLevel.Log,Date.now(),show||false);this._messages.push(message);this.dispatchEventToListeners(WebInspector.Console.Events.MessageAdded,message);},log:function(text)
{this.addMessage(text,WebInspector.Console.MessageLevel.Log);},warn:function(text)
{this.addMessage(text,WebInspector.Console.MessageLevel.Warning);},error:function(text)
{this.addMessage(text,WebInspector.Console.MessageLevel.Error,true);},messages:function()
{return this._messages;},show:function()
{this.showPromise();},showPromise:function()
{if(this._uiDelegate)
return this._uiDelegate.showConsole();return Promise.reject();},__proto__:WebInspector.Object.prototype}
WebInspector.console=new WebInspector.Console();;WebInspector.ContentProvider=function(){}
WebInspector.ContentProvider.prototype={contentURL:function(){},contentType:function(){},requestContent:function(callback){},searchInContent:function(query,caseSensitive,isRegex,callback){}}
WebInspector.ContentProvider.SearchMatch=function(lineNumber,lineContent){this.lineNumber=lineNumber;this.lineContent=lineContent;}
WebInspector.ContentProvider.performSearchInContent=function(content,query,caseSensitive,isRegex)
{var regex=createSearchRegex(query,caseSensitive,isRegex);var contentString=new String(content);var result=[];for(var i=0;i<contentString.lineCount();++i){var lineContent=contentString.lineAt(i);regex.lastIndex=0;if(regex.exec(lineContent))
result.push(new WebInspector.ContentProvider.SearchMatch(i,lineContent));}
return result;};WebInspector.ParsedURL=function(url)
{this.isValid=false;this.url=url;this.scheme="";this.host="";this.port="";this.path="";this.queryParams="";this.fragment="";this.folderPathComponents="";this.lastPathComponent="";var match=url.match(/^([A-Za-z][A-Za-z0-9+.-]*):\/\/([^\s\/:]*)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i);if(match){this.isValid=true;this.scheme=match[1].toLowerCase();this.host=match[2];this.port=match[3];this.path=match[4]||"/";this.fragment=match[5];}else{if(this.url.startsWith("data:")){this.scheme="data";return;}
if(this.url==="about:blank"){this.scheme="about";return;}
this.path=this.url;}
var path=this.path;var indexOfQuery=path.indexOf("?");if(indexOfQuery!==-1){this.queryParams=path.substring(indexOfQuery+1);path=path.substring(0,indexOfQuery);}
var lastSlashIndex=path.lastIndexOf("/");if(lastSlashIndex!==-1){this.folderPathComponents=path.substring(0,lastSlashIndex);this.lastPathComponent=path.substring(lastSlashIndex+1);}else
this.lastPathComponent=path;}
WebInspector.ParsedURL.splitURLIntoPathComponents=function(url)
{var parsedURL=new WebInspector.ParsedURL(url);var origin;var folderPath;var name;if(parsedURL.isValid){origin=parsedURL.scheme+"://"+parsedURL.host;if(parsedURL.port)
origin+=":"+parsedURL.port;folderPath=parsedURL.folderPathComponents;name=parsedURL.lastPathComponent;if(parsedURL.queryParams)
name+="?"+parsedURL.queryParams;}else{origin="";folderPath="";name=url;}
var result=[origin];var splittedPath=folderPath.split("/");for(var i=1;i<splittedPath.length;++i){if(!splittedPath[i])
continue;result.push(splittedPath[i]);}
result.push(name);return result;}
WebInspector.ParsedURL.extractOrigin=function(url)
{var parsedURL=new WebInspector.ParsedURL(url);if(!parsedURL.isValid)
return"";var origin=parsedURL.scheme+"://"+parsedURL.host;if(parsedURL.port)
origin+=":"+parsedURL.port;return origin;}
WebInspector.ParsedURL.completeURL=function(baseURL,href)
{if(href){var trimmedHref=href.trim();if(trimmedHref.startsWith("data:")||trimmedHref.startsWith("blob:")||trimmedHref.startsWith("javascript:"))
return href;var parsedHref=trimmedHref.asParsedURL();if(parsedHref&&parsedHref.scheme)
return trimmedHref;}else{return baseURL;}
var parsedURL=baseURL.asParsedURL();if(parsedURL){if(parsedURL.isDataURL())
return href;var path=href;var query=path.indexOf("?");var postfix="";if(query!==-1){postfix=path.substring(query);path=path.substring(0,query);}else{var fragment=path.indexOf("#");if(fragment!==-1){postfix=path.substring(fragment);path=path.substring(0,fragment);}}
if(!path){var basePath=parsedURL.path;if(postfix.charAt(0)==="?"){var baseQuery=parsedURL.path.indexOf("?");if(baseQuery!==-1)
basePath=basePath.substring(0,baseQuery);}
return parsedURL.scheme+"://"+parsedURL.host+(parsedURL.port?(":"+parsedURL.port):"")+basePath+postfix;}else if(path.charAt(0)!=="/"){var prefix=parsedURL.path;var prefixQuery=prefix.indexOf("?");if(prefixQuery!==-1)
prefix=prefix.substring(0,prefixQuery);prefix=prefix.substring(0,prefix.lastIndexOf("/"))+"/";path=prefix+path;}else if(path.length>1&&path.charAt(1)==="/"){return parsedURL.scheme+":"+path+postfix;}
return parsedURL.scheme+"://"+parsedURL.host+(parsedURL.port?(":"+parsedURL.port):"")+normalizePath(path)+postfix;}
return null;}
WebInspector.ParsedURL.prototype={get displayName()
{if(this._displayName)
return this._displayName;if(this.isDataURL())
return this.dataURLDisplayName();if(this.isAboutBlank())
return this.url;this._displayName=this.lastPathComponent;if(!this._displayName)
this._displayName=(this.host||"")+"/";if(this._displayName==="/")
this._displayName=this.url;return this._displayName;},dataURLDisplayName:function()
{if(this._dataURLDisplayName)
return this._dataURLDisplayName;if(!this.isDataURL())
return"";this._dataURLDisplayName=this.url.trimEnd(20);return this._dataURLDisplayName;},isAboutBlank:function()
{return this.url==="about:blank";},isDataURL:function()
{return this.scheme==="data";},lastPathComponentWithFragment:function()
{return this.lastPathComponent+(this.fragment?"#"+this.fragment:"");},domain:function()
{return this.host+(this.port?":"+this.port:"");},urlWithoutScheme:function()
{if(this.scheme&&this.url.startsWith(this.scheme+"://"))
return this.url.substring(this.scheme.length+3);return this.url;},}
WebInspector.ParsedURL.splitLineAndColumn=function(string)
{var lineColumnRegEx=/(?::(\d+))?(?::(\d+))?$/;var lineColumnMatch=lineColumnRegEx.exec(string);var lineNumber;var columnNumber;console.assert(lineColumnMatch);if(typeof(lineColumnMatch[1])==="string"){lineNumber=parseInt(lineColumnMatch[1],10);lineNumber=isNaN(lineNumber)?undefined:lineNumber-1;}
if(typeof(lineColumnMatch[2])==="string"){columnNumber=parseInt(lineColumnMatch[2],10);columnNumber=isNaN(columnNumber)?undefined:columnNumber-1;}
return{url:string.substring(0,string.length-lineColumnMatch[0].length),lineNumber:lineNumber,columnNumber:columnNumber};}
String.prototype.asParsedURL=function()
{var parsedURL=new WebInspector.ParsedURL(this.toString());if(parsedURL.isValid)
return parsedURL;return null;};WebInspector.Progress=function()
{}
WebInspector.Progress.prototype={setTotalWork:function(totalWork){},setTitle:function(title){},setWorked:function(worked,title){},worked:function(worked){},done:function(){},isCanceled:function(){return false;},}
WebInspector.CompositeProgress=function(parent)
{this._parent=parent;this._children=[];this._childrenDone=0;this._parent.setTotalWork(1);this._parent.setWorked(0);}
WebInspector.CompositeProgress.prototype={_childDone:function()
{if(++this._childrenDone!==this._children.length)
return;this._parent.done();},createSubProgress:function(weight)
{var child=new WebInspector.SubProgress(this,weight);this._children.push(child);return child;},_update:function()
{var totalWeights=0;var done=0;for(var i=0;i<this._children.length;++i){var child=this._children[i];if(child._totalWork)
done+=child._weight*child._worked/child._totalWork;totalWeights+=child._weight;}
this._parent.setWorked(done/totalWeights);}}
WebInspector.SubProgress=function(composite,weight)
{this._composite=composite;this._weight=weight||1;this._worked=0;}
WebInspector.SubProgress.prototype={isCanceled:function()
{return this._composite._parent.isCanceled();},setTitle:function(title)
{this._composite._parent.setTitle(title);},done:function()
{this.setWorked(this._totalWork);this._composite._childDone();},setTotalWork:function(totalWork)
{this._totalWork=totalWork;this._composite._update();},setWorked:function(worked,title)
{this._worked=worked;if(typeof title!=="undefined")
this.setTitle(title);this._composite._update();},worked:function(worked)
{this.setWorked(this._worked+(worked||1));}}
WebInspector.ProgressProxy=function(delegate,doneCallback)
{this._delegate=delegate;this._doneCallback=doneCallback;}
WebInspector.ProgressProxy.prototype={isCanceled:function()
{return this._delegate?this._delegate.isCanceled():false;},setTitle:function(title)
{if(this._delegate)
this._delegate.setTitle(title);},done:function()
{if(this._delegate)
this._delegate.done();if(this._doneCallback)
this._doneCallback();},setTotalWork:function(totalWork)
{if(this._delegate)
this._delegate.setTotalWork(totalWork);},setWorked:function(worked,title)
{if(this._delegate)
this._delegate.setWorked(worked,title);},worked:function(worked)
{if(this._delegate)
this._delegate.worked(worked);}};WebInspector.ResourceType=function(name,title,category,isTextType)
{this._name=name;this._title=title;this._category=category;this._isTextType=isTextType;}
WebInspector.ResourceType.prototype={name:function()
{return this._name;},title:function()
{return this._title;},category:function()
{return this._category;},isTextType:function()
{return this._isTextType;},isScript:function()
{return this._name==="script"||this._name==="sm-script";},hasScripts:function()
{return this.isScript()||this.isDocument();},isStyleSheet:function()
{return this._name==="stylesheet"||this._name==="sm-stylesheet";},isDocument:function()
{return this._name==="document";},isDocumentOrScriptOrStyleSheet:function()
{return this.isDocument()||this.isScript()||this.isStyleSheet();},isFromSourceMap:function()
{return this._name.startsWith("sm-");},toString:function()
{return this._name;},canonicalMimeType:function()
{if(this.isDocument())
return"text/html";if(this.isScript())
return"text/javascript";if(this.isStyleSheet())
return"text/css";return"";}}
WebInspector.ResourceCategory=function(title,shortTitle)
{this.title=title;this.shortTitle=shortTitle;}
WebInspector.resourceCategories={XHR:new WebInspector.ResourceCategory("XHR and Fetch","XHR"),Script:new WebInspector.ResourceCategory("Scripts","JS"),Stylesheet:new WebInspector.ResourceCategory("Stylesheets","CSS"),Image:new WebInspector.ResourceCategory("Images","Img"),Media:new WebInspector.ResourceCategory("Media","Media"),Font:new WebInspector.ResourceCategory("Fonts","Font"),Document:new WebInspector.ResourceCategory("Documents","Doc"),WebSocket:new WebInspector.ResourceCategory("WebSockets","WS"),Manifest:new WebInspector.ResourceCategory("Manifest","Manifest"),Other:new WebInspector.ResourceCategory("Other","Other")}
WebInspector.resourceTypes={XHR:new WebInspector.ResourceType("xhr","XHR",WebInspector.resourceCategories.XHR,true),Fetch:new WebInspector.ResourceType("fetch","Fetch",WebInspector.resourceCategories.XHR,true),EventSource:new WebInspector.ResourceType("eventsource","EventSource",WebInspector.resourceCategories.XHR,true),Script:new WebInspector.ResourceType("script","Script",WebInspector.resourceCategories.Script,true),Stylesheet:new WebInspector.ResourceType("stylesheet","Stylesheet",WebInspector.resourceCategories.Stylesheet,true),Image:new WebInspector.ResourceType("image","Image",WebInspector.resourceCategories.Image,false),Media:new WebInspector.ResourceType("media","Media",WebInspector.resourceCategories.Media,false),Font:new WebInspector.ResourceType("font","Font",WebInspector.resourceCategories.Font,false),Document:new WebInspector.ResourceType("document","Document",WebInspector.resourceCategories.Document,true),TextTrack:new WebInspector.ResourceType("texttrack","TextTrack",WebInspector.resourceCategories.Other,true),WebSocket:new WebInspector.ResourceType("websocket","WebSocket",WebInspector.resourceCategories.WebSocket,false),Other:new WebInspector.ResourceType("other","Other",WebInspector.resourceCategories.Other,false),SourceMapScript:new WebInspector.ResourceType("sm-script","Script",WebInspector.resourceCategories.Script,false),SourceMapStyleSheet:new WebInspector.ResourceType("sm-stylesheet","Stylesheet",WebInspector.resourceCategories.Stylesheet,false),Manifest:new WebInspector.ResourceType("manifest","Manifest",WebInspector.resourceCategories.Manifest,false),}
WebInspector.ResourceType.mimeFromURL=function(url)
{var name=WebInspector.TextUtils.fileName(url);if(WebInspector.ResourceType.mimeTypeByName[name]){return WebInspector.ResourceType.mimeTypeByName[name];}
var ext=WebInspector.TextUtils.extension(url).toLowerCase();return WebInspector.ResourceType.mimeTypeByExtension[ext];}
WebInspector.ResourceType.mimeTypeByName={"Cakefile":"text/x-coffeescript"}
WebInspector.ResourceType.mimeTypeByExtension={"js":"text/javascript","css":"text/css","html":"text/html","htm":"text/html","xml":"application/xml","xsl":"application/xml","asp":"application/x-aspx","aspx":"application/x-aspx","jsp":"application/x-jsp","c":"text/x-c++src","cc":"text/x-c++src","cpp":"text/x-c++src","h":"text/x-c++src","m":"text/x-c++src","mm":"text/x-c++src","coffee":"text/x-coffeescript","dart":"text/javascript","ts":"text/typescript","json":"application/json","gyp":"application/json","gypi":"application/json","cs":"text/x-csharp","java":"text/x-java","less":"text/x-less","php":"text/x-php","phtml":"application/x-httpd-php","py":"text/x-python","sh":"text/x-sh","scss":"text/x-scss","vtt":"text/vtt","ls":"text/x-livescript","cljs":"text/x-clojure","cljc":"text/x-clojure","cljx":"text/x-clojure","styl":"text/x-styl","jpeg":"image/jpeg","jpg":"image/jpeg","svg":"image/svg","gif":"image/gif","webp":"image/webp","png":"image/png","ico":"image/ico","tiff":"image/tiff","tif":"image/tif","bmp":"image/bmp","ttf":"font/opentype","otf":"font/opentype","ttc":"font/opentype","woff":"application/font-woff"};WebInspector.Settings=function(storage)
{this._settingsStorage=storage;var clearLocalStorage=window.localStorage?window.localStorage.clear.bind(window.localStorage):undefined;this._localStorage=new WebInspector.SettingsStorage(window.localStorage||{},undefined,undefined,clearLocalStorage);this._eventSupport=new WebInspector.Object();this._registry=new Map();this._moduleSettings=new Map();self.runtime.extensions("setting").forEach(this._registerModuleSetting.bind(this));}
WebInspector.Settings.prototype={_registerModuleSetting:function(extension)
{var descriptor=extension.descriptor();var settingName=descriptor["settingName"];var settingType=descriptor["settingType"];var defaultValue=descriptor["defaultValue"];var isLocal=!!descriptor["local"];var setting=settingType==="regex"?this.createRegExpSetting(settingName,defaultValue,undefined,isLocal):this.createSetting(settingName,defaultValue,isLocal);this._moduleSettings.set(settingName,setting);},moduleSetting:function(settingName)
{var setting=this._moduleSettings.get(settingName);if(!setting)
throw new Error("No setting registered: "+settingName);return setting;},settingForTest:function(settingName)
{var setting=this._registry.get(settingName);if(!setting)
throw new Error("No setting registered: "+settingName);return setting;},createSetting:function(key,defaultValue,isLocal)
{if(!this._registry.get(key))
this._registry.set(key,new WebInspector.Setting(this,key,defaultValue,this._eventSupport,isLocal?this._localStorage:this._settingsStorage));return(this._registry.get(key));},createLocalSetting:function(key,defaultValue)
{return this.createSetting(key,defaultValue,true);},createRegExpSetting:function(key,defaultValue,regexFlags,isLocal)
{if(!this._registry.get(key))
this._registry.set(key,new WebInspector.RegExpSetting(this,key,defaultValue,this._eventSupport,isLocal?this._localStorage:this._settingsStorage,regexFlags));return(this._registry.get(key));},clearAll:function()
{this._settingsStorage.removeAll();this._localStorage.removeAll();var versionSetting=WebInspector.settings.createSetting(WebInspector.VersionController._currentVersionName,0);versionSetting.set(WebInspector.VersionController.currentVersion);}}
WebInspector.SettingsStorage=function(object,setCallback,removeCallback,removeAllCallback)
{this._object=object;this._setCallback=setCallback||function(){};this._removeCallback=removeCallback||function(){};this._removeAllCallback=removeAllCallback||function(){};}
WebInspector.SettingsStorage.prototype={set:function(name,value)
{this._object[name]=value;this._setCallback(name,value);},has:function(name)
{return name in this._object;},get:function(name)
{return this._object[name];},remove:function(name)
{delete this._object[name];this._removeCallback(name);},removeAll:function()
{this._object={};this._removeAllCallback();},_dumpSizes:function()
{WebInspector.console.log("Ten largest settings: ");var sizes={__proto__:null};for(var key in this._object)
sizes[key]=this._object[key].length;var keys=Object.keys(sizes);function comparator(key1,key2)
{return sizes[key2]-sizes[key1];}
keys.sort(comparator);for(var i=0;i<10&&i<keys.length;++i)
WebInspector.console.log("Setting: '"+keys[i]+"', size: "+sizes[keys[i]]);}}
WebInspector.Setting=function(settings,name,defaultValue,eventSupport,storage)
{this._settings=settings;this._name=name;this._defaultValue=defaultValue;this._eventSupport=eventSupport;this._storage=storage;}
WebInspector.Setting.prototype={addChangeListener:function(listener,thisObject)
{this._eventSupport.addEventListener(this._name,listener,thisObject);},removeChangeListener:function(listener,thisObject)
{this._eventSupport.removeEventListener(this._name,listener,thisObject);},get name()
{return this._name;},get:function()
{if(typeof this._value!=="undefined")
return this._value;this._value=this._defaultValue;if(this._storage.has(this._name)){try{this._value=JSON.parse(this._storage.get(this._name));}catch(e){this.remove();}}
return this._value;},set:function(value)
{this._value=value;try{var settingString=JSON.stringify(value);try{this._storage.set(this._name,settingString);}catch(e){this._printSettingsSavingError(e.message,this._name,settingString);}}catch(e){WebInspector.console.error("Cannot stringify setting with name: "+this._name+", error: "+e.message);}
this._eventSupport.dispatchEventToListeners(this._name,value);},remove:function()
{this._settings._registry.delete(this._name);this._settings._moduleSettings.delete(this._name);this._storage.remove(this._name);},_printSettingsSavingError:function(message,name,value)
{var errorMessage="Error saving setting with name: "+this._name+", value length: "+value.length+". Error: "+message;console.error(errorMessage);WebInspector.console.error(errorMessage);this._storage._dumpSizes();}}
WebInspector.RegExpSetting=function(settings,name,defaultValue,eventSupport,storage,regexFlags)
{WebInspector.Setting.call(this,settings,name,defaultValue?[{pattern:defaultValue}]:[],eventSupport,storage);this._regexFlags=regexFlags;}
WebInspector.RegExpSetting.prototype={get:function()
{var result=[];var items=this.getAsArray();for(var i=0;i<items.length;++i){var item=items[i];if(item.pattern&&!item.disabled)
result.push(item.pattern);}
return result.join("|");},getAsArray:function()
{return WebInspector.Setting.prototype.get.call(this);},set:function(value)
{this.setAsArray([{pattern:value}]);},setAsArray:function(value)
{delete this._regex;WebInspector.Setting.prototype.set.call(this,value);},asRegExp:function()
{if(typeof this._regex!=="undefined")
return this._regex;this._regex=null;try{var pattern=this.get();if(pattern)
this._regex=new RegExp(pattern,this._regexFlags||"");}catch(e){}
return this._regex;},__proto__:WebInspector.Setting.prototype}
WebInspector.VersionController=function()
{}
WebInspector.VersionController._currentVersionName="inspectorVersion";WebInspector.VersionController.currentVersion=18;WebInspector.VersionController.prototype={updateVersion:function()
{var localStorageVersion=window.localStorage?window.localStorage[WebInspector.VersionController._currentVersionName]:0;var versionSetting=WebInspector.settings.createSetting(WebInspector.VersionController._currentVersionName,0);var currentVersion=WebInspector.VersionController.currentVersion;var oldVersion=parseInt(localStorageVersion||"0",10)||versionSetting.get();if(oldVersion===0){versionSetting.set(currentVersion);return;}
var methodsToRun=this._methodsToRunToUpdateVersion(oldVersion,currentVersion);for(var i=0;i<methodsToRun.length;++i)
this[methodsToRun[i]].call(this);versionSetting.set(currentVersion);},_methodsToRunToUpdateVersion:function(oldVersion,currentVersion)
{var result=[];for(var i=oldVersion;i<currentVersion;++i)
result.push("_updateVersionFrom"+i+"To"+(i+1));return result;},_updateVersionFrom0To1:function()
{this._clearBreakpointsWhenTooMany(WebInspector.settings.createLocalSetting("breakpoints",[]),500000);},_updateVersionFrom1To2:function()
{WebInspector.settings.createSetting("previouslyViewedFiles",[]).set([]);},_updateVersionFrom2To3:function()
{WebInspector.settings.createSetting("fileSystemMapping",{}).set({});WebInspector.settings.createSetting("fileMappingEntries",[]).remove();},_updateVersionFrom3To4:function()
{var advancedMode=WebInspector.settings.createSetting("showHeaSnapshotObjectsHiddenProperties",false);WebInspector.moduleSetting("showAdvancedHeapSnapshotProperties").set(advancedMode.get());advancedMode.remove();},_updateVersionFrom4To5:function()
{var settingNames={"FileSystemViewSidebarWidth":"fileSystemViewSplitViewState","elementsSidebarWidth":"elementsPanelSplitViewState","StylesPaneSplitRatio":"stylesPaneSplitViewState","heapSnapshotRetainersViewSize":"heapSnapshotSplitViewState","InspectorView.splitView":"InspectorView.splitViewState","InspectorView.screencastSplitView":"InspectorView.screencastSplitViewState","Inspector.drawerSplitView":"Inspector.drawerSplitViewState","layerDetailsSplitView":"layerDetailsSplitViewState","networkSidebarWidth":"networkPanelSplitViewState","sourcesSidebarWidth":"sourcesPanelSplitViewState","scriptsPanelNavigatorSidebarWidth":"sourcesPanelNavigatorSplitViewState","sourcesPanelSplitSidebarRatio":"sourcesPanelDebuggerSidebarSplitViewState","timeline-details":"timelinePanelDetailsSplitViewState","timeline-split":"timelinePanelRecorsSplitViewState","timeline-view":"timelinePanelTimelineStackSplitViewState","auditsSidebarWidth":"auditsPanelSplitViewState","layersSidebarWidth":"layersPanelSplitViewState","profilesSidebarWidth":"profilesPanelSplitViewState","resourcesSidebarWidth":"resourcesPanelSplitViewState"};var empty={};for(var oldName in settingNames){var newName=settingNames[oldName];var oldNameH=oldName+"H";var newValue=null;var oldSetting=WebInspector.settings.createSetting(oldName,empty);if(oldSetting.get()!==empty){newValue=newValue||{};newValue.vertical={};newValue.vertical.size=oldSetting.get();oldSetting.remove();}
var oldSettingH=WebInspector.settings.createSetting(oldNameH,empty);if(oldSettingH.get()!==empty){newValue=newValue||{};newValue.horizontal={};newValue.horizontal.size=oldSettingH.get();oldSettingH.remove();}
if(newValue)
WebInspector.settings.createSetting(newName,{}).set(newValue);}},_updateVersionFrom5To6:function()
{var settingNames={"debuggerSidebarHidden":"sourcesPanelSplitViewState","navigatorHidden":"sourcesPanelNavigatorSplitViewState","WebInspector.Drawer.showOnLoad":"Inspector.drawerSplitViewState"};for(var oldName in settingNames){var oldSetting=WebInspector.settings.createSetting(oldName,null);if(oldSetting.get()===null){oldSetting.remove();continue;}
var newName=settingNames[oldName];var invert="WebInspector.Drawer.showOnLoad"===oldName;var hidden=oldSetting.get()!==invert;oldSetting.remove();var showMode=hidden?"OnlyMain":"Both";var newSetting=WebInspector.settings.createSetting(newName,{});var newValue=newSetting.get()||{};newValue.vertical=newValue.vertical||{};newValue.vertical.showMode=showMode;newValue.horizontal=newValue.horizontal||{};newValue.horizontal.showMode=showMode;newSetting.set(newValue);}},_updateVersionFrom6To7:function()
{var settingNames={"sourcesPanelNavigatorSplitViewState":"sourcesPanelNavigatorSplitViewState","elementsPanelSplitViewState":"elementsPanelSplitViewState","stylesPaneSplitViewState":"stylesPaneSplitViewState","sourcesPanelDebuggerSidebarSplitViewState":"sourcesPanelDebuggerSidebarSplitViewState"};var empty={};for(var name in settingNames){var setting=WebInspector.settings.createSetting(name,empty);var value=setting.get();if(value===empty)
continue;if(value.vertical&&value.vertical.size&&value.vertical.size<1)
value.vertical.size=0;if(value.horizontal&&value.horizontal.size&&value.horizontal.size<1)
value.horizontal.size=0;setting.set(value);}},_updateVersionFrom7To8:function()
{},_updateVersionFrom8To9:function()
{var settingNames=["skipStackFramesPattern","workspaceFolderExcludePattern"];for(var i=0;i<settingNames.length;++i){var setting=WebInspector.settings.createSetting(settingNames[i],"");var value=setting.get();if(!value)
return;if(typeof value==="string")
value=[value];for(var j=0;j<value.length;++j){if(typeof value[j]==="string")
value[j]={pattern:value[j]};}
setting.set(value);}},_updateVersionFrom9To10:function()
{if(!window.localStorage)
return;for(var key in window.localStorage){if(key.startsWith("revision-history"))
window.localStorage.removeItem(key);}},_updateVersionFrom10To11:function()
{var oldSettingName="customDevicePresets";var newSettingName="customEmulatedDeviceList";var oldSetting=WebInspector.settings.createSetting(oldSettingName,undefined);var list=oldSetting.get();if(!Array.isArray(list))
return;var newList=[];for(var i=0;i<list.length;++i){var value=list[i];var device={};device["title"]=value["title"];device["type"]="unknown";device["user-agent"]=value["userAgent"];device["capabilities"]=[];if(value["touch"])
device["capabilities"].push("touch");if(value["mobile"])
device["capabilities"].push("mobile");device["screen"]={};device["screen"]["vertical"]={width:value["width"],height:value["height"]};device["screen"]["horizontal"]={width:value["height"],height:value["width"]};device["screen"]["device-pixel-ratio"]=value["deviceScaleFactor"];device["modes"]=[];device["show-by-default"]=true;device["show"]="Default";newList.push(device);}
if(newList.length)
WebInspector.settings.createSetting(newSettingName,[]).set(newList);oldSetting.remove();},_updateVersionFrom11To12:function()
{this._migrateSettingsFromLocalStorage();},_updateVersionFrom12To13:function()
{this._migrateSettingsFromLocalStorage();WebInspector.settings.createSetting("timelineOverviewMode","").remove();},_updateVersionFrom13To14:function()
{var defaultValue={"throughput":-1,"latency":0};WebInspector.settings.createSetting("networkConditions",defaultValue).set(defaultValue);},_updateVersionFrom14To15:function()
{var setting=WebInspector.settings.createLocalSetting("workspaceExcludedFolders",{});var oldValue=setting.get();var newValue={};for(var fileSystemPath in oldValue){newValue[fileSystemPath]=[];for(var entry of oldValue[fileSystemPath])
newValue[fileSystemPath].push(entry.path);}
setting.set(newValue);},_updateVersionFrom15To16:function()
{var setting=WebInspector.settings.createSetting("InspectorView.panelOrder",{});var tabOrders=setting.get();for(var key of Object.keys(tabOrders))
tabOrders[key]=(tabOrders[key]+1)*10;setting.set(tabOrders);},_updateVersionFrom16To17:function()
{var setting=WebInspector.settings.createSetting("networkConditionsCustomProfiles",[]);var oldValue=setting.get();var newValue=[];if(Array.isArray(oldValue)){for(var preset of oldValue){if(typeof preset.title==="string"&&typeof preset.value==="object"&&typeof preset.value.throughput==="number"&&typeof preset.value.latency==="number")
newValue.push({title:preset.title,value:{download:preset.value.throughput,upload:preset.value.throughput,latency:preset.value.latency}});}}
setting.set(newValue);},_updateVersionFrom17To18:function()
{var setting=WebInspector.settings.createLocalSetting("workspaceExcludedFolders",{});var oldValue=setting.get();var newValue={};for(var oldKey in oldValue){var newKey=oldKey.replace(/\\/g,"/");if(!newKey.startsWith("file://")){if(newKey.startsWith("/"))
newKey="file://"+newKey;else
newKey="file:///"+newKey;}
newValue[newKey]=oldValue[oldKey];}
setting.set(newValue);},_migrateSettingsFromLocalStorage:function()
{var localSettings=["advancedSearchConfig","breakpoints","consoleHistory","domBreakpoints","eventListenerBreakpoints","fileSystemMapping","lastSelectedSourcesSidebarPaneTab","previouslyViewedFiles","savedURLs","watchExpressions","workspaceExcludedFolders","xhrBreakpoints"].keySet();if(!window.localStorage)
return;for(var key in window.localStorage){if(key in localSettings)
continue;var value=window.localStorage[key];window.localStorage.removeItem(key);WebInspector.settings._settingsStorage[key]=value;}},_clearBreakpointsWhenTooMany:function(breakpointsSetting,maxBreakpointsCount)
{if(breakpointsSetting.get().length>maxBreakpointsCount)
breakpointsSetting.set([]);}}
WebInspector.settings;WebInspector.moduleSetting=function(settingName)
{return WebInspector.settings.moduleSetting(settingName);}
WebInspector.settingForTest=function(settingName)
{return WebInspector.settings.settingForTest(settingName);};WebInspector.StaticContentProvider=function(contentType,content,contentURL)
{this._content=content;this._contentType=contentType;this._contentURL=contentURL||"";}
WebInspector.StaticContentProvider.searchInContent=function(content,query,caseSensitive,isRegex,callback)
{function performSearch()
{callback(WebInspector.ContentProvider.performSearchInContent(content,query,caseSensitive,isRegex));}
setTimeout(performSearch.bind(null),0);}
WebInspector.StaticContentProvider.prototype={contentURL:function()
{return this._contentURL;},contentType:function()
{return this._contentType;},requestContent:function(callback)
{callback(this._content);},searchInContent:function(query,caseSensitive,isRegex,callback)
{WebInspector.StaticContentProvider.searchInContent(this._content,query,caseSensitive,isRegex,callback);}};WebInspector.OutputStream=function()
{}
WebInspector.OutputStream.prototype={write:function(data,callback){},close:function(){}}
WebInspector.StringOutputStream=function()
{this._data="";}
WebInspector.StringOutputStream.prototype={write:function(chunk,callback)
{this._data+=chunk;},close:function()
{},data:function()
{return this._data;}};WebInspector.TestBase=function(domAutomationController)
{this.domAutomationController_=domAutomationController;this.controlTaken_=false;this.timerId_=-1;};WebInspector.TestBase.prototype.fail=function(message)
{if(this.controlTaken_)
this.reportFailure_(message);else
throw message;};WebInspector.TestBase.prototype.assertEquals=function(expected,actual,opt_message)
{if(expected!==actual){var message="Expected: '"+expected+"', but was '"+actual+"'";if(opt_message)
message=opt_message+"("+message+")";this.fail(message);}};WebInspector.TestBase.prototype.assertTrue=function(value,opt_message)
{this.assertEquals(true,!!value,opt_message);};WebInspector.TestBase.prototype.takeControl=function()
{this.controlTaken_=true;var self=this;this.timerId_=setTimeout(function(){self.reportFailure_("Timeout exceeded: 20 sec");},20000);};WebInspector.TestBase.prototype.releaseControl=function()
{if(this.timerId_!==-1){clearTimeout(this.timerId_);this.timerId_=-1;}
this.reportOk_();};WebInspector.TestBase.prototype.reportOk_=function()
{this.domAutomationController_.send("[OK]");};WebInspector.TestBase.prototype.reportFailure_=function(error)
{if(this.timerId_!==-1){clearTimeout(this.timerId_);this.timerId_=-1;}
this.domAutomationController_.send("[FAILED] "+error);};WebInspector.TestBase.prototype.dispatch=function(args)
{var methodName=args.shift();try{this[methodName].apply(this,args);if(!this.controlTaken_)
this.reportOk_();}catch(e){this.reportFailure_(e);}};WebInspector.TestBase.prototype.addSniffer=function(receiver,methodName,override,opt_sticky)
{var orig=receiver[methodName];if(typeof orig!=="function")
this.fail("Cannot find method to override: "+methodName);var test=this;receiver[methodName]=function(var_args){try{var result=orig.apply(this,arguments);}finally{if(!opt_sticky)
receiver[methodName]=orig;}
try{override.apply(this,arguments);}catch(e){test.fail("Exception in overriden method '"+methodName+"': "+e);}
return result;};};WebInspector.TestBase.prototype.waitForThrottler=function(throttler,callback)
{var test=this;var scheduleShouldFail=true;test.addSniffer(throttler,"schedule",onSchedule);function hasSomethingScheduled()
{return throttler._isRunningProcess||throttler._process;}
function checkState()
{if(!hasSomethingScheduled()){scheduleShouldFail=false;callback();return;}
test.addSniffer(throttler,"_processCompletedForTests",checkState);}
function onSchedule()
{if(scheduleShouldFail)
test.fail("Unexpected Throttler.schedule");}
checkState();};;WebInspector.TextRange=function(startLine,startColumn,endLine,endColumn)
{this.startLine=startLine;this.startColumn=startColumn;this.endLine=endLine;this.endColumn=endColumn;}
WebInspector.TextRange.createFromLocation=function(line,column)
{return new WebInspector.TextRange(line,column,line,column);}
WebInspector.TextRange.fromObject=function(serializedTextRange)
{return new WebInspector.TextRange(serializedTextRange.startLine,serializedTextRange.startColumn,serializedTextRange.endLine,serializedTextRange.endColumn);}
WebInspector.TextRange.comparator=function(range1,range2)
{return range1.compareTo(range2);}
WebInspector.TextRange.prototype={isEmpty:function()
{return this.startLine===this.endLine&&this.startColumn===this.endColumn;},immediatelyPrecedes:function(range)
{if(!range)
return false;return this.endLine===range.startLine&&this.endColumn===range.startColumn;},immediatelyFollows:function(range)
{if(!range)
return false;return range.immediatelyPrecedes(this);},follows:function(range)
{return(range.endLine===this.startLine&&range.endColumn<=this.startColumn)||range.endLine<this.startLine;},get linesCount()
{return this.endLine-this.startLine;},collapseToEnd:function()
{return new WebInspector.TextRange(this.endLine,this.endColumn,this.endLine,this.endColumn);},collapseToStart:function()
{return new WebInspector.TextRange(this.startLine,this.startColumn,this.startLine,this.startColumn);},normalize:function()
{if(this.startLine>this.endLine||(this.startLine===this.endLine&&this.startColumn>this.endColumn))
return new WebInspector.TextRange(this.endLine,this.endColumn,this.startLine,this.startColumn);else
return this.clone();},clone:function()
{return new WebInspector.TextRange(this.startLine,this.startColumn,this.endLine,this.endColumn);},serializeToObject:function()
{var serializedTextRange={};serializedTextRange.startLine=this.startLine;serializedTextRange.startColumn=this.startColumn;serializedTextRange.endLine=this.endLine;serializedTextRange.endColumn=this.endColumn;return serializedTextRange;},compareTo:function(other)
{if(this.startLine>other.startLine)
return 1;if(this.startLine<other.startLine)
return-1;if(this.startColumn>other.startColumn)
return 1;if(this.startColumn<other.startColumn)
return-1;return 0;},equal:function(other)
{return this.startLine===other.startLine&&this.endLine===other.endLine&&this.startColumn===other.startColumn&&this.endColumn===other.endColumn;},shift:function(lineOffset)
{return new WebInspector.TextRange(this.startLine+lineOffset,this.startColumn,this.endLine+lineOffset,this.endColumn);},relativeTo:function(line,column)
{var relative=this.clone();if(this.startLine==line)
relative.startColumn-=column;if(this.endLine==line)
relative.endColumn-=column;relative.startLine-=line;relative.endLine-=line;return relative;},toSourceRange:function(text)
{var start=(this.startLine?text.lineEndings()[this.startLine-1]+1:0)+this.startColumn;var end=(this.endLine?text.lineEndings()[this.endLine-1]+1:0)+this.endColumn;return new WebInspector.SourceRange(start,end-start);},rebaseAfterTextEdit:function(originalRange,editedRange)
{console.assert(originalRange.startLine===editedRange.startLine);console.assert(originalRange.startColumn===editedRange.startColumn);var rebase=this.clone();if(!this.follows(originalRange))
return rebase;var lineDelta=editedRange.endLine-originalRange.endLine;var columnDelta=editedRange.endColumn-originalRange.endColumn;rebase.startLine+=lineDelta;rebase.endLine+=lineDelta;if(rebase.startLine===editedRange.endLine)
rebase.startColumn+=columnDelta;if(rebase.endLine===editedRange.endLine)
rebase.endColumn+=columnDelta;return rebase;},toString:function()
{return JSON.stringify(this);},replaceInText:function(text,replacement)
{var sourceRange=this.toSourceRange(text);return text.substring(0,sourceRange.offset)+replacement+text.substring(sourceRange.offset+sourceRange.length);},extract:function(text)
{var sourceRange=this.toSourceRange(text);return text.substr(sourceRange.offset,sourceRange.length);},containsLocation:function(lineNumber,columnNumber)
{if(this.startLine===this.endLine)
return this.startLine===lineNumber&&this.startColumn<=columnNumber&&columnNumber<=this.endColumn;if(this.startLine===lineNumber)
return this.startColumn<=columnNumber;if(this.endLine===lineNumber)
return columnNumber<=this.endColumn;return this.startLine<lineNumber&&lineNumber<this.endLine;}}
WebInspector.SourceRange=function(offset,length)
{this.offset=offset;this.length=length;}
WebInspector.SourceEdit=function(sourceURL,oldRange,oldText,newText)
{this.sourceURL=sourceURL;this.oldRange=oldRange;this.oldText=oldText;this.newText=newText;}
WebInspector.SourceEdit.prototype={newRange:function()
{var endLine=this.oldRange.startLine;var endColumn=this.oldRange.startColumn+this.newText.length;var lineEndings=this.newText.lineEndings();if(lineEndings.length>1){endLine=this.oldRange.startLine+lineEndings.length-1;var len=lineEndings.length;endColumn=lineEndings[len-1]-lineEndings[len-2]-1;}
return new WebInspector.TextRange(this.oldRange.startLine,this.oldRange.startColumn,endLine,endColumn);},applyToText:function(text)
{return this.oldRange.replaceInText(text,this.newText);},};WebInspector.TextUtils={isStopChar:function(char)
{return(char>" "&&char<"0")||(char>"9"&&char<"A")||(char>"Z"&&char<"_")||(char>"_"&&char<"a")||(char>"z"&&char<="~");},isWordChar:function(char)
{return!WebInspector.TextUtils.isStopChar(char)&&!WebInspector.TextUtils.isSpaceChar(char);},isSpaceChar:function(char)
{return WebInspector.TextUtils._SpaceCharRegex.test(char);},isWord:function(word)
{for(var i=0;i<word.length;++i){if(!WebInspector.TextUtils.isWordChar(word.charAt(i)))
return false;}
return true;},isOpeningBraceChar:function(char)
{return char==="("||char==="{";},isClosingBraceChar:function(char)
{return char===")"||char==="}";},isBraceChar:function(char)
{return WebInspector.TextUtils.isOpeningBraceChar(char)||WebInspector.TextUtils.isClosingBraceChar(char);},textToWords:function(text,isWordChar,wordCallback)
{var startWord=-1;for(var i=0;i<text.length;++i){if(!isWordChar(text.charAt(i))){if(startWord!==-1)
wordCallback(text.substring(startWord,i));startWord=-1;}else if(startWord===-1)
startWord=i;}
if(startWord!==-1)
wordCallback(text.substring(startWord));},lineIndent:function(line)
{var indentation=0;while(indentation<line.length&&WebInspector.TextUtils.isSpaceChar(line.charAt(indentation)))
++indentation;return line.substr(0,indentation);},isUpperCase:function(text)
{return text===text.toUpperCase();},isLowerCase:function(text)
{return text===text.toLowerCase();},_lastSectionBeforeQuery:function(text,delimiter)
{var lastIndexOfDot=text.lastIndexOf(delimiter);var extension=lastIndexOfDot!==-1?text.substr(lastIndexOfDot+1):"";var indexOfQuestionMark=extension.indexOf("?");if(indexOfQuestionMark!==-1)
extension=extension.substr(0,indexOfQuestionMark);return extension;},extension:function(text)
{return WebInspector.TextUtils._lastSectionBeforeQuery(text,".");},fileName:function(text)
{return WebInspector.TextUtils._lastSectionBeforeQuery(text,"/");}}
WebInspector.TextUtils._SpaceCharRegex=/\s/;WebInspector.TextUtils.Indent={TwoSpaces:"  ",FourSpaces:"    ",EightSpaces:"        ",TabCharacter:"\t"}
WebInspector.TextUtils.BalancedJSONTokenizer=function(callback,findMultiple)
{this._callback=callback;this._index=0;this._balance=0;this._buffer="";this._findMultiple=findMultiple||false;this._closingDoubleQuoteRegex=/[^\\](?:\\\\)*"/g;}
WebInspector.TextUtils.BalancedJSONTokenizer.prototype={write:function(chunk)
{this._buffer+=chunk;var lastIndex=this._buffer.length;var buffer=this._buffer;for(var index=this._index;index<lastIndex;++index){var character=buffer[index];if(character==="\""){this._closingDoubleQuoteRegex.lastIndex=index;if(!this._closingDoubleQuoteRegex.test(buffer))
break;index=this._closingDoubleQuoteRegex.lastIndex-1;}else if(character==="{"){++this._balance;}else if(character==="}"){if(--this._balance===0){this._lastBalancedIndex=index+1;if(!this._findMultiple)
break;}}}
this._index=index;this._reportBalanced();},_reportBalanced:function()
{if(!this._lastBalancedIndex)
return;this._callback(this._buffer.slice(0,this._lastBalancedIndex));this._buffer=this._buffer.slice(this._lastBalancedIndex);this._index-=this._lastBalancedIndex;this._lastBalancedIndex=0;},remainder:function()
{return this._buffer;}}
WebInspector.TokenizerFactory=function(){}
WebInspector.TokenizerFactory.prototype={createTokenizer:function(mimeType){}};WebInspector.Throttler=function(timeout)
{this._timeout=timeout;this._isRunningProcess=false;this._asSoonAsPossible=false;this._process=null;}
WebInspector.Throttler.prototype={_processCompleted:function()
{this._isRunningProcess=false;if(this._process)
this._innerSchedule(false);this._processCompletedForTests();},_processCompletedForTests:function()
{},_onTimeout:function()
{delete this._processTimeout;this._asSoonAsPossible=false;this._isRunningProcess=true;Promise.resolve().then(this._process).catch(console.error.bind(console)).then(this._processCompleted.bind(this));this._process=null;},schedule:function(process,asSoonAsPossible)
{this._process=process;var hasScheduledTasks=!!this._processTimeout||this._isRunningProcess;asSoonAsPossible=!!asSoonAsPossible||!hasScheduledTasks;var forceTimerUpdate=asSoonAsPossible&&!this._asSoonAsPossible;this._asSoonAsPossible=this._asSoonAsPossible||asSoonAsPossible;this._innerSchedule(forceTimerUpdate);},_innerSchedule:function(forceTimerUpdate)
{if(this._isRunningProcess)
return;if(this._processTimeout&&!forceTimerUpdate)
return;if(this._processTimeout)
this._clearTimeout(this._processTimeout);var timeout=this._asSoonAsPossible?0:this._timeout;this._processTimeout=this._setTimeout(this._onTimeout.bind(this),timeout);},_clearTimeout:function(timeoutId)
{clearTimeout(timeoutId);},_setTimeout:function(operation,timeout)
{return setTimeout(operation,timeout);}}
WebInspector.Throttler.FinishCallback;;WebInspector.UIString=function(string,vararg)
{return String.vsprintf(WebInspector.localize(string),Array.prototype.slice.call(arguments,1));}
WebInspector.UIString.capitalize=function(string,vararg)
{if(WebInspector._useLowerCaseMenuTitles===undefined)
throw"WebInspector.setLocalizationPlatform() has not been called";var localized=WebInspector.localize(string);var capitalized;if(WebInspector._useLowerCaseMenuTitles)
capitalized=localized.replace(/\^(.)/g,"$1");else
capitalized=localized.replace(/\^(.)/g,function(str,char){return char.toUpperCase();});return String.vsprintf(capitalized,Array.prototype.slice.call(arguments,1));}
WebInspector.setLocalizationPlatform=function(platform)
{WebInspector._useLowerCaseMenuTitles=platform==="windows";}
WebInspector.localize=function(string)
{return string;}
WebInspector.UIStringFormat=function(format)
{this._localizedFormat=WebInspector.localize(format);this._tokenizedFormat=String.tokenizeFormatString(this._localizedFormat,String.standardFormatters);}
WebInspector.UIStringFormat._append=function(a,b)
{return a+b;}
WebInspector.UIStringFormat.prototype={format:function(vararg)
{return String.format(this._localizedFormat,arguments,String.standardFormatters,"",WebInspector.UIStringFormat._append,this._tokenizedFormat).formattedResult;}};WebInspector.Renderer=function()
{}
WebInspector.Renderer.prototype={render:function(object){}}
WebInspector.Renderer.renderPromise=function(object)
{if(!object)
return Promise.reject(new Error("Can't render "+object));return self.runtime.instancePromise(WebInspector.Renderer,object).then(render);function render(renderer)
{return renderer.render(object);}}
WebInspector.Revealer=function()
{}
WebInspector.Revealer.reveal=function(revealable,lineNumber)
{WebInspector.Revealer.revealPromise(revealable,lineNumber);}
WebInspector.Revealer.revealPromise=function(revealable,lineNumber)
{if(!revealable)
return Promise.reject(new Error("Can't reveal "+revealable));return self.runtime.instancesPromise(WebInspector.Revealer,revealable).then(reveal);function reveal(revealers)
{var promises=[];for(var i=0;i<revealers.length;++i)
promises.push(revealers[i].reveal((revealable),lineNumber));return Promise.race(promises);}}
WebInspector.Revealer.prototype={reveal:function(object,lineNumber){}}
WebInspector.App=function()
{}
WebInspector.App.prototype={presentUI:function(document,callback){}}
WebInspector.AppProvider=function()
{}
WebInspector.AppProvider.prototype={createApp:function(){}}
WebInspector.QueryParamHandler=function()
{}
WebInspector.QueryParamHandler.prototype={handleQueryParam:function(value){}};function InspectorFrontendHostAPI()
{}
InspectorFrontendHostAPI.ContextMenuDescriptor;InspectorFrontendHostAPI.LoadNetworkResourceResult;InspectorFrontendHostAPI.Events={AddExtensions:"addExtensions",AppendedToURL:"appendedToURL",CanceledSaveURL:"canceledSaveURL",ContextMenuCleared:"contextMenuCleared",ContextMenuItemSelected:"contextMenuItemSelected",DeviceCountUpdated:"deviceCountUpdated",DevicesDiscoveryConfigChanged:"devicesDiscoveryConfigChanged",DevicesPortForwardingStatusChanged:"devicesPortForwardingStatusChanged",DevicesUpdated:"devicesUpdated",DispatchMessage:"dispatchMessage",DispatchMessageChunk:"dispatchMessageChunk",DispatchFrontendAPIMessage:"dispatchFrontendAPIMessage",EnterInspectElementMode:"enterInspectElementMode",FileSystemsLoaded:"fileSystemsLoaded",FileSystemRemoved:"fileSystemRemoved",FileSystemAdded:"fileSystemAdded",FileSystemFilesChanged:"fileSystemFilesChanged",FrontendAPIAttached:"frontendAPIAttached",FrontendAPIDetached:"frontendAPIDetached",IndexingTotalWorkCalculated:"indexingTotalWorkCalculated",IndexingWorked:"indexingWorked",IndexingDone:"indexingDone",KeyEventUnhandled:"keyEventUnhandled",ReloadInspectedPage:"reloadInspectedPage",RevealSourceLine:"revealSourceLine",SavedURL:"savedURL",SearchCompleted:"searchCompleted",SetInspectedTabId:"setInspectedTabId",SetUseSoftMenu:"setUseSoftMenu",ShowPanel:"showPanel"}
InspectorFrontendHostAPI.EventDescriptors=[[InspectorFrontendHostAPI.Events.AddExtensions,["extensions"]],[InspectorFrontendHostAPI.Events.AppendedToURL,["url"]],[InspectorFrontendHostAPI.Events.CanceledSaveURL,["url"]],[InspectorFrontendHostAPI.Events.ContextMenuCleared,[]],[InspectorFrontendHostAPI.Events.ContextMenuItemSelected,["id"]],[InspectorFrontendHostAPI.Events.DeviceCountUpdated,["count"]],[InspectorFrontendHostAPI.Events.DevicesDiscoveryConfigChanged,["discoverUsbDevices","portForwardingEnabled","portForwardingConfig"]],[InspectorFrontendHostAPI.Events.DevicesPortForwardingStatusChanged,["status"]],[InspectorFrontendHostAPI.Events.DevicesUpdated,["devices"]],[InspectorFrontendHostAPI.Events.DispatchMessage,["messageObject"]],[InspectorFrontendHostAPI.Events.DispatchMessageChunk,["messageChunk","messageSize"]],[InspectorFrontendHostAPI.Events.DispatchFrontendAPIMessage,["messageObject"]],[InspectorFrontendHostAPI.Events.EnterInspectElementMode,[]],[InspectorFrontendHostAPI.Events.FileSystemsLoaded,["fileSystems"]],[InspectorFrontendHostAPI.Events.FileSystemRemoved,["fileSystemPath"]],[InspectorFrontendHostAPI.Events.FileSystemAdded,["errorMessage","fileSystem"]],[InspectorFrontendHostAPI.Events.FileSystemFilesChanged,["paths"]],[InspectorFrontendHostAPI.Events.FrontendAPIAttached,["frontendAPIAttached"]],[InspectorFrontendHostAPI.Events.FrontendAPIDetached,["frontendAPIDetached"]],[InspectorFrontendHostAPI.Events.IndexingTotalWorkCalculated,["requestId","fileSystemPath","totalWork"]],[InspectorFrontendHostAPI.Events.IndexingWorked,["requestId","fileSystemPath","worked"]],[InspectorFrontendHostAPI.Events.IndexingDone,["requestId","fileSystemPath"]],[InspectorFrontendHostAPI.Events.KeyEventUnhandled,["event"]],[InspectorFrontendHostAPI.Events.ReloadInspectedPage,["hard"]],[InspectorFrontendHostAPI.Events.RevealSourceLine,["url","lineNumber","columnNumber"]],[InspectorFrontendHostAPI.Events.SavedURL,["url"]],[InspectorFrontendHostAPI.Events.SearchCompleted,["requestId","fileSystemPath","files"]],[InspectorFrontendHostAPI.Events.SetInspectedTabId,["tabId"]],[InspectorFrontendHostAPI.Events.SetUseSoftMenu,["useSoftMenu"]],[InspectorFrontendHostAPI.Events.ShowPanel,["panelName"]]];InspectorFrontendHostAPI.prototype={addFileSystem:function(fileSystemPath){},append:function(url,content){},loadCompleted:function(){},indexPath:function(requestId,fileSystemPath){},getSelectionBackgroundColor:function(){},getSelectionForegroundColor:function(){},setInspectedPageBounds:function(bounds){},setWhitelistedShortcuts:function(shortcuts){},inspectElementCompleted:function(){},openInNewTab:function(url){},removeFileSystem:function(fileSystemPath){},requestFileSystems:function(){},save:function(url,content,forceSaveAs){},searchInPath:function(requestId,fileSystemPath,query){},stopIndexing:function(requestId){},bringToFront:function(){},closeWindow:function(){},copyText:function(text){},inspectedURLChanged:function(url){},isolatedFileSystem:function(fileSystemId,registeredName){},loadNetworkResource:function(url,headers,streamId,callback){},getPreferences:function(callback){},setPreference:function(name,value){},removePreference:function(name){},clearPreferences:function(){},upgradeDraggedFileSystemPermissions:function(fileSystem){},platform:function(){},recordEnumeratedHistogram:function(actionName,actionCode,bucketSize){},sendMessageToBackend:function(message){},setDevicesDiscoveryConfig:function(discoverUsbDevices,portForwardingEnabled,portForwardingConfig){},setDevicesUpdatesEnabled:function(enabled){},performActionOnRemotePage:function(pageId,action){},openRemotePage:function(browserId,url){},setInjectedScriptForOrigin:function(origin,script){},setIsDocked:function(isDocked,callback){},zoomFactor:function(){},zoomIn:function(){},zoomOut:function(){},resetZoom:function(){},showContextMenuAtPoint:function(x,y,items,document){},isUnderTest:function(){},isHostedMode:function(){},sendFrontendAPINotification:function(message){}};WebInspector.InspectorFrontendHostStub=function()
{function stopEventPropagation(event)
{var zoomModifier=WebInspector.isMac()?event.metaKey:event.ctrlKey;if(zoomModifier&&(event.keyCode===187||event.keyCode===189))
event.stopPropagation();}
document.addEventListener("keydown",stopEventPropagation,true);}
WebInspector.InspectorFrontendHostStub.prototype={getSelectionBackgroundColor:function()
{return"#6e86ff";},getSelectionForegroundColor:function()
{return"#ffffff";},platform:function()
{var match=navigator.userAgent.match(/Windows NT/);if(match)
return"windows";match=navigator.userAgent.match(/Mac OS X/);if(match)
return"mac";return"linux";},loadCompleted:function()
{},bringToFront:function()
{this._windowVisible=true;},closeWindow:function()
{this._windowVisible=false;},setIsDocked:function(isDocked,callback)
{setTimeout(callback,0);},setInspectedPageBounds:function(bounds)
{},inspectElementCompleted:function()
{},setInjectedScriptForOrigin:function(origin,script)
{},inspectedURLChanged:function(url)
{document.title=WebInspector.UIString("Developer Tools - %s",url);},copyText:function(text)
{WebInspector.console.error("Clipboard is not enabled in hosted mode. Please inspect using chrome://inspect");},openInNewTab:function(url)
{window.open(url,"_blank");},save:function(url,content,forceSaveAs)
{WebInspector.console.error("Saving files is not enabled in hosted mode. Please inspect using chrome://inspect");this.events.dispatchEventToListeners(InspectorFrontendHostAPI.Events.CanceledSaveURL,url);},append:function(url,content)
{WebInspector.console.error("Saving files is not enabled in hosted mode. Please inspect using chrome://inspect");},sendMessageToBackend:function(message)
{},recordEnumeratedHistogram:function(actionName,actionCode,bucketSize)
{},requestFileSystems:function()
{this.events.dispatchEventToListeners(InspectorFrontendHostAPI.Events.FileSystemsLoaded,[]);},addFileSystem:function(fileSystemPath)
{},removeFileSystem:function(fileSystemPath)
{},isolatedFileSystem:function(fileSystemId,registeredName)
{return null;},loadNetworkResource:function(url,headers,streamId,callback)
{loadResourcePromise(url).then(function(text){WebInspector.ResourceLoader.streamWrite(streamId,text);callback({statusCode:200});}).catch(function(){callback({statusCode:404});});},getPreferences:function(callback)
{var prefs={};for(var name in window.localStorage)
prefs[name]=window.localStorage[name];callback(prefs);},setPreference:function(name,value)
{window.localStorage[name]=value;},removePreference:function(name)
{delete window.localStorage[name];},clearPreferences:function()
{window.localStorage.clear();},upgradeDraggedFileSystemPermissions:function(fileSystem)
{},indexPath:function(requestId,fileSystemPath)
{},stopIndexing:function(requestId)
{},searchInPath:function(requestId,fileSystemPath,query)
{},zoomFactor:function()
{return 1;},zoomIn:function()
{},zoomOut:function()
{},resetZoom:function()
{},setWhitelistedShortcuts:function(shortcuts)
{},isUnderTest:function()
{return false;},setDevicesDiscoveryConfig:function(discoverUsbDevices,portForwardingEnabled,portForwardingConfig)
{},setDevicesUpdatesEnabled:function(enabled)
{},performActionOnRemotePage:function(pageId,action)
{},openRemotePage:function(browserId,url)
{},showContextMenuAtPoint:function(x,y,items,document)
{throw"Soft context menu should be used";},isHostedMode:function()
{return true;},sendFrontendAPINotification:function(message)
{}};var InspectorFrontendHost=window.InspectorFrontendHost||null;(function(){function initializeInspectorFrontendHost()
{if(!InspectorFrontendHost){InspectorFrontendHost=new WebInspector.InspectorFrontendHostStub();}else{var proto=WebInspector.InspectorFrontendHostStub.prototype;for(var name in proto){var value=proto[name];if(typeof value!=="function"||InspectorFrontendHost[name])
continue;InspectorFrontendHost[name]=stub.bind(null,name);}}
function stub(name)
{console.error("Incompatible embedder: method InspectorFrontendHost."+name+" is missing. Using stub instead.");var args=Array.prototype.slice.call(arguments,1);return proto[name].apply(InspectorFrontendHost,args);}
InspectorFrontendHost.events=new WebInspector.Object();}
function InspectorFrontendAPIImpl()
{this._debugFrontend=!!Runtime.queryParam("debugFrontend")||(window["InspectorTest"]&&window["InspectorTest"]["debugTest"]);var descriptors=InspectorFrontendHostAPI.EventDescriptors;for(var i=0;i<descriptors.length;++i)
this[descriptors[i][0]]=this._dispatch.bind(this,descriptors[i][0],descriptors[i][1],descriptors[i][2]);}
InspectorFrontendAPIImpl.prototype={_dispatch:function(name,signature,runOnceLoaded)
{var params=Array.prototype.slice.call(arguments,3);if(this._debugFrontend)
setImmediate(innerDispatch);else
innerDispatch();function innerDispatch()
{if(signature.length<2){try{InspectorFrontendHost.events.dispatchEventToListeners(name,params[0]);}catch(e){console.error(e+" "+e.stack);}
return;}
var data={};for(var i=0;i<signature.length;++i)
data[signature[i]]=params[i];try{InspectorFrontendHost.events.dispatchEventToListeners(name,data);}catch(e){console.error(e+" "+e.stack);}}},streamWrite:function(id,chunk)
{WebInspector.ResourceLoader.streamWrite(id,chunk);}}
initializeInspectorFrontendHost();window.InspectorFrontendAPI=new InspectorFrontendAPIImpl();WebInspector.setLocalizationPlatform(InspectorFrontendHost.platform());})();InspectorFrontendHost.events;;WebInspector.platform=function()
{if(!WebInspector._platform)
WebInspector._platform=InspectorFrontendHost.platform();return WebInspector._platform;}
WebInspector.isMac=function()
{if(typeof WebInspector._isMac==="undefined")
WebInspector._isMac=WebInspector.platform()==="mac";return WebInspector._isMac;}
WebInspector.isWin=function()
{if(typeof WebInspector._isWin==="undefined")
WebInspector._isWin=WebInspector.platform()==="windows";return WebInspector._isWin;}
WebInspector.fontFamily=function()
{if(WebInspector._fontFamily)
return WebInspector._fontFamily;switch(WebInspector.platform()){case"linux":WebInspector._fontFamily="Ubuntu, Arial, sans-serif";break;case"mac":WebInspector._fontFamily="'Lucida Grande', sans-serif";break;case"windows":WebInspector._fontFamily="'Segoe UI', Tahoma, sans-serif";break;}
return WebInspector._fontFamily;}
WebInspector.monospaceFontFamily=function()
{if(WebInspector._monospaceFontFamily)
return WebInspector._monospaceFontFamily;switch(WebInspector.platform()){case"linux":WebInspector._monospaceFontFamily="dejavu sans mono, monospace";break;case"mac":WebInspector._monospaceFontFamily="Menlo, monospace";break;case"windows":WebInspector._monospaceFontFamily="Consolas, monospace";break;}
return WebInspector._monospaceFontFamily;};WebInspector.ResourceLoader={}
WebInspector.ResourceLoader._lastStreamId=0;WebInspector.ResourceLoader._boundStreams={};WebInspector.ResourceLoader._bindOutputStream=function(stream)
{WebInspector.ResourceLoader._boundStreams[++WebInspector.ResourceLoader._lastStreamId]=stream;return WebInspector.ResourceLoader._lastStreamId;}
WebInspector.ResourceLoader._discardOutputStream=function(id)
{WebInspector.ResourceLoader._boundStreams[id].close();delete WebInspector.ResourceLoader._boundStreams[id];}
WebInspector.ResourceLoader.streamWrite=function(id,chunk)
{WebInspector.ResourceLoader._boundStreams[id].write(chunk);}
WebInspector.ResourceLoader.load=function(url,headers,callback)
{var stream=new WebInspector.StringOutputStream();WebInspector.ResourceLoader.loadAsStream(url,headers,stream,mycallback);function mycallback(statusCode,headers)
{callback(statusCode,headers,stream.data());}}
WebInspector.ResourceLoader.loadAsStream=function(url,headers,stream,callback)
{var streamId=WebInspector.ResourceLoader._bindOutputStream(stream);var parsedURL=new WebInspector.ParsedURL(url);if(parsedURL.isDataURL()){loadXHR(url).then(dataURLDecodeSuccessful).catch(dataURLDecodeFailed);return;}
var rawHeaders=[];if(headers){for(var key in headers)
rawHeaders.push(key+": "+headers[key]);}
InspectorFrontendHost.loadNetworkResource(url,rawHeaders.join("\r\n"),streamId,finishedCallback);function finishedCallback(response)
{if(callback)
callback(response.statusCode,response.headers||{});WebInspector.ResourceLoader._discardOutputStream(streamId);}
function dataURLDecodeSuccessful(text)
{WebInspector.ResourceLoader.streamWrite(streamId,text);finishedCallback(({statusCode:200}));}
function dataURLDecodeFailed()
{finishedCallback(({statusCode:404}));}};WebInspector.UserMetrics=function()
{}
WebInspector.UserMetrics.Action={WindowDocked:1,WindowUndocked:2,ScriptsBreakpointSet:3,TimelineStarted:4,ProfilesCPUProfileTaken:5,ProfilesHeapProfileTaken:6,AuditsStarted:7,ConsoleEvaluated:8,FileSavedInWorkspace:9,DeviceModeEnabled:10,AnimationsPlaybackRateChanged:11,RevisionApplied:12,FileSystemDirectoryContentReceived:13,StyleRuleEdited:14,CommandEvaluatedInConsolePanel:15,DOMPropertiesExpanded:16,ResizedViewInResponsiveMode:17}
WebInspector.UserMetrics._PanelCodes={elements:1,resources:2,network:3,sources:4,timeline:5,profiles:6,audits:7,console:8,layers:9}
WebInspector.UserMetrics._DrawerCodes={"console":1,"animations":2,"network.config":3,"rendering":4,"sensors":5,"sources.search":6}
WebInspector.UserMetrics.prototype={panelShown:function(panelName)
{var code=WebInspector.UserMetrics._PanelCodes[panelName]||0;var size=Object.keys(WebInspector.UserMetrics._PanelCodes).length+1;InspectorFrontendHost.recordEnumeratedHistogram("DevTools.PanelShown",code,size);},drawerShown:function(viewId)
{var code=WebInspector.UserMetrics._DrawerCodes[viewId]||0;var size=Object.keys(WebInspector.UserMetrics._DrawerCodes).length+1;InspectorFrontendHost.recordEnumeratedHistogram("DevTools.DrawerShown",code,size);},actionTaken:function(action)
{var size=Object.keys(WebInspector.UserMetrics.Action).length+1;InspectorFrontendHost.recordEnumeratedHistogram("DevTools.ActionTaken",action,size);}}
WebInspector.userMetrics=new WebInspector.UserMetrics();;WebInspector.Widget=function(isWebComponent)
{this.contentElement=createElementWithClass("div","widget");if(isWebComponent){this.element=createElementWithClass("div","vbox flex-auto");this._shadowRoot=WebInspector.createShadowRootWithCoreStyles(this.element);this._shadowRoot.appendChild(this.contentElement);}else{this.element=this.contentElement;}
this._isWebComponent=isWebComponent;this.element.__widget=this;this._visible=true;this._isRoot=false;this._isShowing=false;this._children=[];this._hideOnDetach=false;this._notificationDepth=0;}
WebInspector.Widget.prototype={markAsRoot:function()
{WebInspector.Widget.__assert(!this.element.parentElement,"Attempt to mark as root attached node");this._isRoot=true;},parentWidget:function()
{return this._parentWidget;},children:function()
{return this._children;},childWasDetached:function(widget)
{},isShowing:function()
{return this._isShowing;},shouldHideOnDetach:function()
{if(this._hideOnDetach)
return true;for(var child of this._children){if(child.shouldHideOnDetach())
return true;}
return false;},setHideOnDetach:function()
{this._hideOnDetach=true;},_inNotification:function()
{return!!this._notificationDepth||(this._parentWidget&&this._parentWidget._inNotification());},_parentIsShowing:function()
{if(this._isRoot)
return true;return this._parentWidget&&this._parentWidget.isShowing();},_callOnVisibleChildren:function(method)
{var copy=this._children.slice();for(var i=0;i<copy.length;++i){if(copy[i]._parentWidget===this&&copy[i]._visible)
method.call(copy[i]);}},_processWillShow:function()
{this._callOnVisibleChildren(this._processWillShow);this._isShowing=true;},_processWasShown:function()
{if(this._inNotification())
return;this.restoreScrollPositions();this._notify(this.wasShown);this._callOnVisibleChildren(this._processWasShown);},_processWillHide:function()
{if(this._inNotification())
return;this.storeScrollPositions();this._callOnVisibleChildren(this._processWillHide);this._notify(this.willHide);this._isShowing=false;},_processWasHidden:function()
{this._callOnVisibleChildren(this._processWasHidden);},_processOnResize:function()
{if(this._inNotification())
return;if(!this.isShowing())
return;this._notify(this.onResize);this._callOnVisibleChildren(this._processOnResize);},_notify:function(notification)
{++this._notificationDepth;try{notification.call(this);}finally{--this._notificationDepth;}},wasShown:function()
{},willHide:function()
{},onResize:function()
{},onLayout:function()
{},show:function(parentElement,insertBefore)
{WebInspector.Widget.__assert(parentElement,"Attempt to attach widget with no parent element");if(this.element.parentElement!==parentElement){if(this.element.parentElement)
this.detach();var currentParent=parentElement;while(currentParent&&!currentParent.__widget)
currentParent=currentParent.parentElementOrShadowHost();if(currentParent){this._parentWidget=currentParent.__widget;this._parentWidget._children.push(this);this._isRoot=false;}else
WebInspector.Widget.__assert(this._isRoot,"Attempt to attach widget to orphan node");}else if(this._visible){return;}
this._visible=true;if(this._parentIsShowing())
this._processWillShow();this.element.classList.remove("hidden");if(this.element.parentElement!==parentElement){WebInspector.Widget._incrementWidgetCounter(parentElement,this.element);if(insertBefore)
WebInspector.Widget._originalInsertBefore.call(parentElement,this.element,insertBefore);else
WebInspector.Widget._originalAppendChild.call(parentElement,this.element);}
if(this._parentIsShowing())
this._processWasShown();if(this._parentWidget&&this._hasNonZeroConstraints())
this._parentWidget.invalidateConstraints();else
this._processOnResize();},detach:function(overrideHideOnDetach)
{var parentElement=this.element.parentElement;if(!parentElement)
return;if(this._parentIsShowing())
this._processWillHide();if(!overrideHideOnDetach&&this.shouldHideOnDetach()){this.element.classList.add("hidden");this._visible=false;if(this._parentIsShowing())
this._processWasHidden();if(this._parentWidget&&this._hasNonZeroConstraints())
this._parentWidget.invalidateConstraints();return;}
WebInspector.Widget._decrementWidgetCounter(parentElement,this.element);WebInspector.Widget._originalRemoveChild.call(parentElement,this.element);this._visible=false;if(this._parentIsShowing())
this._processWasHidden();if(this._parentWidget){var childIndex=this._parentWidget._children.indexOf(this);WebInspector.Widget.__assert(childIndex>=0,"Attempt to remove non-child widget");this._parentWidget._children.splice(childIndex,1);this._parentWidget.childWasDetached(this);var parent=this._parentWidget;this._parentWidget=null;if(this._hasNonZeroConstraints())
parent.invalidateConstraints();}else
WebInspector.Widget.__assert(this._isRoot,"Removing non-root widget from DOM");},detachChildWidgets:function()
{var children=this._children.slice();for(var i=0;i<children.length;++i)
children[i].detach();},elementsToRestoreScrollPositionsFor:function()
{return[this.element];},storeScrollPositions:function()
{var elements=this.elementsToRestoreScrollPositionsFor();for(var i=0;i<elements.length;++i){var container=elements[i];container._scrollTop=container.scrollTop;container._scrollLeft=container.scrollLeft;}},restoreScrollPositions:function()
{var elements=this.elementsToRestoreScrollPositionsFor();for(var i=0;i<elements.length;++i){var container=elements[i];if(container._scrollTop)
container.scrollTop=container._scrollTop;if(container._scrollLeft)
container.scrollLeft=container._scrollLeft;}},doResize:function()
{if(!this.isShowing())
return;if(!this._inNotification())
this._callOnVisibleChildren(this._processOnResize);},doLayout:function()
{if(!this.isShowing())
return;this._notify(this.onLayout);this.doResize();},registerRequiredCSS:function(cssFile)
{WebInspector.appendStyle(this._isWebComponent?this._shadowRoot:this.element,cssFile);},printWidgetHierarchy:function()
{var lines=[];this._collectWidgetHierarchy("",lines);console.log(lines.join("\n"));},_collectWidgetHierarchy:function(prefix,lines)
{lines.push(prefix+"["+this.element.className+"]"+(this._children.length?" {":""));for(var i=0;i<this._children.length;++i)
this._children[i]._collectWidgetHierarchy(prefix+"    ",lines);if(this._children.length)
lines.push(prefix+"}");},defaultFocusedElement:function()
{return this._defaultFocusedElement||this.element;},setDefaultFocusedElement:function(element)
{this._defaultFocusedElement=element;},focus:function()
{var element=this.defaultFocusedElement();if(!element||element.isAncestor(this.element.ownerDocument.activeElement))
return;WebInspector.setCurrentFocusElement(element);},hasFocus:function()
{var activeElement=this.element.ownerDocument.activeElement;return activeElement&&activeElement.isSelfOrDescendant(this.element);},measurePreferredSize:function()
{var document=this.element.ownerDocument;WebInspector.Widget._originalAppendChild.call(document.body,this.element);this.element.positionAt(0,0);var result=new Size(this.element.offsetWidth,this.element.offsetHeight);this.element.positionAt(undefined,undefined);WebInspector.Widget._originalRemoveChild.call(document.body,this.element);return result;},calculateConstraints:function()
{return new Constraints();},constraints:function()
{if(typeof this._constraints!=="undefined")
return this._constraints;if(typeof this._cachedConstraints==="undefined")
this._cachedConstraints=this.calculateConstraints();return this._cachedConstraints;},setMinimumAndPreferredSizes:function(width,height,preferredWidth,preferredHeight)
{this._constraints=new Constraints(new Size(width,height),new Size(preferredWidth,preferredHeight));this.invalidateConstraints();},setMinimumSize:function(width,height)
{this._constraints=new Constraints(new Size(width,height));this.invalidateConstraints();},_hasNonZeroConstraints:function()
{var constraints=this.constraints();return!!(constraints.minimum.width||constraints.minimum.height||constraints.preferred.width||constraints.preferred.height);},invalidateConstraints:function()
{var cached=this._cachedConstraints;delete this._cachedConstraints;var actual=this.constraints();if(!actual.isEqual(cached)&&this._parentWidget)
this._parentWidget.invalidateConstraints();else
this.doLayout();},invalidateSize:function()
{if(this._parentWidget)
this._parentWidget.doLayout();},__proto__:WebInspector.Object.prototype}
WebInspector.Widget._originalAppendChild=Element.prototype.appendChild;WebInspector.Widget._originalInsertBefore=Element.prototype.insertBefore;WebInspector.Widget._originalRemoveChild=Element.prototype.removeChild;WebInspector.Widget._originalRemoveChildren=Element.prototype.removeChildren;WebInspector.Widget._incrementWidgetCounter=function(parentElement,childElement)
{var count=(childElement.__widgetCounter||0)+(childElement.__widget?1:0);if(!count)
return;while(parentElement){parentElement.__widgetCounter=(parentElement.__widgetCounter||0)+count;parentElement=parentElement.parentElementOrShadowHost();}}
WebInspector.Widget._decrementWidgetCounter=function(parentElement,childElement)
{var count=(childElement.__widgetCounter||0)+(childElement.__widget?1:0);if(!count)
return;while(parentElement){parentElement.__widgetCounter-=count;parentElement=parentElement.parentElementOrShadowHost();}}
WebInspector.Widget.__assert=function(condition,message)
{if(!condition){console.trace();throw new Error(message);}}
WebInspector.VBox=function(isWebComponent)
{WebInspector.Widget.call(this,isWebComponent);this.contentElement.classList.add("vbox");};WebInspector.VBox.prototype={calculateConstraints:function()
{var constraints=new Constraints();function updateForChild()
{var child=this.constraints();constraints=constraints.widthToMax(child);constraints=constraints.addHeight(child);}
this._callOnVisibleChildren(updateForChild);return constraints;},__proto__:WebInspector.Widget.prototype};WebInspector.HBox=function(isWebComponent)
{WebInspector.Widget.call(this,isWebComponent);this.contentElement.classList.add("hbox");};WebInspector.HBox.prototype={calculateConstraints:function()
{var constraints=new Constraints();function updateForChild()
{var child=this.constraints();constraints=constraints.addWidth(child);constraints=constraints.heightToMax(child);}
this._callOnVisibleChildren(updateForChild);return constraints;},__proto__:WebInspector.Widget.prototype};WebInspector.VBoxWithResizeCallback=function(resizeCallback)
{WebInspector.VBox.call(this);this._resizeCallback=resizeCallback;}
WebInspector.VBoxWithResizeCallback.prototype={onResize:function()
{this._resizeCallback();},__proto__:WebInspector.VBox.prototype}
WebInspector.VBoxWithToolbarItems=function()
{WebInspector.VBox.call(this);}
WebInspector.VBoxWithToolbarItems.prototype={toolbarItems:function()
{return[];},__proto__:WebInspector.VBox.prototype}
Element.prototype.appendChild=function(child)
{WebInspector.Widget.__assert(!child.__widget||child.parentElement===this,"Attempt to add widget via regular DOM operation.");return WebInspector.Widget._originalAppendChild.call(this,child);}
Element.prototype.insertBefore=function(child,anchor)
{WebInspector.Widget.__assert(!child.__widget||child.parentElement===this,"Attempt to add widget via regular DOM operation.");return WebInspector.Widget._originalInsertBefore.call(this,child,anchor);}
Element.prototype.removeChild=function(child)
{WebInspector.Widget.__assert(!child.__widgetCounter&&!child.__widget,"Attempt to remove element containing widget via regular DOM operation");return WebInspector.Widget._originalRemoveChild.call(this,child);}
Element.prototype.removeChildren=function()
{WebInspector.Widget.__assert(!this.__widgetCounter,"Attempt to remove element containing widget via regular DOM operation");WebInspector.Widget._originalRemoveChildren.call(this);};function TreeOutline(nonFocusable)
{this._createRootElement();this.selectedTreeElement=null;this.expandTreeElementsWhenArrowing=false;this._comparator=null;this._contentElement=this._rootElement._childrenListNode;this._contentElement.addEventListener("keydown",this._treeKeyDown.bind(this),true);this.setFocusable(!nonFocusable);this.element=this._contentElement;}
TreeOutline.Events={ElementAttached:"ElementAttached",ElementExpanded:"ElementExpanded",ElementCollapsed:"ElementCollapsed",ElementSelected:"ElementSelected"}
TreeOutline.prototype={_createRootElement:function()
{this._rootElement=new TreeElement();this._rootElement.treeOutline=this;this._rootElement.root=true;this._rootElement.selectable=false;this._rootElement.expanded=true;this._rootElement._childrenListNode.classList.remove("children");},rootElement:function()
{return this._rootElement;},firstChild:function()
{return this._rootElement.firstChild();},appendChild:function(child)
{this._rootElement.appendChild(child);},insertChild:function(child,index)
{this._rootElement.insertChild(child,index);},removeChild:function(child)
{this._rootElement.removeChild(child);},removeChildren:function()
{this._rootElement.removeChildren();},treeElementFromPoint:function(x,y)
{var node=this._contentElement.ownerDocument.deepElementFromPoint(x,y);if(!node)
return null;var listNode=node.enclosingNodeOrSelfWithNodeNameInArray(["ol","li"]);if(listNode)
return listNode.parentTreeElement||listNode.treeElement;return null;},treeElementFromEvent:function(event)
{return event?this.treeElementFromPoint(event.pageX,event.pageY):null;},setComparator:function(comparator)
{this._comparator=comparator;},setFocusable:function(focusable)
{if(focusable)
this._contentElement.setAttribute("tabIndex",0);else
this._contentElement.removeAttribute("tabIndex");},focus:function()
{this._contentElement.focus();},_bindTreeElement:function(element)
{if(element.treeOutline)
console.error("Binding element for the second time: "+new Error().stack);element.treeOutline=this;element.onbind();},_unbindTreeElement:function(element)
{if(!element.treeOutline)
console.error("Unbinding element that was not bound: "+new Error().stack);element.deselect();element.onunbind();element.treeOutline=null;},selectPrevious:function()
{var nextSelectedElement=this.selectedTreeElement.traversePreviousTreeElement(true);while(nextSelectedElement&&!nextSelectedElement.selectable)
nextSelectedElement=nextSelectedElement.traversePreviousTreeElement(!this.expandTreeElementsWhenArrowing);if(nextSelectedElement){nextSelectedElement.reveal();nextSelectedElement.select(false,true);return true;}
return false;},selectNext:function()
{var nextSelectedElement=this.selectedTreeElement.traverseNextTreeElement(true);while(nextSelectedElement&&!nextSelectedElement.selectable)
nextSelectedElement=nextSelectedElement.traverseNextTreeElement(!this.expandTreeElementsWhenArrowing);if(nextSelectedElement){nextSelectedElement.reveal();nextSelectedElement.select(false,true);return true;}
return false;},_treeKeyDown:function(event)
{if(event.target!==this._contentElement)
return;if(!this.selectedTreeElement||event.shiftKey||event.metaKey||event.ctrlKey)
return;var handled=false;var nextSelectedElement;if(event.keyIdentifier==="Up"&&!event.altKey){handled=this.selectPrevious();}else if(event.keyIdentifier==="Down"&&!event.altKey){handled=this.selectNext();}else if(event.keyIdentifier==="Left"){if(this.selectedTreeElement.expanded){if(event.altKey)
this.selectedTreeElement.collapseRecursively();else
this.selectedTreeElement.collapse();handled=true;}else if(this.selectedTreeElement.parent&&!this.selectedTreeElement.parent.root){handled=true;if(this.selectedTreeElement.parent.selectable){nextSelectedElement=this.selectedTreeElement.parent;while(nextSelectedElement&&!nextSelectedElement.selectable)
nextSelectedElement=nextSelectedElement.parent;handled=nextSelectedElement?true:false;}else if(this.selectedTreeElement.parent)
this.selectedTreeElement.parent.collapse();}}else if(event.keyIdentifier==="Right"){if(!this.selectedTreeElement.revealed()){this.selectedTreeElement.reveal();handled=true;}else if(this.selectedTreeElement._expandable){handled=true;if(this.selectedTreeElement.expanded){nextSelectedElement=this.selectedTreeElement.firstChild();while(nextSelectedElement&&!nextSelectedElement.selectable)
nextSelectedElement=nextSelectedElement.nextSibling;handled=nextSelectedElement?true:false;}else{if(event.altKey)
this.selectedTreeElement.expandRecursively();else
this.selectedTreeElement.expand();}}}else if(event.keyCode===8||event.keyCode===46)
handled=this.selectedTreeElement.ondelete();else if(isEnterKey(event))
handled=this.selectedTreeElement.onenter();else if(event.keyCode===WebInspector.KeyboardShortcut.Keys.Space.code)
handled=this.selectedTreeElement.onspace();if(nextSelectedElement){nextSelectedElement.reveal();nextSelectedElement.select(false,true);}
if(handled)
event.consume(true);},_deferredScrollIntoView:function(treeElement,center)
{if(!this._treeElementToScrollIntoView)
this.element.window().requestAnimationFrame(deferredScrollIntoView.bind(this));this._treeElementToScrollIntoView=treeElement;this._centerUponScrollIntoView=center;function deferredScrollIntoView()
{this._treeElementToScrollIntoView.listItemElement.scrollIntoViewIfNeeded(this._centerUponScrollIntoView);delete this._treeElementToScrollIntoView;delete this._centerUponScrollIntoView;}},__proto__:WebInspector.Object.prototype}
function TreeOutlineInShadow(className)
{TreeOutline.call(this);var innerElement=this.element;innerElement.classList.add("tree-outline");if(className)
innerElement.classList.add(className);this.element=createElement("div");this._shadowRoot=WebInspector.createShadowRootWithCoreStyles(this.element,"ui/treeoutline.css");var contentElement=this._shadowRoot.createChild("div","tree-outline-disclosure");contentElement.appendChild(innerElement);this._renderSelection=true;}
TreeOutlineInShadow.prototype={registerRequiredCSS:function(cssFile)
{WebInspector.appendStyle(this._shadowRoot,cssFile);},__proto__:TreeOutline.prototype}
function TreeElement(title,expandable)
{this.treeOutline=null;this.parent=null;this.previousSibling=null;this.nextSibling=null;this._listItemNode=createElement("li");this._listItemNode.treeElement=this;if(title)
this.title=title;this._listItemNode.addEventListener("mousedown",this._handleMouseDown.bind(this),false);this._listItemNode.addEventListener("selectstart",this._treeElementSelectStart.bind(this),false);this._listItemNode.addEventListener("click",this._treeElementToggled.bind(this),false);this._listItemNode.addEventListener("dblclick",this._handleDoubleClick.bind(this),false);this._childrenListNode=createElement("ol");this._childrenListNode.parentTreeElement=this;this._childrenListNode.classList.add("children");this._hidden=false;this._selectable=true;this.expanded=false;this.selected=false;this.setExpandable(expandable||false);this._collapsible=true;}
TreeElement._ArrowToggleWidth=10;TreeElement.prototype={hasAncestor:function(ancestor)
{if(!ancestor)
return false;var currentNode=this.parent;while(currentNode){if(ancestor===currentNode)
return true;currentNode=currentNode.parent;}
return false;},hasAncestorOrSelf:function(ancestor)
{return this===ancestor||this.hasAncestor(ancestor);},children:function()
{return this._children||[];},childCount:function()
{return this._children?this._children.length:0;},firstChild:function()
{return this._children?this._children[0]:null;},lastChild:function()
{return this._children?this._children[this._children.length-1]:null;},childAt:function(index)
{return this._children?this._children[index]:null;},indexOfChild:function(child)
{return this._children?this._children.indexOf(child):-1;},appendChild:function(child)
{if(!this._children)
this._children=[];var insertionIndex;if(this.treeOutline&&this.treeOutline._comparator)
insertionIndex=insertionIndexForObjectInListSortedByFunction(child,this._children,this.treeOutline._comparator);else
insertionIndex=this._children.length;this.insertChild(child,insertionIndex);},insertChild:function(child,index)
{if(!this._children)
this._children=[];if(!child)
throw("child can't be undefined or null");console.assert(!child.parent,"Attempting to insert a child that is already in the tree, reparenting is not supported.");var previousChild=(index>0?this._children[index-1]:null);if(previousChild){previousChild.nextSibling=child;child.previousSibling=previousChild;}else{child.previousSibling=null;}
var nextChild=this._children[index];if(nextChild){nextChild.previousSibling=child;child.nextSibling=nextChild;}else{child.nextSibling=null;}
this._children.splice(index,0,child);this.setExpandable(true);child.parent=this;if(this.treeOutline)
this.treeOutline._bindTreeElement(child);for(var current=child.firstChild();this.treeOutline&&current;current=current.traverseNextTreeElement(false,child,true))
this.treeOutline._bindTreeElement(current);child.onattach();child._ensureSelection();if(this.treeOutline)
this.treeOutline.dispatchEventToListeners(TreeOutline.Events.ElementAttached,child);var nextSibling=child.nextSibling?child.nextSibling._listItemNode:null;this._childrenListNode.insertBefore(child._listItemNode,nextSibling);this._childrenListNode.insertBefore(child._childrenListNode,nextSibling);if(child.selected)
child.select();if(child.expanded)
child.expand();},removeChildAtIndex:function(childIndex)
{if(childIndex<0||childIndex>=this._children.length)
throw("childIndex out of range");var child=this._children[childIndex];this._children.splice(childIndex,1);var parent=child.parent;if(this.treeOutline&&this.treeOutline.selectedTreeElement&&this.treeOutline.selectedTreeElement.hasAncestorOrSelf(child)){if(child.nextSibling)
child.nextSibling.select(true);else if(child.previousSibling)
child.previousSibling.select(true);else if(parent)
parent.select(true);}
if(child.previousSibling)
child.previousSibling.nextSibling=child.nextSibling;if(child.nextSibling)
child.nextSibling.previousSibling=child.previousSibling;child.parent=null;if(this.treeOutline)
this.treeOutline._unbindTreeElement(child);for(var current=child.firstChild();this.treeOutline&&current;current=current.traverseNextTreeElement(false,child,true))
this.treeOutline._unbindTreeElement(current);child._detach();},removeChild:function(child)
{if(!child)
throw("child can't be undefined or null");if(child.parent!==this)
return;var childIndex=this._children.indexOf(child);if(childIndex===-1)
throw("child not found in this node's children");this.removeChildAtIndex(childIndex);},removeChildren:function()
{if(!this.root&&this.treeOutline&&this.treeOutline.selectedTreeElement&&this.treeOutline.selectedTreeElement.hasAncestorOrSelf(this))
this.select(true);for(var i=0;this._children&&i<this._children.length;++i){var child=this._children[i];child.previousSibling=null
child.nextSibling=null;child.parent=null;if(this.treeOutline)
this.treeOutline._unbindTreeElement(child);for(var current=child.firstChild();this.treeOutline&&current;current=current.traverseNextTreeElement(false,child,true))
this.treeOutline._unbindTreeElement(current);child._detach();}
this._children=[];},get selectable()
{if(this._hidden)
return false;return this._selectable;},set selectable(x)
{this._selectable=x;},get listItemElement()
{return this._listItemNode;},get childrenListElement()
{return this._childrenListNode;},get title()
{return this._title;},set title(x)
{if(this._title===x)
return;this._title=x;if(typeof x==="string"){this._titleElement=createElementWithClass("span","tree-element-title");this._titleElement.textContent=x;this.tooltip=x;}else{this._titleElement=x;this.tooltip="";}
this._listItemNode.removeChildren();if(this._iconElement)
this._listItemNode.appendChild(this._iconElement);this._listItemNode.appendChild(this._titleElement);this._ensureSelection();},startEditingTitle:function(editingConfig)
{WebInspector.InplaceEditor.startEditing(this._titleElement,editingConfig);this.treeOutline._shadowRoot.getSelection().setBaseAndExtent(this._titleElement,0,this._titleElement,1);},createIcon()
{if(!this._iconElement){this._iconElement=createElementWithClass("div","icon");this._listItemNode.insertBefore(this._iconElement,this._listItemNode.firstChild);this._ensureSelection();}},get tooltip()
{return this._tooltip||"";},set tooltip(x)
{if(this._tooltip===x)
return;this._tooltip=x;this._listItemNode.title=x;},isExpandable:function()
{return this._expandable;},setExpandable:function(expandable)
{if(this._expandable===expandable)
return;this._expandable=expandable;this._listItemNode.classList.toggle("parent",expandable);if(!expandable)
this.collapse();},setCollapsible:function(collapsible)
{if(this._collapsible===collapsible)
return;this._collapsible=collapsible;this._listItemNode.classList.toggle("always-parent",!collapsible);if(!collapsible)
this.expand();},get hidden()
{return this._hidden;},set hidden(x)
{if(this._hidden===x)
return;this._hidden=x;this._listItemNode.classList.toggle("hidden",x);this._childrenListNode.classList.toggle("hidden",x);},invalidateChildren:function()
{if(this._children){this.removeChildren();this._children=null;}},_ensureSelection:function()
{if(!this.treeOutline||!this.treeOutline._renderSelection)
return;if(!this._selectionElement)
this._selectionElement=createElementWithClass("div","selection fill");this._listItemNode.insertBefore(this._selectionElement,this.listItemElement.firstChild);},_treeElementSelectStart:function(event)
{event.currentTarget._selectionStarted=true;},_treeElementToggled:function(event)
{var element=event.currentTarget;if(element._selectionStarted){delete element._selectionStarted;var selection=element.getComponentSelection();if(selection&&!selection.isCollapsed&&element.isSelfOrAncestor(selection.anchorNode)&&element.isSelfOrAncestor(selection.focusNode))
return;}
if(element.treeElement!==this)
return;var toggleOnClick=this.toggleOnClick&&!this.selectable;var isInTriangle=this.isEventWithinDisclosureTriangle(event);if(!toggleOnClick&&!isInTriangle)
return;if(event.target&&event.target.enclosingNodeOrSelfWithNodeName("a"))
return;if(this.expanded){if(event.altKey)
this.collapseRecursively();else
this.collapse();}else{if(event.altKey)
this.expandRecursively();else
this.expand();}
event.consume();},_handleMouseDown:function(event)
{var element=event.currentTarget;if(!element)
return;delete element._selectionStarted;if(!this.selectable)
return;if(element.treeElement!==this)
return;if(this.isEventWithinDisclosureTriangle(event))
return;this.selectOnMouseDown(event);},_handleDoubleClick:function(event)
{var element=event.currentTarget;if(!element||element.treeElement!==this)
return;var handled=this.ondblclick(event);if(handled)
return;if(this._expandable&&!this.expanded)
this.expand();},_detach:function()
{this._listItemNode.remove();this._childrenListNode.remove();},collapse:function()
{if(!this.expanded||!this._collapsible)
return;this._listItemNode.classList.remove("expanded");this._childrenListNode.classList.remove("expanded");this.expanded=false;this.oncollapse();if(this.treeOutline)
this.treeOutline.dispatchEventToListeners(TreeOutline.Events.ElementCollapsed,this);},collapseRecursively:function()
{var item=this;while(item){if(item.expanded)
item.collapse();item=item.traverseNextTreeElement(false,this,true);}},expand:function()
{if(!this._expandable||(this.expanded&&this._children))
return;this.expanded=true;this._populateIfNeeded();this._listItemNode.classList.add("expanded");this._childrenListNode.classList.add("expanded");if(this.treeOutline){this.onexpand();this.treeOutline.dispatchEventToListeners(TreeOutline.Events.ElementExpanded,this);}},expandRecursively:function(maxDepth)
{var item=this;var info={};var depth=0;if(isNaN(maxDepth))
maxDepth=3;while(item){if(depth<maxDepth)
item.expand();item=item.traverseNextTreeElement(false,this,(depth>=maxDepth),info);depth+=info.depthChange;}},reveal:function(center)
{var currentAncestor=this.parent;while(currentAncestor&&!currentAncestor.root){if(!currentAncestor.expanded)
currentAncestor.expand();currentAncestor=currentAncestor.parent;}
this.treeOutline._deferredScrollIntoView(this,!!center);},revealed:function()
{var currentAncestor=this.parent;while(currentAncestor&&!currentAncestor.root){if(!currentAncestor.expanded)
return false;currentAncestor=currentAncestor.parent;}
return true;},selectOnMouseDown:function(event)
{if(this.select(false,true))
event.consume(true);},select:function(omitFocus,selectedByUser)
{if(!this.treeOutline||!this.selectable||this.selected)
return false;if(this.treeOutline.selectedTreeElement)
this.treeOutline.selectedTreeElement.deselect();this.treeOutline.selectedTreeElement=null;if(this.treeOutline._rootElement===this)
return false;this.selected=true;if(!omitFocus)
this.treeOutline.focus();if(!this.treeOutline)
return false;this.treeOutline.selectedTreeElement=this;this._listItemNode.classList.add("selected");this.treeOutline.dispatchEventToListeners(TreeOutline.Events.ElementSelected,this);return this.onselect(selectedByUser);},revealAndSelect:function(omitFocus)
{this.reveal(true);this.select(omitFocus);},deselect:function(supressOnDeselect)
{if(!this.treeOutline||this.treeOutline.selectedTreeElement!==this||!this.selected)
return;this.selected=false;this.treeOutline.selectedTreeElement=null;this._listItemNode.classList.remove("selected");},_populateIfNeeded:function()
{if(this.treeOutline&&this._expandable&&!this._children){this._children=[];this.onpopulate();}},onpopulate:function()
{},onenter:function()
{return false;},ondelete:function()
{return false;},onspace:function()
{return false;},onbind:function()
{},onunbind:function()
{},onattach:function()
{},onexpand:function()
{},oncollapse:function()
{},ondblclick:function(e)
{return false;},onselect:function(selectedByUser)
{return false;},traverseNextTreeElement:function(skipUnrevealed,stayWithin,dontPopulate,info)
{if(!dontPopulate)
this._populateIfNeeded();if(info)
info.depthChange=0;var element=skipUnrevealed?(this.revealed()?this.firstChild():null):this.firstChild();if(element&&(!skipUnrevealed||(skipUnrevealed&&this.expanded))){if(info)
info.depthChange=1;return element;}
if(this===stayWithin)
return null;element=skipUnrevealed?(this.revealed()?this.nextSibling:null):this.nextSibling;if(element)
return element;element=this;while(element&&!element.root&&!(skipUnrevealed?(element.revealed()?element.nextSibling:null):element.nextSibling)&&element.parent!==stayWithin){if(info)
info.depthChange-=1;element=element.parent;}
if(!element||element.root)
return null;return(skipUnrevealed?(element.revealed()?element.nextSibling:null):element.nextSibling);},traversePreviousTreeElement:function(skipUnrevealed,dontPopulate)
{var element=skipUnrevealed?(this.revealed()?this.previousSibling:null):this.previousSibling;if(!dontPopulate&&element)
element._populateIfNeeded();while(element&&(skipUnrevealed?(element.revealed()&&element.expanded?element.lastChild():null):element.lastChild())){if(!dontPopulate)
element._populateIfNeeded();element=(skipUnrevealed?(element.revealed()&&element.expanded?element.lastChild():null):element.lastChild());}
if(element)
return element;if(!this.parent||this.parent.root)
return null;return this.parent;},isEventWithinDisclosureTriangle:function(event)
{var paddingLeftValue=window.getComputedStyle(this._listItemNode).paddingLeft;console.assert(paddingLeftValue.endsWith("px"));var computedLeftPadding=parseFloat(paddingLeftValue);var left=this._listItemNode.totalOffsetLeft()+computedLeftPadding;return event.pageX>=left&&event.pageX<=left+TreeElement._ArrowToggleWidth&&this._expandable;}};WebInspector.ActionRegistry=function()
{this._actionsById=new Map();this._registerActions();}
WebInspector.ActionRegistry.prototype={_registerActions:function()
{self.runtime.extensions(WebInspector.ActionDelegate).forEach(registerExtension,this);function registerExtension(extension)
{var actionId=extension.descriptor()["actionId"];console.assert(actionId);console.assert(!this._actionsById.get(actionId));this._actionsById.set(actionId,new WebInspector.Action(extension));}},applicableActions:function(actionIds,context)
{var extensions=[];actionIds.forEach(function(actionId){var action=this._actionsById.get(actionId);if(action)
extensions.push(action._extension);},this);return context.applicableExtensions(extensions).valuesArray().map(extensionToAction.bind(this));function extensionToAction(extension)
{return this.action(extension.descriptor()["actionId"]);}},action:function(actionId)
{var action=this._actionsById.get(actionId);console.assert(action,"No action found for actionId '"+actionId+"'");return(action);}}
WebInspector.Action=function(extension)
{WebInspector.Object.call(this);this._extension=extension;this._enabled=true;this._toggled=false;this._title=this._extension.descriptor()["title"]||"";this._statesCount=this._extension.descriptor()["states"]||2;if(this._statesCount==2)
this._state=WebInspector.Action._ToggleState.Off;else
this._state="0";}
WebInspector.Action._ToggleState={On:"on",Off:"off"}
WebInspector.Action.Events={Enabled:"Enabled",StateChanged:"StateChanged",TitleChanged:"TitleChanged",}
WebInspector.Action.prototype={statesCount:function()
{return this._statesCount;},id:function()
{return this._extension.descriptor()["actionId"];},execute:function()
{return this._extension.instancePromise().then(handleAction.bind(this));function handleAction(actionDelegate)
{var actionId=this._extension.descriptor()["actionId"];var delegate=(actionDelegate);return delegate.handleAction(WebInspector.context,actionId);}},icon:function()
{return this._extension.descriptor()["iconClass"]||"";},setEnabled:function(enabled)
{if(this._enabled===enabled)
return;this._enabled=enabled;this.dispatchEventToListeners(WebInspector.Action.Events.Enabled,enabled);},enabled:function()
{return this._enabled;},setTitle:function(title)
{if(this._title===title)
return;this._title=title;this.dispatchEventToListeners(WebInspector.Action.Events.TitleChanged,this._title);},title:function()
{return this._title;},state:function()
{return this._state;},setState:function(newState)
{if(this._state===newState)
return;var oldState=this._state;this._state=newState;this.dispatchEventToListeners(WebInspector.Action.Events.StateChanged,{oldState:oldState,newState:newState})},toggled:function()
{if(this._statesCount!==2)
throw("Only used toggled when there are 2 states, otherwise, use state");return this.state()===WebInspector.Action._ToggleState.On;},setToggled:function(toggled)
{if(this._statesCount!==2)
throw("Only used toggled when there are 2 states, otherwise, use state");this.setState(toggled?WebInspector.Action._ToggleState.On:WebInspector.Action._ToggleState.Off);},__proto__:WebInspector.Object.prototype}
WebInspector.ActionDelegate=function()
{}
WebInspector.ActionDelegate.prototype={handleAction:function(context,actionId){}}
WebInspector.actionRegistry;;WebInspector.ShortcutRegistry=function(actionRegistry,document)
{this._actionRegistry=actionRegistry;this._defaultKeyToActions=new Multimap();this._defaultActionToShortcut=new Multimap();this._registerBindings(document);}
WebInspector.ShortcutRegistry.prototype={_applicableActions:function(key)
{return this._actionRegistry.applicableActions(this._defaultActionsForKey(key).valuesArray(),WebInspector.context);},_defaultActionsForKey:function(key)
{return this._defaultKeyToActions.get(String(key));},shortcutDescriptorsForAction:function(actionId)
{return this._defaultActionToShortcut.get(actionId).valuesArray();},keysForActions:function(actionIds)
{var result=[];for(var i=0;i<actionIds.length;++i){var descriptors=this.shortcutDescriptorsForAction(actionIds[i]);for(var j=0;j<descriptors.length;++j)
result.push(descriptors[j].key);}
return result;},shortcutTitleForAction:function(actionId)
{var descriptors=this.shortcutDescriptorsForAction(actionId);if(descriptors.length)
return descriptors[0].name;},handleShortcut:function(event)
{this.handleKey(WebInspector.KeyboardShortcut.makeKeyFromEvent(event),event.keyIdentifier,event);},handleKey:function(key,keyIdentifier,event)
{var keyModifiers=key>>8;var actions=this._applicableActions(key);if(!actions.length)
return;if(WebInspector.GlassPane.DefaultFocusedViewStack.length>1){if(event&&!isPossiblyInputKey())
event.consume(true);return;}
if(!isPossiblyInputKey()){if(event)
event.consume(true);processNextAction.call(this,false);}else{this._pendingActionTimer=setTimeout(processNextAction.bind(this,false),0);}
function processNextAction(handled)
{delete this._pendingActionTimer;var action=actions.shift();if(!action||handled)
return;action.execute().then(processNextAction.bind(this));}
function isPossiblyInputKey()
{if(!event||!WebInspector.isEditing()||/^F\d+|Control|Shift|Alt|Meta|Win|U\+001B$/.test(keyIdentifier))
return false;if(!keyModifiers)
return true;var modifiers=WebInspector.KeyboardShortcut.Modifiers;if((keyModifiers&(modifiers.Ctrl|modifiers.Alt))===(modifiers.Ctrl|modifiers.Alt))
return WebInspector.isWin();return!hasModifier(modifiers.Ctrl)&&!hasModifier(modifiers.Alt)&&!hasModifier(modifiers.Meta);}
function hasModifier(mod)
{return!!(keyModifiers&mod);}},registerShortcut:function(actionId,shortcut)
{var descriptor=WebInspector.KeyboardShortcut.makeDescriptorFromBindingShortcut(shortcut);if(!descriptor)
return;this._defaultActionToShortcut.set(actionId,descriptor);this._defaultKeyToActions.set(String(descriptor.key),actionId);},dismissPendingShortcutAction:function()
{if(this._pendingActionTimer){clearTimeout(this._pendingActionTimer);delete this._pendingActionTimer;}},_registerBindings:function(document)
{document.addEventListener("input",this.dismissPendingShortcutAction.bind(this),true);var extensions=self.runtime.extensions(WebInspector.ActionDelegate);extensions.forEach(registerExtension,this);function registerExtension(extension)
{var descriptor=extension.descriptor();var bindings=descriptor["bindings"];for(var i=0;bindings&&i<bindings.length;++i){if(!platformMatches(bindings[i].platform))
continue;var shortcuts=bindings[i]["shortcut"].split(/\s+/);shortcuts.forEach(this.registerShortcut.bind(this,descriptor["actionId"]));}}
function platformMatches(platformsString)
{if(!platformsString)
return true;var platforms=platformsString.split(",");var isMatch=false;var currentPlatform=WebInspector.platform();for(var i=0;!isMatch&&i<platforms.length;++i)
isMatch=platforms[i]===currentPlatform;return isMatch;}}}
WebInspector.ShortcutRegistry.ForwardedShortcut=function()
{}
WebInspector.ShortcutRegistry.ForwardedShortcut.instance=new WebInspector.ShortcutRegistry.ForwardedShortcut();WebInspector.shortcutRegistry;;WebInspector.ColorSwatch=function()
{}
WebInspector.ColorSwatch.create=function()
{if(!WebInspector.ColorSwatch._constructor)
WebInspector.ColorSwatch._constructor=registerCustomElement("span","color-swatch",WebInspector.ColorSwatch.prototype);return(new WebInspector.ColorSwatch._constructor());}
WebInspector.ColorSwatch.prototype={color:function()
{return this._color;},setColorText:function(colorText)
{this._color=WebInspector.Color.parse(colorText);console.assert(this._color,"Color text could not be parsed.");this._format=this._color.format();this._colorValueElement.textContent=this._color.asString(this._format);this._swatchInner.style.backgroundColor=colorText;},format:function()
{return this._format;},setFormat:function(format)
{this._format=format;this._colorValueElement.textContent=this._color.asString(this._format);},toggleNextFormat:function()
{do{this._format=WebInspector.ColorSwatch._nextColorFormat(this._color,this._format);var currentValue=this._color.asString(this._format);}while(currentValue===this._colorValueElement.textContent);this._colorValueElement.textContent=currentValue;},iconElement:function()
{return this._iconElement;},createdCallback:function()
{var root=WebInspector.createShadowRootWithCoreStyles(this,"ui/colorSwatch.css");this._iconElement=root.createChild("span","color-swatch");this._iconElement.title=WebInspector.UIString("Shift-click to change color format");this._swatchInner=this._iconElement.createChild("span","color-swatch-inner");this._swatchInner.addEventListener("dblclick",consumeEvent,false);this._swatchInner.addEventListener("mousedown",consumeEvent,false);this._swatchInner.addEventListener("click",this._handleClick.bind(this),true);root.createChild("content");this._colorValueElement=this.createChild("span");this.setColorText("white");},_handleClick:function(event)
{if(!event.shiftKey)
return;event.target.parentNode.parentNode.host.toggleNextFormat();event.consume(true);},__proto__:HTMLSpanElement.prototype}
WebInspector.ColorSwatch._nextColorFormat=function(color,curFormat)
{var cf=WebInspector.Color.Format;switch(curFormat){case cf.Original:return!color.hasAlpha()?cf.RGB:cf.RGBA;case cf.RGB:case cf.RGBA:return!color.hasAlpha()?cf.HSL:cf.HSLA;case cf.HSL:case cf.HSLA:if(color.nickname())
return cf.Nickname;if(!color.hasAlpha())
return color.canBeShortHex()?cf.ShortHEX:cf.HEX;else
return cf.Original;case cf.ShortHEX:return cf.HEX;case cf.HEX:return cf.Original;case cf.Nickname:if(!color.hasAlpha())
return color.canBeShortHex()?cf.ShortHEX:cf.HEX;else
return cf.Original;default:return cf.RGBA;}};WebInspector.Context=function()
{this._flavors=new Map();this._eventDispatchers=new Map();}
WebInspector.Context.Events={FlavorChanged:"FlavorChanged"}
WebInspector.Context.prototype={setFlavor:function(flavorType,flavorValue)
{var value=this._flavors.get(flavorType)||null;if(value===flavorValue)
return;if(flavorValue)
this._flavors.set(flavorType,flavorValue);else
this._flavors.remove(flavorType);this._dispatchFlavorChange(flavorType,flavorValue);},_dispatchFlavorChange:function(flavorType,flavorValue)
{var dispatcher=this._eventDispatchers.get(flavorType);if(!dispatcher)
return;dispatcher.dispatchEventToListeners(WebInspector.Context.Events.FlavorChanged,flavorValue);},addFlavorChangeListener:function(flavorType,listener,thisObject)
{var dispatcher=this._eventDispatchers.get(flavorType);if(!dispatcher){dispatcher=new WebInspector.Object();this._eventDispatchers.set(flavorType,dispatcher);}
dispatcher.addEventListener(WebInspector.Context.Events.FlavorChanged,listener,thisObject);},removeFlavorChangeListener:function(flavorType,listener,thisObject)
{var dispatcher=this._eventDispatchers.get(flavorType);if(!dispatcher)
return;dispatcher.removeEventListener(WebInspector.Context.Events.FlavorChanged,listener,thisObject);if(!dispatcher.hasEventListeners(WebInspector.Context.Events.FlavorChanged))
this._eventDispatchers.remove(flavorType);},flavor:function(flavorType)
{return this._flavors.get(flavorType)||null;},flavors:function()
{return new Set(this._flavors.keys());},applicableExtensions:function(extensions)
{var targetExtensionSet=new Set();var availableFlavors=this.flavors();extensions.forEach(function(extension){if(self.runtime.isExtensionApplicableToContextTypes(extension,availableFlavors))
targetExtensionSet.add(extension);});return targetExtensionSet;}}
WebInspector.context=new WebInspector.Context();;WebInspector.ContextMenuItem=function(topLevelMenu,type,label,disabled,checked)
{this._type=type;this._label=label;this._disabled=disabled;this._checked=checked;this._contextMenu=topLevelMenu;if(type==="item"||type==="checkbox")
this._id=topLevelMenu._nextId();}
WebInspector.ContextMenuItem.prototype={id:function()
{return this._id;},type:function()
{return this._type;},isEnabled:function()
{return!this._disabled;},setEnabled:function(enabled)
{this._disabled=!enabled;},_buildDescriptor:function()
{switch(this._type){case"item":var result={type:"item",id:this._id,label:this._label,enabled:!this._disabled};if(this._customElement)
result.element=this._customElement;if(this._shortcut)
result.shortcut=this._shortcut;return result;case"separator":return{type:"separator"};case"checkbox":return{type:"checkbox",id:this._id,label:this._label,checked:!!this._checked,enabled:!this._disabled};}
throw new Error("Invalid item type:"+this._type);},setShortcut:function(shortcut)
{this._shortcut=shortcut;}}
WebInspector.ContextSubMenuItem=function(topLevelMenu,label,disabled)
{WebInspector.ContextMenuItem.call(this,topLevelMenu,"subMenu",label,disabled);this._items=[];}
WebInspector.ContextSubMenuItem.prototype={appendItem:function(label,handler,disabled)
{var item=new WebInspector.ContextMenuItem(this._contextMenu,"item",label,disabled);this._pushItem(item);this._contextMenu._setHandler(item.id(),handler);return item;},appendCustomItem:function(element)
{var item=new WebInspector.ContextMenuItem(this._contextMenu,"item","<custom>");item._customElement=element;this._pushItem(item);return item;},appendAction:function(actionId,label)
{var action=WebInspector.actionRegistry.action(actionId);if(!label)
label=action.title();var result=this.appendItem(label,action.execute.bind(action));var shortcut=WebInspector.shortcutRegistry.shortcutTitleForAction(actionId);if(shortcut)
result.setShortcut(shortcut);return result;},appendSubMenuItem:function(label,disabled)
{var item=new WebInspector.ContextSubMenuItem(this._contextMenu,label,disabled);this._pushItem(item);return item;},appendCheckboxItem:function(label,handler,checked,disabled)
{var item=new WebInspector.ContextMenuItem(this._contextMenu,"checkbox",label,disabled,checked);this._pushItem(item);this._contextMenu._setHandler(item.id(),handler);return item;},appendSeparator:function()
{if(this._items.length)
this._pendingSeparator=true;},_pushItem:function(item)
{if(this._pendingSeparator){this._items.push(new WebInspector.ContextMenuItem(this._contextMenu,"separator"));delete this._pendingSeparator;}
this._items.push(item);},isEmpty:function()
{return!this._items.length;},_buildDescriptor:function()
{var result={type:"subMenu",label:this._label,enabled:!this._disabled,subItems:[]};for(var i=0;i<this._items.length;++i)
result.subItems.push(this._items[i]._buildDescriptor());return result;},appendItemsAtLocation:function(location)
{function appendExtension(menu,extension)
{var subMenuId=extension.descriptor()["subMenuId"];if(subMenuId){var subMenuItem=menu.appendSubMenuItem(extension.title(WebInspector.platform()));subMenuItem.appendItemsAtLocation(subMenuId);}else{menu.appendAction(extension.descriptor()["actionId"]);}}
var groupWeights=["new","open","clipboard","navigate","footer"];var groups=new Map();var extensions=self.runtime.extensions("context-menu-item");for(var extension of extensions){var itemLocation=extension.descriptor()["location"]||"";if(!itemLocation.startsWith(location+"/"))
continue;var itemGroup=itemLocation.substr(location.length+1);if(!itemGroup||itemGroup.includes("/"))
continue;var group=groups.get(itemGroup);if(!group){group=[];groups.set(itemGroup,group);if(groupWeights.indexOf(itemGroup)===-1)
groupWeights.splice(4,0,itemGroup);}
group.push(extension);}
for(var groupName of groupWeights){var group=groups.get(groupName);if(!group)
continue;group.forEach(appendExtension.bind(null,this));this.appendSeparator();}},__proto__:WebInspector.ContextMenuItem.prototype}
WebInspector.ContextMenu=function(event,useSoftMenu,x,y)
{WebInspector.ContextSubMenuItem.call(this,this,"");this._pendingPromises=[];this._pendingTargets=[];this._event=event;this._useSoftMenu=!!useSoftMenu;this._x=x===undefined?event.x:x;this._y=y===undefined?event.y:y;this._handlers={};this._id=0;}
WebInspector.ContextMenu.initialize=function()
{InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.SetUseSoftMenu,setUseSoftMenu);function setUseSoftMenu(event)
{WebInspector.ContextMenu._useSoftMenu=(event.data);}}
WebInspector.ContextMenu.installHandler=function(doc)
{doc.body.addEventListener("contextmenu",handler,false);function handler(event)
{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendApplicableItems((event.deepElementFromPoint()));contextMenu.show();}}
WebInspector.ContextMenu.prototype={_nextId:function()
{return this._id++;},show:function()
{Promise.all(this._pendingPromises).then(populateAndShow.bind(this));WebInspector.ContextMenu._pendingMenu=this;function populateAndShow(appendCallResults)
{if(WebInspector.ContextMenu._pendingMenu!==this)
return;delete WebInspector.ContextMenu._pendingMenu;for(var i=0;i<appendCallResults.length;++i){var providers=appendCallResults[i];var target=this._pendingTargets[i];for(var j=0;j<providers.length;++j){var provider=(providers[j]);this.appendSeparator();provider.appendApplicableItems(this._event,this,target);this.appendSeparator();}}
this._pendingPromises=[];this._pendingTargets=[];this._innerShow();}
this._event.consume(true);},discard:function()
{if(this._softMenu)
this._softMenu.discard();},_innerShow:function()
{var menuObject=this._buildDescriptors();WebInspector._contextMenu=this;if(this._useSoftMenu||WebInspector.ContextMenu._useSoftMenu||InspectorFrontendHost.isHostedMode()){this._softMenu=new WebInspector.SoftContextMenu(menuObject,this._itemSelected.bind(this));this._softMenu.show(this._event.target.ownerDocument,this._x,this._y);}else{InspectorFrontendHost.showContextMenuAtPoint(this._x,this._y,menuObject,this._event.target.ownerDocument);function listenToEvents()
{InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.ContextMenuCleared,this._menuCleared,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.ContextMenuItemSelected,this._onItemSelected,this);}
setImmediate(listenToEvents.bind(this));}},_setHandler:function(id,handler)
{if(handler)
this._handlers[id]=handler;},_buildDescriptors:function()
{var result=[];for(var i=0;i<this._items.length;++i)
result.push(this._items[i]._buildDescriptor());return result;},_onItemSelected:function(event)
{this._itemSelected((event.data));},_itemSelected:function(id)
{if(this._handlers[id])
this._handlers[id].call(this);this._menuCleared();},_menuCleared:function()
{InspectorFrontendHost.events.removeEventListener(InspectorFrontendHostAPI.Events.ContextMenuCleared,this._menuCleared,this);InspectorFrontendHost.events.removeEventListener(InspectorFrontendHostAPI.Events.ContextMenuItemSelected,this._onItemSelected,this);},appendApplicableItems:function(target)
{this._pendingPromises.push(self.runtime.instancesPromise(WebInspector.ContextMenu.Provider,target));this._pendingTargets.push(target);},__proto__:WebInspector.ContextSubMenuItem.prototype}
WebInspector.ContextMenu.Provider=function(){}
WebInspector.ContextMenu.Provider.prototype={appendApplicableItems:function(event,contextMenu,target){}};WebInspector.Dialog=function()
{WebInspector.Widget.call(this,true);this.markAsRoot();this.registerRequiredCSS("ui/dialog.css");this.contentElement.createChild("content");this.contentElement.tabIndex=0;this.contentElement.addEventListener("focus",this._onFocus.bind(this),false);this.contentElement.addEventListener("keydown",this._onKeyDown.bind(this),false);this._wrapsContent=false;this._dimmed=false;this._tabIndexMap=new Map();}
WebInspector.Dialog.hasInstance=function()
{return!!WebInspector.Dialog._instance;}
WebInspector.Dialog.prototype={show:function()
{if(WebInspector.Dialog._instance)
WebInspector.Dialog._instance.detach();WebInspector.Dialog._instance=this;var document=(WebInspector.Dialog._modalHostView.element.ownerDocument);this._disableTabIndexOnElements(document);this._glassPane=new WebInspector.GlassPane(document,this._dimmed);this._glassPane.element.addEventListener("click",this._onGlassPaneClick.bind(this),false);WebInspector.GlassPane.DefaultFocusedViewStack.push(this);WebInspector.Widget.prototype.show.call(this,this._glassPane.element);this._position();this.focus();},detach:function()
{WebInspector.Widget.prototype.detach.call(this);WebInspector.GlassPane.DefaultFocusedViewStack.pop();this._glassPane.dispose();delete this._glassPane;this._restoreTabIndexOnElements();delete WebInspector.Dialog._instance;},addCloseButton:function()
{var closeButton=this.contentElement.createChild("div","dialog-close-button","dt-close-button");closeButton.gray=true;closeButton.addEventListener("click",this.detach.bind(this,false),false);},setMaxSize:function(size)
{this._maxSize=size;},setWrapsContent:function(wraps)
{this.element.classList.toggle("wraps-content",wraps);this._wrapsContent=wraps;},setDimmed:function(dimmed)
{this._dimmed=dimmed;},contentResized:function()
{if(this._wrapsContent)
this._position();},_disableTabIndexOnElements:function(document)
{this._tabIndexMap.clear();for(var node=document;node;node=node.traverseNextNode(document)){if(node instanceof HTMLElement){var element=(node);var tabIndex=element.tabIndex;if(tabIndex>=0){this._tabIndexMap.set(element,tabIndex);element.tabIndex=-1;}}}},_restoreTabIndexOnElements:function()
{for(var element of this._tabIndexMap.keys())
element.tabIndex=this._tabIndexMap.get(element);this._tabIndexMap.clear();},_onFocus:function(event)
{this.focus();},_onGlassPaneClick:function(event)
{if(!this.element.isSelfOrAncestor((event.target)))
this.detach();},_position:function()
{var container=WebInspector.Dialog._modalHostView.element;var width=container.offsetWidth-10;var height=container.offsetHeight-10;if(this._wrapsContent){width=Math.min(width,this.contentElement.offsetWidth);height=Math.min(height,this.contentElement.offsetHeight);}
if(this._maxSize){width=Math.min(width,this._maxSize.width);height=Math.min(height,this._maxSize.height);}
var positionX=(container.offsetWidth-width)/2;positionX=Number.constrain(positionX,0,container.offsetWidth-width);var positionY=(container.offsetHeight-height)/2;positionY=Number.constrain(positionY,0,container.offsetHeight-height);this.element.style.width=width+"px";this.element.style.height=height+"px";this.element.positionAt(positionX,positionY,container);},_onKeyDown:function(event)
{if(event.keyCode===WebInspector.KeyboardShortcut.Keys.Esc.code){event.consume(true);this.detach();}},defaultFocusedElement:function()
{var children=this.children();if(children.length)
return children[0].defaultFocusedElement();return this.element;},__proto__:WebInspector.Widget.prototype};WebInspector.Dialog._modalHostView=null;WebInspector.Dialog.setModalHostView=function(view)
{WebInspector.Dialog._modalHostView=view;};WebInspector.Dialog.modalHostView=function()
{return WebInspector.Dialog._modalHostView;};WebInspector.Dialog.modalHostRepositioned=function()
{if(WebInspector.Dialog._instance)
WebInspector.Dialog._instance._position();};;WebInspector.DOMSyntaxHighlighter=function(mimeType,stripExtraWhitespace)
{this._mimeType=mimeType;this._stripExtraWhitespace=stripExtraWhitespace;}
WebInspector.DOMSyntaxHighlighter.prototype={createSpan:function(content,className)
{var span=createElement("span");span.className="cm-"+className;if(this._stripExtraWhitespace&&className!=="whitespace")
content=content.replace(/^[\n\r]*/,"").replace(/\s*$/,"");span.createTextChild(content);return span;},syntaxHighlightNode:function(node)
{var lines=node.textContent.split("\n");var plainTextStart;var line;return self.runtime.instancePromise(WebInspector.TokenizerFactory).then(processTokens.bind(this));function processTokens(tokenizerFactory)
{node.removeChildren();var tokenize=tokenizerFactory.createTokenizer(this._mimeType);for(var i=lines[0].length?0:1;i<lines.length;++i){line=lines[i];plainTextStart=0;tokenize(line,processToken.bind(this));if(plainTextStart<line.length){var plainText=line.substring(plainTextStart,line.length);node.createTextChild(plainText);}
if(i<lines.length-1)
node.createTextChild("\n");}}
function processToken(token,tokenType,column,newColumn)
{if(!tokenType)
return;if(column>plainTextStart){var plainText=line.substring(plainTextStart,column);node.createTextChild(plainText);}
node.appendChild(this.createSpan(token,tokenType));plainTextStart=newColumn;}}};WebInspector.DropDownMenu=function(element)
{this._items=[];element.addEventListener("mousedown",this._onMouseDown.bind(this));}
WebInspector.DropDownMenu.Item;WebInspector.DropDownMenu.Events={ItemSelected:"ItemSelected"}
WebInspector.DropDownMenu.prototype={_onMouseDown:function(event)
{if(event.which!==1)
return;var menu=new WebInspector.ContextMenu(event);for(var item of this._items)
menu.appendCheckboxItem(item.title,this._itemHandler.bind(this,item.id),item.id===this._selectedItemId);menu.show();},_itemHandler:function(id)
{this.dispatchEventToListeners(WebInspector.DropDownMenu.Events.ItemSelected,id);},addItem:function(id,title)
{this._items.push({id:id,title:title});},selectItem:function(id)
{this._selectedItemId=id;},clear:function()
{this._items=[];delete this._selectedItemId;},__proto__:WebInspector.Object.prototype};WebInspector.DropTarget=function(element,transferTypes,messageText,handleDrop)
{element.addEventListener("dragenter",this._onDragEnter.bind(this),true);element.addEventListener("dragover",this._onDragOver.bind(this),true);this._element=element;this._transferTypes=transferTypes;this._messageText=messageText;this._handleDrop=handleDrop;this._enabled=true;}
WebInspector.DropTarget.Types={Files:"Files",URIList:"text/uri-list"}
WebInspector.DropTarget.prototype={setEnabled:function(enabled)
{this._enabled=enabled;},_onDragEnter:function(event)
{if(this._enabled&&this._hasMatchingType(event))
event.consume(true);},_hasMatchingType:function(event)
{for(var type of this._transferTypes){if(event.dataTransfer.types.indexOf(type)!==-1)
return true;}
return false;},_onDragOver:function(event)
{if(!this._enabled||!this._hasMatchingType(event))
return;event.dataTransfer.dropEffect="copy";event.consume(true);if(this._dragMaskElement)
return;this._dragMaskElement=this._element.createChild("div","");var shadowRoot=WebInspector.createShadowRootWithCoreStyles(this._dragMaskElement,"ui/dropTarget.css");shadowRoot.createChild("div","drop-target-message").textContent=this._messageText;this._dragMaskElement.addEventListener("drop",this._onDrop.bind(this),true);this._dragMaskElement.addEventListener("dragleave",this._onDragLeave.bind(this),true);},_onDrop:function(event)
{event.consume(true);this._removeMask();if(this._enabled)
this._handleDrop(event.dataTransfer);},_onDragLeave:function(event)
{event.consume(true);this._removeMask();},_removeMask:function()
{this._dragMaskElement.remove();delete this._dragMaskElement;}};WebInspector.EmptyWidget=function(text)
{WebInspector.VBox.call(this);this.registerRequiredCSS("ui/emptyWidget.css");this.element.classList.add("empty-view");this.textElement=this.element.createChild("span");this._text=text;}
WebInspector.EmptyWidget.prototype={wasShown:function()
{this.textElement.textContent=this._text;},set text(text)
{this._text=text;if(this.isShowing())
this.textElement.textContent=this._text;},__proto__:WebInspector.VBox.prototype};WebInspector.FilterBar=function(name,visibleByDefault)
{WebInspector.HBox.call(this);this.registerRequiredCSS("ui/filter.css");this._filtersShown=false;this._enabled=true;this.element.classList.add("filter-bar");this._filterButton=new WebInspector.ToolbarButton(WebInspector.UIString("Filter"),"filter-toolbar-item");this._filterButton.addEventListener("click",this._handleFilterButtonClick,this);this._filters=[];this._stateSetting=WebInspector.settings.createSetting("filterBar-"+name+"-toggled",!!visibleByDefault);this._setState(this._stateSetting.get());}
WebInspector.FilterBar.FilterBarState={Inactive:"inactive",Active:"active",Shown:"on"};WebInspector.FilterBar.Events={Toggled:"Toggled"};WebInspector.FilterBar.prototype={filterButton:function()
{return this._filterButton;},addFilter:function(filter)
{this._filters.push(filter);this.element.appendChild(filter.element());filter.addEventListener(WebInspector.FilterUI.Events.FilterChanged,this._filterChanged,this);this._updateFilterButton();},setEnabled:function(enabled)
{this._enabled=enabled;this._filterButton.setEnabled(enabled);this._updateFilterBar();},forceShowFilterBar:function()
{this._alwaysShowFilters=true;this._updateFilterBar();},wasShown:function()
{this._updateFilterBar();},_filterChanged:function(event)
{this._updateFilterButton();},_filterBarState:function()
{if(this._filtersShown)
return WebInspector.FilterBar.FilterBarState.Shown;var isActive=false;for(var i=0;i<this._filters.length;++i){if(this._filters[i].isActive())
return WebInspector.FilterBar.FilterBarState.Active;}
return WebInspector.FilterBar.FilterBarState.Inactive;},_updateFilterBar:function()
{var visible=this._alwaysShowFilters||(this._filtersShown&&this._enabled);this.element.classList.toggle("hidden",!visible);if(visible){for(var i=0;i<this._filters.length;++i){if(this._filters[i]instanceof WebInspector.TextFilterUI){var textFilterUI=(this._filters[i]);textFilterUI.focus();}}}
this.invalidateSize();},_updateFilterButton:function()
{this._filterButton.setState(this._filterBarState());},_handleFilterButtonClick:function(event)
{this._setState(!this._filtersShown);},_setState:function(filtersShown)
{if(this._filtersShown===filtersShown)
return;this._filtersShown=filtersShown;if(this._stateSetting)
this._stateSetting.set(filtersShown);this._updateFilterButton();this._updateFilterBar();this.dispatchEventToListeners(WebInspector.FilterBar.Events.Toggled);},clear:function()
{this.element.removeChildren();this._filters=[];this._updateFilterButton();},__proto__:WebInspector.HBox.prototype}
WebInspector.FilterUI=function()
{}
WebInspector.FilterUI.Events={FilterChanged:"FilterChanged"}
WebInspector.FilterUI.prototype={isActive:function(){},element:function(){}}
WebInspector.TextFilterUI=function(supportRegex)
{this._supportRegex=!!supportRegex;this._regex=null;this._filterElement=createElement("div");this._filterElement.className="filter-text-filter";this._filterInputElement=(this._filterElement.createChild("input","filter-input-field"));this._filterInputElement.placeholder=WebInspector.UIString("Filter");this._filterInputElement.id="filter-input-field";this._filterInputElement.addEventListener("mousedown",this._onFilterFieldManualFocus.bind(this),false);this._filterInputElement.addEventListener("input",this._onInput.bind(this),false);this._filterInputElement.addEventListener("change",this._onChange.bind(this),false);this._filterInputElement.addEventListener("keydown",this._onInputKeyDown.bind(this),true);this._filterInputElement.addEventListener("blur",this._onBlur.bind(this),true);this._suggestionBuilder=null;this._suggestBox=new WebInspector.SuggestBox(this);if(this._supportRegex){this._filterElement.classList.add("supports-regex");var label=createCheckboxLabel(WebInspector.UIString("Regex"));this._regexCheckBox=label.checkboxElement;this._regexCheckBox.id="text-filter-regex";this._regexCheckBox.addEventListener("change",this._onInput.bind(this),false);this._filterElement.appendChild(label);this._regexLabel=this._filterElement.textElement;}}
WebInspector.TextFilterUI.prototype={isActive:function()
{return!!this._filterInputElement.value;},element:function()
{return this._filterElement;},value:function()
{return this._filterInputElement.value;},setValue:function(value)
{this._filterInputElement.value=value;this._valueChanged(false);},regex:function()
{return this._regex;},_onFilterFieldManualFocus:function(event)
{WebInspector.setCurrentFocusElement((event.target));},_onBlur:function(event)
{this._cancelSuggestion();},_cancelSuggestion:function()
{if(this._suggestionBuilder&&this._suggestBox.visible){this._suggestionBuilder.unapplySuggestion(this._filterInputElement);this._suggestBox.hide();}},_onInput:function()
{this._valueChanged(true);},_onChange:function()
{this._valueChanged(false);},focus:function()
{this._filterInputElement.focus();},setSuggestionBuilder:function(suggestionBuilder)
{this._cancelSuggestion();this._suggestionBuilder=suggestionBuilder;},_updateSuggestions:function()
{if(!this._suggestionBuilder)
return;var suggestions=this._suggestionBuilder.buildSuggestions(this._filterInputElement);if(suggestions&&suggestions.length){if(this._suppressSuggestion)
delete this._suppressSuggestion;else
this._suggestionBuilder.applySuggestion(this._filterInputElement,suggestions[0],true);var anchorBox=this._filterInputElement.boxInWindow().relativeTo(new AnchorBox(-3,0));this._suggestBox.updateSuggestions(anchorBox,suggestions,0,true,"");}else{this._suggestBox.hide();}},_valueChanged:function(showSuggestions)
{if(showSuggestions)
this._updateSuggestions();else
this._suggestBox.hide();var filterQuery=this.value();this._regex=null;this._filterInputElement.classList.remove("filter-text-invalid");if(filterQuery){if(this._supportRegex&&this._regexCheckBox.checked){try{this._regex=new RegExp(filterQuery,"i");}catch(e){this._filterInputElement.classList.add("filter-text-invalid");}}else{this._regex=createPlainTextSearchRegex(filterQuery,"i");}}
this._dispatchFilterChanged();},_dispatchFilterChanged:function()
{this.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged,null);},_onInputKeyDown:function(event)
{var handled=false;if(event.keyIdentifier==="U+0008"){this._suppressSuggestion=true;}else if(this._suggestBox.visible()){if(event.keyIdentifier==="U+001B"){this._cancelSuggestion();handled=true;}else if(event.keyIdentifier==="U+0009"){this._suggestBox.acceptSuggestion();this._valueChanged(true);handled=true;}else{handled=this._suggestBox.keyPressed((event));}}
if(handled)
event.consume(true);return handled;},applySuggestion:function(suggestion,isIntermediateSuggestion)
{if(!this._suggestionBuilder)
return;this._suggestionBuilder.applySuggestion(this._filterInputElement,suggestion,!!isIntermediateSuggestion);if(isIntermediateSuggestion)
this._dispatchFilterChanged();},acceptSuggestion:function()
{this._filterInputElement.scrollLeft=this._filterInputElement.scrollWidth;this._valueChanged(true);},__proto__:WebInspector.Object.prototype}
WebInspector.TextFilterUI.SuggestionBuilder=function()
{}
WebInspector.TextFilterUI.SuggestionBuilder.prototype={buildSuggestions:function(input){},applySuggestion:function(input,suggestion,isIntermediate){},unapplySuggestion:function(input){}}
WebInspector.NamedBitSetFilterUI=function(items,setting)
{this._filtersElement=createElementWithClass("div","filter-bitset-filter");this._filtersElement.title=WebInspector.UIString("%sClick to select multiple types",WebInspector.KeyboardShortcut.shortcutToString("",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta));this._allowedTypes={};this._typeFilterElements={};this._addBit(WebInspector.NamedBitSetFilterUI.ALL_TYPES,WebInspector.UIString("All"));this._filtersElement.createChild("div","filter-bitset-filter-divider");for(var i=0;i<items.length;++i)
this._addBit(items[i].name,items[i].label,items[i].title);if(setting){this._setting=setting;setting.addChangeListener(this._settingChanged.bind(this));this._settingChanged();}else{this._toggleTypeFilter(WebInspector.NamedBitSetFilterUI.ALL_TYPES,false);}}
WebInspector.NamedBitSetFilterUI.Item;WebInspector.NamedBitSetFilterUI.ALL_TYPES="all";WebInspector.NamedBitSetFilterUI.prototype={isActive:function()
{return!this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES];},element:function()
{return this._filtersElement;},accept:function(typeName)
{return!!this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES]||!!this._allowedTypes[typeName];},_settingChanged:function()
{var allowedTypes=this._setting.get();this._allowedTypes={};for(var typeName in this._typeFilterElements){if(allowedTypes[typeName])
this._allowedTypes[typeName]=true;}
this._update();},_update:function()
{if((Object.keys(this._allowedTypes).length===0)||this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES]){this._allowedTypes={};this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES]=true;}
for(var typeName in this._typeFilterElements)
this._typeFilterElements[typeName].classList.toggle("selected",this._allowedTypes[typeName]);this.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged,null);},_addBit:function(name,label,title)
{var typeFilterElement=this._filtersElement.createChild("li",name);typeFilterElement.typeName=name;typeFilterElement.createTextChild(label);if(title)
typeFilterElement.title=title;typeFilterElement.addEventListener("click",this._onTypeFilterClicked.bind(this),false);this._typeFilterElements[name]=typeFilterElement;},_onTypeFilterClicked:function(e)
{var toggle;if(WebInspector.isMac())
toggle=e.metaKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey;else
toggle=e.ctrlKey&&!e.metaKey&&!e.altKey&&!e.shiftKey;this._toggleTypeFilter(e.target.typeName,toggle);},_toggleTypeFilter:function(typeName,allowMultiSelect)
{if(allowMultiSelect&&typeName!==WebInspector.NamedBitSetFilterUI.ALL_TYPES)
this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES]=false;else
this._allowedTypes={};this._allowedTypes[typeName]=!this._allowedTypes[typeName];if(this._setting)
this._setting.set(this._allowedTypes);else
this._update();},__proto__:WebInspector.Object.prototype}
WebInspector.ComboBoxFilterUI=function(options)
{this._filterElement=createElement("div");this._filterElement.className="filter-combobox-filter";this._options=options;this._filterComboBox=new WebInspector.ToolbarComboBox(this._filterChanged.bind(this));for(var i=0;i<options.length;++i){var filterOption=options[i];var option=createElement("option");option.text=filterOption.label;option.title=filterOption.title;this._filterComboBox.addOption(option);this._filterComboBox.element.title=this._filterComboBox.selectedOption().title;}
this._filterElement.appendChild(this._filterComboBox.element);}
WebInspector.ComboBoxFilterUI.prototype={isActive:function()
{return this._filterComboBox.selectedIndex()!==0;},element:function()
{return this._filterElement;},value:function()
{var option=this._options[this._filterComboBox.selectedIndex()];return option.value;},setSelectedIndex:function(index)
{this._filterComboBox.setSelectedIndex(index);},selectedIndex:function(index)
{return this._filterComboBox.selectedIndex();},_filterChanged:function(event)
{var option=this._options[this._filterComboBox.selectedIndex()];this._filterComboBox.element.title=option.title;this.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged,null);},__proto__:WebInspector.Object.prototype}
WebInspector.CheckboxFilterUI=function(className,title,activeWhenChecked,setting)
{this._filterElement=createElementWithClass("div","filter-checkbox-filter");this._activeWhenChecked=!!activeWhenChecked;this._label=createCheckboxLabel(title);this._filterElement.appendChild(this._label);this._checkboxElement=this._label.checkboxElement;if(setting)
WebInspector.SettingsUI.bindCheckbox(this._checkboxElement,setting);else
this._checkboxElement.checked=true;this._checkboxElement.addEventListener("change",this._fireUpdated.bind(this),false);}
WebInspector.CheckboxFilterUI.prototype={isActive:function()
{return this._activeWhenChecked===this._checkboxElement.checked;},checked:function()
{return this._checkboxElement.checked;},element:function()
{return this._filterElement;},labelElement:function()
{return this._label;},_fireUpdated:function()
{this.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged,null);},setColor:function(backgroundColor,borderColor)
{this._label.backgroundColor=backgroundColor;this._label.borderColor=borderColor;},__proto__:WebInspector.Object.prototype};WebInspector.ForwardedInputEventHandler=function()
{InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.KeyEventUnhandled,this._onKeyEventUnhandled,this);}
WebInspector.ForwardedInputEventHandler.prototype={_onKeyEventUnhandled:function(event)
{var data=event.data;var type=(data.type);var keyIdentifier=(data.keyIdentifier);var keyCode=(data.keyCode);var modifiers=(data.modifiers);if(type!=="keydown")
return;WebInspector.context.setFlavor(WebInspector.ShortcutRegistry.ForwardedShortcut,WebInspector.ShortcutRegistry.ForwardedShortcut.instance);WebInspector.shortcutRegistry.handleKey(WebInspector.KeyboardShortcut.makeKey(keyCode,modifiers),keyIdentifier);WebInspector.context.setFlavor(WebInspector.ShortcutRegistry.ForwardedShortcut,null);}}
WebInspector.forwardedEventHandler=new WebInspector.ForwardedInputEventHandler();;WebInspector.HistoryInput=function()
{}
WebInspector.HistoryInput.create=function()
{if(!WebInspector.HistoryInput._constructor)
WebInspector.HistoryInput._constructor=registerCustomElement("input","history-input",WebInspector.HistoryInput.prototype);return(new WebInspector.HistoryInput._constructor());}
WebInspector.HistoryInput.prototype={createdCallback:function()
{this._history=[""];this._historyPosition=0;this.addEventListener("keydown",this._onKeyDown.bind(this),false);this.addEventListener("input",this._onInput.bind(this),false);},_onInput:function(event)
{if(this._history.length===this._historyPosition+1)
this._history[this._history.length-1]=this.value;},_onKeyDown:function(event)
{if(event.keyCode===WebInspector.KeyboardShortcut.Keys.Up.code){this._historyPosition=Math.max(this._historyPosition-1,0);this.value=this._history[this._historyPosition];this.dispatchEvent(createEvent("input",true,true));event.consume(true);}else if(event.keyCode===WebInspector.KeyboardShortcut.Keys.Down.code){this._historyPosition=Math.min(this._historyPosition+1,this._history.length-1);this.value=this._history[this._historyPosition];this.dispatchEvent(createEvent("input",true,true));event.consume(true);}else if(event.keyCode===WebInspector.KeyboardShortcut.Keys.Enter.code){this._saveToHistory();}},_saveToHistory:function()
{if(this._history.length>1&&this._history[this._history.length-2]===this.value)
return;this._history[this._history.length-1]=this.value;this._historyPosition=this._history.length-1;this._history.push("");},__proto__:HTMLInputElement.prototype};WebInspector.Infobar=function(type,text,disableSetting)
{this.element=createElementWithClass("div","flex-none");this._shadowRoot=WebInspector.createShadowRootWithCoreStyles(this.element,"ui/infobar.css");this._contentElement=this._shadowRoot.createChild("div","infobar infobar-"+type);this._mainRow=this._contentElement.createChild("div","infobar-main-row");this._mainRow.createChild("div",type+"-icon icon");this._mainRowText=this._mainRow.createChild("div","infobar-main-title");this._mainRowText.textContent=text;this._detailsRows=this._contentElement.createChild("div","infobar-details-rows hidden");this._toggleElement=this._mainRow.createChild("div","infobar-toggle hidden");this._toggleElement.addEventListener("click",this._onToggleDetails.bind(this),false);this._toggleElement.textContent=WebInspector.UIString("more");this._disableSetting=disableSetting||null;if(disableSetting){var disableButton=this._mainRow.createChild("div","infobar-toggle");disableButton.textContent=WebInspector.UIString("never show");disableButton.addEventListener("click",this._onDisable.bind(this),false);}
this._closeButton=this._contentElement.createChild("div","close-button","dt-close-button");this._closeButton.addEventListener("click",this.dispose.bind(this),false);this._closeCallback=null;}
WebInspector.Infobar.create=function(type,text,disableSetting)
{if(disableSetting&&disableSetting.get())
return null;return new WebInspector.Infobar(type,text,disableSetting);}
WebInspector.Infobar.Type={Warning:"warning",Info:"info"}
WebInspector.Infobar.prototype={dispose:function()
{this.element.remove();this._onResize();if(this._closeCallback)
this._closeCallback.call(null);},setText:function(text)
{this._mainRowText.textContent=text;this._onResize();},setCloseCallback:function(callback)
{this._closeCallback=callback;},setParentView:function(parentView)
{this._parentView=parentView;},_onResize:function()
{if(this._parentView)
this._parentView.doResize();},_onDisable:function()
{this._disableSetting.set(true);this.dispose();},_onToggleDetails:function()
{this._detailsRows.classList.remove("hidden");this._toggleElement.remove();this._onResize();},createDetailsRowMessage:function(message)
{this._toggleElement.classList.remove("hidden");var infobarDetailsRow=this._detailsRows.createChild("div","infobar-details-row");var detailsRowMessage=infobarDetailsRow.createChild("span","infobar-row-message");detailsRowMessage.textContent=message||"";return detailsRowMessage;}};WebInspector.InplaceEditor=function()
{}
WebInspector.InplaceEditor.Controller;WebInspector.InplaceEditor.startEditing=function(element,config)
{if(!WebInspector.InplaceEditor._defaultInstance)
WebInspector.InplaceEditor._defaultInstance=new WebInspector.InplaceEditor();return WebInspector.InplaceEditor._defaultInstance.startEditing(element,config);}
WebInspector.InplaceEditor.startMultilineEditing=function(element,config)
{return self.runtime.instancePromise(WebInspector.InplaceEditor).then(startEditing);function startEditing(inplaceEditor)
{var controller=(inplaceEditor).startEditing(element,config);if(!controller)
return Promise.reject(new Error("Editing is already in progress"));return controller;}}
WebInspector.InplaceEditor.prototype={editorContent:function(editingContext){var element=editingContext.element;if(element.tagName==="INPUT"&&element.type==="text")
return element.value;return element.textContent;},setUpEditor:function(editingContext)
{var element=editingContext.element;element.classList.add("editing");var oldTabIndex=element.getAttribute("tabIndex");if(typeof oldTabIndex!=="number"||oldTabIndex<0)
element.tabIndex=0;WebInspector.setCurrentFocusElement(element);editingContext.oldTabIndex=oldTabIndex;},closeEditor:function(editingContext)
{var element=editingContext.element;element.classList.remove("editing");if(typeof editingContext.oldTabIndex!=="number")
element.removeAttribute("tabIndex");else
element.tabIndex=editingContext.oldTabIndex;element.scrollTop=0;element.scrollLeft=0;},cancelEditing:function(editingContext)
{var element=editingContext.element;if(element.tagName==="INPUT"&&element.type==="text")
element.value=editingContext.oldText;else
element.textContent=editingContext.oldText;},augmentEditingHandle:function(editingContext,handle)
{},startEditing:function(element,config)
{if(!WebInspector.markBeingEdited(element,true))
return null;config=config||new WebInspector.InplaceEditor.Config(function(){},function(){});var editingContext={element:element,config:config};var committedCallback=config.commitHandler;var cancelledCallback=config.cancelHandler;var pasteCallback=config.pasteHandler;var context=config.context;var isMultiline=config.multiline||false;var moveDirection="";var self=this;function consumeCopy(e)
{e.consume();}
this.setUpEditor(editingContext);editingContext.oldText=isMultiline?config.initialValue:this.editorContent(editingContext);function blurEventListener(e){if(config.blurHandler&&!config.blurHandler(element,e))
return;if(!isMultiline||!e||!e.relatedTarget||!e.relatedTarget.isSelfOrDescendant(element))
editingCommitted.call(element);}
function cleanUpAfterEditing()
{WebInspector.markBeingEdited(element,false);element.removeEventListener("blur",blurEventListener,isMultiline);element.removeEventListener("keydown",keyDownEventListener,true);if(pasteCallback)
element.removeEventListener("paste",pasteEventListener,true);WebInspector.restoreFocusFromElement(element);self.closeEditor(editingContext);}
function editingCancelled()
{self.cancelEditing(editingContext);cleanUpAfterEditing();cancelledCallback(this,context);}
function editingCommitted()
{cleanUpAfterEditing();committedCallback(this,self.editorContent(editingContext),editingContext.oldText,context,moveDirection);}
function defaultFinishHandler(event)
{var isMetaOrCtrl=WebInspector.isMac()?event.metaKey&&!event.shiftKey&&!event.ctrlKey&&!event.altKey:event.ctrlKey&&!event.shiftKey&&!event.metaKey&&!event.altKey;if(isEnterKey(event)&&(event.isMetaOrCtrlForTest||!isMultiline||isMetaOrCtrl))
return"commit";else if(event.keyCode===WebInspector.KeyboardShortcut.Keys.Esc.code||event.keyIdentifier==="U+001B")
return"cancel";else if(!isMultiline&&event.keyIdentifier==="U+0009")
return"move-"+(event.shiftKey?"backward":"forward");return"";}
function handleEditingResult(result,event)
{if(result==="commit"){editingCommitted.call(element);event.consume(true);}else if(result==="cancel"){editingCancelled.call(element);event.consume(true);}else if(result&&result.startsWith("move-")){moveDirection=result.substring(5);if(event.keyIdentifier!=="U+0009")
blurEventListener();}}
function pasteEventListener(event)
{var result=pasteCallback(event);handleEditingResult(result,event);}
function keyDownEventListener(event)
{var result=defaultFinishHandler(event);if(!result&&config.postKeydownFinishHandler)
result=config.postKeydownFinishHandler(event);handleEditingResult(result,event);}
element.addEventListener("blur",blurEventListener,isMultiline);element.addEventListener("keydown",keyDownEventListener,true);if(pasteCallback)
element.addEventListener("paste",pasteEventListener,true);var handle={cancel:editingCancelled.bind(element),commit:editingCommitted.bind(element),setWidth:function(){}};this.augmentEditingHandle(editingContext,handle);return handle;}}
WebInspector.InplaceEditor.Config=function(commitHandler,cancelHandler,context,blurHandler)
{this.commitHandler=commitHandler;this.cancelHandler=cancelHandler;this.context=context;this.blurHandler=blurHandler;this.pasteHandler;this.multiline;this.postKeydownFinishHandler;}
WebInspector.InplaceEditor.Config.prototype={setPasteHandler:function(pasteHandler)
{this.pasteHandler=pasteHandler;},setMultilineOptions:function(initialValue,mode,theme,lineWrapping,smartIndent)
{this.multiline=true;this.initialValue=initialValue;this.mode=mode;this.theme=theme;this.lineWrapping=lineWrapping;this.smartIndent=smartIndent;},setPostKeydownFinishHandler:function(postKeydownFinishHandler)
{this.postKeydownFinishHandler=postKeydownFinishHandler;}};WebInspector.KeyboardShortcut=function()
{}
WebInspector.KeyboardShortcut.Modifiers={None:0,Shift:1,Ctrl:2,Alt:4,Meta:8,get CtrlOrMeta()
{return WebInspector.isMac()?this.Meta:this.Ctrl;},get ShiftOrOption()
{return WebInspector.isMac()?this.Alt:this.Shift;}};WebInspector.KeyboardShortcut.Key;WebInspector.KeyboardShortcut.Keys={Backspace:{code:8,name:"\u21a4"},Tab:{code:9,name:{mac:"\u21e5",other:"Tab"}},Enter:{code:13,name:{mac:"\u21a9",other:"Enter"}},Shift:{code:16,name:{mac:"\u21e7",other:"Shift"}},Ctrl:{code:17,name:"Ctrl"},Esc:{code:27,name:"Esc"},Space:{code:32,name:"Space"},PageUp:{code:33,name:{mac:"\u21de",other:"PageUp"}},PageDown:{code:34,name:{mac:"\u21df",other:"PageDown"}},End:{code:35,name:{mac:"\u2197",other:"End"}},Home:{code:36,name:{mac:"\u2196",other:"Home"}},Left:{code:37,name:"\u2190"},Up:{code:38,name:"\u2191"},Right:{code:39,name:"\u2192"},Down:{code:40,name:"\u2193"},Delete:{code:46,name:"Del"},Zero:{code:48,name:"0"},H:{code:72,name:"H"},Meta:{code:91,name:"Meta"},F1:{code:112,name:"F1"},F2:{code:113,name:"F2"},F3:{code:114,name:"F3"},F4:{code:115,name:"F4"},F5:{code:116,name:"F5"},F6:{code:117,name:"F6"},F7:{code:118,name:"F7"},F8:{code:119,name:"F8"},F9:{code:120,name:"F9"},F10:{code:121,name:"F10"},F11:{code:122,name:"F11"},F12:{code:123,name:"F12"},Semicolon:{code:186,name:";"},NumpadPlus:{code:107,name:"Numpad +"},NumpadMinus:{code:109,name:"Numpad -"},Numpad0:{code:96,name:"Numpad 0"},Plus:{code:187,name:"+"},Comma:{code:188,name:","},Minus:{code:189,name:"-"},Period:{code:190,name:"."},Slash:{code:191,name:"/"},QuestionMark:{code:191,name:"?"},Apostrophe:{code:192,name:"`"},Tilde:{code:192,name:"Tilde"},LeftSquareBracket:{code:219,name:"["},RightSquareBracket:{code:221,name:"]"},Backslash:{code:220,name:"\\"},SingleQuote:{code:222,name:"\'"},get CtrlOrMeta()
{return WebInspector.isMac()?this.Meta:this.Ctrl;},};WebInspector.KeyboardShortcut.KeyBindings={};(function(){for(var key in WebInspector.KeyboardShortcut.Keys){var descriptor=WebInspector.KeyboardShortcut.Keys[key];if(typeof descriptor==="object"&&descriptor["code"]){var name=typeof descriptor["name"]==="string"?descriptor["name"]:key;WebInspector.KeyboardShortcut.KeyBindings[name]=descriptor;}}})();WebInspector.KeyboardShortcut.makeKey=function(keyCode,modifiers)
{if(typeof keyCode==="string")
keyCode=keyCode.charCodeAt(0)-(/^[a-z]/.test(keyCode)?32:0);modifiers=modifiers||WebInspector.KeyboardShortcut.Modifiers.None;return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode,modifiers);}
WebInspector.KeyboardShortcut.makeKeyFromEvent=function(keyboardEvent)
{var modifiers=WebInspector.KeyboardShortcut.Modifiers.None;if(keyboardEvent.shiftKey)
modifiers|=WebInspector.KeyboardShortcut.Modifiers.Shift;if(keyboardEvent.ctrlKey)
modifiers|=WebInspector.KeyboardShortcut.Modifiers.Ctrl;if(keyboardEvent.altKey)
modifiers|=WebInspector.KeyboardShortcut.Modifiers.Alt;if(keyboardEvent.metaKey)
modifiers|=WebInspector.KeyboardShortcut.Modifiers.Meta;var keyCode=keyboardEvent.keyCode||keyboardEvent["__keyCode"];return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode,modifiers);}
WebInspector.KeyboardShortcut.makeKeyFromEventIgnoringModifiers=function(keyboardEvent)
{var keyCode=keyboardEvent.keyCode||keyboardEvent["__keyCode"];return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode,WebInspector.KeyboardShortcut.Modifiers.None);}
WebInspector.KeyboardShortcut.eventHasCtrlOrMeta=function(event)
{return WebInspector.isMac()?event.metaKey&&!event.ctrlKey:event.ctrlKey&&!event.metaKey;}
WebInspector.KeyboardShortcut.hasNoModifiers=function(event)
{return!event.ctrlKey&&!event.shiftKey&&!event.altKey&&!event.metaKey;}
WebInspector.KeyboardShortcut.Descriptor;WebInspector.KeyboardShortcut.makeDescriptor=function(key,modifiers)
{return{key:WebInspector.KeyboardShortcut.makeKey(typeof key==="string"?key:key.code,modifiers),name:WebInspector.KeyboardShortcut.shortcutToString(key,modifiers)};}
WebInspector.KeyboardShortcut.makeDescriptorFromBindingShortcut=function(shortcut)
{var parts=shortcut.split(/\+(?!$)/);var modifiers=0;var keyString;for(var i=0;i<parts.length;++i){if(typeof WebInspector.KeyboardShortcut.Modifiers[parts[i]]!=="undefined"){modifiers|=WebInspector.KeyboardShortcut.Modifiers[parts[i]];continue;}
console.assert(i===parts.length-1,"Only one key other than modifier is allowed in shortcut <"+shortcut+">");keyString=parts[i];break;}
console.assert(keyString,"Modifiers-only shortcuts are not allowed (encountered <"+shortcut+">)");if(!keyString)
return null;var key=WebInspector.KeyboardShortcut.Keys[keyString]||WebInspector.KeyboardShortcut.KeyBindings[keyString];if(key&&key.shiftKey)
modifiers|=WebInspector.KeyboardShortcut.Modifiers.Shift;return WebInspector.KeyboardShortcut.makeDescriptor(key?key:keyString,modifiers);}
WebInspector.KeyboardShortcut.shortcutToString=function(key,modifiers)
{return WebInspector.KeyboardShortcut._modifiersToString(modifiers)+WebInspector.KeyboardShortcut._keyName(key);}
WebInspector.KeyboardShortcut._keyName=function(key)
{if(typeof key==="string")
return key.toUpperCase();if(typeof key.name==="string")
return key.name;return key.name[WebInspector.platform()]||key.name.other||'';}
WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers=function(keyCode,modifiers)
{return(keyCode&255)|(modifiers<<8);};WebInspector.KeyboardShortcut.keyCodeAndModifiersFromKey=function(key)
{return{keyCode:key&255,modifiers:key>>8};}
WebInspector.KeyboardShortcut._modifiersToString=function(modifiers)
{var isMac=WebInspector.isMac();var m=WebInspector.KeyboardShortcut.Modifiers;var modifierNames=new Map([[m.Ctrl,isMac?"Ctrl\u2004":"Ctrl\u200A+\u200A"],[m.Alt,isMac?"opt\u2004":"Alt\u200A+\u200A"],[m.Shift,isMac?"\u21e7\u2004":"Shift\u200A+\u200A"],[m.Meta,isMac?"\u2318\u2004":"Win\u200A+\u200A"]]);return[m.Meta,m.Ctrl,m.Alt,m.Shift].map(mapModifiers).join("");function mapModifiers(m)
{return modifiers&m?(modifierNames.get(m)):"";}};WebInspector.KeyboardShortcut.SelectAll=WebInspector.KeyboardShortcut.makeKey("a",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta);;WebInspector.ListWidget=function(delegate)
{WebInspector.VBox.call(this,true);this.registerRequiredCSS("ui/listWidget.css");this._delegate=delegate;this._list=this.contentElement.createChild("div","list");this._editor=null;this._editItem=null;this._editElement=null;this._emptyPlaceholder=null;this.clear();}
WebInspector.ListWidget.Delegate=function()
{}
WebInspector.ListWidget.Delegate.prototype={renderItem:function(item,editable){},removeItemRequested:function(item,index){},beginEdit:function(item){},commitEdit:function(item,editor,isNew){}}
WebInspector.ListWidget.prototype={clear:function()
{this._items=[];this._editable=[];this._elements=[];this._lastSeparator=false;this._list.removeChildren();this._updatePlaceholder();this._stopEditing();},appendItem:function(item,editable)
{if(this._lastSeparator&&this._items.length)
this._list.appendChild(createElementWithClass("div","list-separator"));this._lastSeparator=false;this._items.push(item);this._editable.push(editable);var element=this._list.createChild("div","list-item");element.appendChild(this._delegate.renderItem(item,editable));if(editable){element.classList.add("editable");element.appendChild(this._createControls(item,element));}
this._elements.push(element);this._updatePlaceholder();},appendSeparator:function()
{this._lastSeparator=true;},removeItem:function(index)
{if(this._editItem===this._items[index])
this._stopEditing();var element=this._elements[index];var previous=element.previousElementSibling;var previousIsSeparator=previous&&previous.classList.contains("list-separator");var next=element.nextElementSibling;var nextIsSeparator=next&&next.classList.contains("list-separator");if(previousIsSeparator&&(nextIsSeparator||!next))
previous.remove();if(nextIsSeparator&&!previous)
next.remove();element.remove();this._elements.splice(index,1);this._items.splice(index,1);this._editable.splice(index,1);this._updatePlaceholder();},addNewItem:function(index,item)
{this._startEditing(item,null,this._elements[index]||null);},setEmptyPlaceholder:function(element)
{this._emptyPlaceholder=element;this._updatePlaceholder();},_createControls:function(item,element)
{var controls=createElementWithClass("div","controls-container fill");var gradient=controls.createChild("div","controls-gradient");var buttons=controls.createChild("div","controls-buttons");var editButton=buttons.createChild("div","edit-button");editButton.title=WebInspector.UIString("Edit");editButton.addEventListener("click",onEditClicked.bind(this),false);var removeButton=buttons.createChild("div","remove-button");removeButton.title=WebInspector.UIString("Remove");removeButton.addEventListener("click",onRemoveClicked.bind(this),false);return controls;function onEditClicked(event)
{event.consume();var insertionPoint=element&&element.nextElementSibling?element.nextElementSibling:null;this._startEditing(item,element,insertionPoint);}
function onRemoveClicked(event)
{event.consume();var index=this._elements.indexOf(element);this._delegate.removeItemRequested(this._items[index],index);}},wasShown:function()
{WebInspector.VBox.prototype.wasShown.call(this);this._stopEditing();},_updatePlaceholder:function()
{if(!this._emptyPlaceholder)
return;if(!this._elements.length&&!this._editor)
this._list.appendChild(this._emptyPlaceholder);else
this._emptyPlaceholder.remove();},_startEditing:function(item,element,insertionPoint)
{if(element&&this._editElement===element)
return;this._stopEditing();this._list.classList.add("list-editing");this._editItem=item;this._editElement=element;if(element)
element.classList.add("hidden");var index=element?this._elements.indexOf(element):-1;this._editor=this._delegate.beginEdit(item);this._updatePlaceholder();this._list.insertBefore(this._editor.element,insertionPoint);this._editor.beginEdit(item,index,element?WebInspector.UIString("Save"):WebInspector.UIString("Add"),this._commitEditing.bind(this),this._stopEditing.bind(this));},_commitEditing:function()
{var editItem=this._editItem;var isNew=!this._editElement;var editor=(this._editor);this._stopEditing();this._delegate.commitEdit(editItem,editor,isNew);},_stopEditing:function()
{this._list.classList.remove("list-editing");if(this._editElement)
this._editElement.classList.remove("hidden");if(this._editor&&this._editor.element.parentElement)
this._editor.element.remove();this._editor=null;this._editItem=null;this._editElement=null;this._updatePlaceholder();},__proto__:WebInspector.VBox.prototype}
WebInspector.ListWidget.Editor=function()
{this.element=createElementWithClass("div","editor-container");this.element.addEventListener("keydown",onKeyDown.bind(null,isEscKey,this._cancelClicked.bind(this)),false);this.element.addEventListener("keydown",onKeyDown.bind(null,isEnterKey,this._commitClicked.bind(this)),false);this._contentElement=this.element.createChild("div","editor-content");var buttonsRow=this.element.createChild("div","editor-buttons");this._commitButton=createTextButton("",this._commitClicked.bind(this));buttonsRow.appendChild(this._commitButton);this._cancelButton=createTextButton(WebInspector.UIString("Cancel"),this._cancelClicked.bind(this));this._cancelButton.addEventListener("keydown",onKeyDown.bind(null,isEnterKey,this._cancelClicked.bind(this)),false);buttonsRow.appendChild(this._cancelButton);function onKeyDown(predicate,callback,event)
{if(predicate(event)){event.consume(true);callback();}}
this._controls=[];this._controlByName=new Map();this._validators=[];this._commit=null;this._cancel=null;this._item=null;this._index=-1;}
WebInspector.ListWidget.Editor.prototype={contentElement:function()
{return this._contentElement;},createInput:function(name,type,title,validator)
{var input=(createElement("input"));input.type=type;input.placeholder=title;input.addEventListener("input",this._validateControls.bind(this,false),false);input.addEventListener("blur",this._validateControls.bind(this,false),false);this._controlByName.set(name,input);this._controls.push(input);this._validators.push(validator);return input;},createSelect:function(name,options,validator)
{var select=(createElementWithClass("select","chrome-select"));for(var index=0;index<options.length;++index){var option=select.createChild("option");option.value=options[index];option.textContent=options[index];}
select.addEventListener("input",this._validateControls.bind(this,false),false);select.addEventListener("blur",this._validateControls.bind(this,false),false);this._controlByName.set(name,select);this._controls.push(select);this._validators.push(validator);return select;},control:function(name)
{return(this._controlByName.get(name));},_validateControls:function(forceValid)
{var allValid=true;for(var index=0;index<this._controls.length;++index){var input=this._controls[index];var valid=this._validators[index].call(null,this._item,this._index,input);input.classList.toggle("error-input",!valid&&!forceValid);allValid&=valid;}
this._commitButton.disabled=!allValid;},beginEdit:function(item,index,commitButtonTitle,commit,cancel)
{this._commit=commit;this._cancel=cancel;this._item=item;this._index=index;this._commitButton.textContent=commitButtonTitle;this.element.scrollIntoViewIfNeeded(false);if(this._controls.length)
this._controls[0].focus();this._validateControls(true);},_commitClicked:function()
{if(this._commitButton.disabled)
return;var commit=this._commit;this._commit=null;this._cancel=null;this._item=null;this._index=-1;commit();},_cancelClicked:function()
{var cancel=this._cancel;this._commit=null;this._cancel=null;this._item=null;this._index=-1;cancel();}};WebInspector.Panel=function(name)
{WebInspector.VBox.call(this);this.element.classList.add("panel");this.element.classList.add(name);this._panelName=name;this._shortcuts=({});}
WebInspector.Panel.counterRightMargin=25;WebInspector.Panel.prototype={get name()
{return this._panelName;},reset:function()
{},searchableView:function()
{return null;},elementsToRestoreScrollPositionsFor:function()
{return[];},handleShortcut:function(event)
{var shortcutKey=WebInspector.KeyboardShortcut.makeKeyFromEvent(event);var handler=this._shortcuts[shortcutKey];if(handler&&handler(event))
event.handled=true;},registerShortcuts:function(keys,handler)
{for(var i=0;i<keys.length;++i)
this._shortcuts[keys[i].key]=handler;},showInfobar:function(infobar)
{infobar.setCloseCallback(this._onInfobarClosed.bind(this,infobar));if(this.element.firstChild)
this.element.insertBefore(infobar.element,this.element.firstChild);else
this.element.appendChild(infobar.element);infobar.setParentView(this);this.doResize();},_onInfobarClosed:function(infobar)
{infobar.element.remove();this.doResize();},__proto__:WebInspector.VBox.prototype}
WebInspector.PanelWithSidebar=function(name,defaultWidth)
{WebInspector.Panel.call(this,name);this._panelSplitWidget=new WebInspector.SplitWidget(true,false,this._panelName+"PanelSplitViewState",defaultWidth||200);this._panelSplitWidget.show(this.element);this._mainWidget=new WebInspector.VBox();this._panelSplitWidget.setMainWidget(this._mainWidget);this._sidebarWidget=new WebInspector.VBox();this._sidebarWidget.setMinimumSize(100,25);this._panelSplitWidget.setSidebarWidget(this._sidebarWidget);this._sidebarWidget.element.classList.add("sidebar");}
WebInspector.PanelWithSidebar.prototype={panelSidebarElement:function()
{return this._sidebarWidget.element;},mainElement:function()
{return this._mainWidget.element;},splitWidget:function()
{return this._panelSplitWidget;},__proto__:WebInspector.Panel.prototype}
WebInspector.PanelDescriptor=function()
{}
WebInspector.PanelDescriptor.prototype={name:function(){},title:function(){},panel:function(){}}
WebInspector.PanelFactory=function()
{}
WebInspector.PanelFactory.prototype={createPanel:function(){}}
WebInspector.RuntimeExtensionPanelDescriptor=function(extension)
{this._name=extension.descriptor()["name"];this._title=WebInspector.UIString(extension.descriptor()["title"]);this._extension=extension;}
WebInspector.RuntimeExtensionPanelDescriptor.prototype={name:function()
{return this._name;},title:function()
{return this._title;},panel:function()
{return this._extension.instancePromise().then(createPanel);function createPanel(panelFactory)
{return(panelFactory).createPanel();}}};WebInspector.Popover=function(popoverHelper)
{WebInspector.Widget.call(this);this.markAsRoot();this.element.className=WebInspector.Popover._classNamePrefix;this._containerElement=createElementWithClass("div","fill popover-container");this._popupArrowElement=this.element.createChild("div","arrow");this._contentDiv=this.element.createChild("div","content");this._popoverHelper=popoverHelper;this._hideBound=this.hide.bind(this);}
WebInspector.Popover._classNamePrefix="popover";WebInspector.Popover.prototype={showForAnchor:function(element,anchor,preferredWidth,preferredHeight,arrowDirection)
{this._innerShow(null,element,anchor,preferredWidth,preferredHeight,arrowDirection);},showView:function(view,anchor,preferredWidth,preferredHeight)
{this._innerShow(view,view.element,anchor,preferredWidth,preferredHeight);},_innerShow:function(view,contentElement,anchor,preferredWidth,preferredHeight,arrowDirection)
{if(this._disposed)
return;this._contentElement=contentElement;if(WebInspector.Popover._popover)
WebInspector.Popover._popover.hide();WebInspector.Popover._popover=this;var document=anchor instanceof Element?anchor.ownerDocument:contentElement.ownerDocument;var window=document.defaultView;var preferredSize=view?view.measurePreferredSize():WebInspector.measurePreferredSize(this._contentElement);this._preferredWidth=preferredWidth||preferredSize.width;this._preferredHeight=preferredHeight||preferredSize.height;window.addEventListener("resize",this._hideBound,false);document.body.appendChild(this._containerElement);WebInspector.Widget.prototype.show.call(this,this._containerElement);if(view)
view.show(this._contentDiv);else
this._contentDiv.appendChild(this._contentElement);this.positionElement(anchor,this._preferredWidth,this._preferredHeight,arrowDirection);if(this._popoverHelper){this._contentDiv.addEventListener("mousemove",this._popoverHelper._killHidePopoverTimer.bind(this._popoverHelper),true);this.element.addEventListener("mouseout",this._popoverHelper._popoverMouseOut.bind(this._popoverHelper),true);}},hide:function()
{this._containerElement.ownerDocument.defaultView.removeEventListener("resize",this._hideBound,false);this.detach();this._containerElement.remove();delete WebInspector.Popover._popover;},get disposed()
{return this._disposed;},dispose:function()
{if(this.isShowing())
this.hide();this._disposed=true;},setCanShrink:function(canShrink)
{this._hasFixedHeight=!canShrink;this._contentDiv.classList.toggle("fixed-height",this._hasFixedHeight);},setNoMargins:function(noMargins)
{this._hasNoMargins=noMargins;this._contentDiv.classList.toggle("no-margin",this._hasNoMargins);},positionElement:function(anchorElement,preferredWidth,preferredHeight,arrowDirection)
{const borderWidth=this._hasNoMargins?0:8;const scrollerWidth=this._hasFixedHeight?0:14;const arrowHeight=this._hasNoMargins?8:15;const arrowOffset=10;const borderRadius=4;const arrowRadius=6;preferredWidth=preferredWidth||this._preferredWidth;preferredHeight=preferredHeight||this._preferredHeight;preferredWidth=Math.max(preferredWidth,50);const container=WebInspector.Dialog.modalHostView().element;const totalWidth=container.offsetWidth;const totalHeight=container.offsetHeight;var anchorBox=anchorElement instanceof AnchorBox?anchorElement:anchorElement.boxInWindow(window);anchorBox=anchorBox.relativeToElement(container);var newElementPosition={x:0,y:0,width:preferredWidth+scrollerWidth,height:preferredHeight};var verticalAlignment;var roomAbove=anchorBox.y;var roomBelow=totalHeight-anchorBox.y-anchorBox.height;if((roomAbove>roomBelow)||(arrowDirection===WebInspector.Popover.Orientation.Bottom)){if((anchorBox.y>newElementPosition.height+arrowHeight+borderRadius)||(arrowDirection===WebInspector.Popover.Orientation.Bottom))
newElementPosition.y=anchorBox.y-newElementPosition.height-arrowHeight;else{newElementPosition.y=borderRadius;newElementPosition.height=anchorBox.y-borderRadius*2-arrowHeight;if(this._hasFixedHeight&&newElementPosition.height<preferredHeight){newElementPosition.y=borderRadius;newElementPosition.height=preferredHeight;}}
verticalAlignment=WebInspector.Popover.Orientation.Bottom;}else{newElementPosition.y=anchorBox.y+anchorBox.height+arrowHeight;if((newElementPosition.y+newElementPosition.height+borderRadius>=totalHeight)&&(arrowDirection!==WebInspector.Popover.Orientation.Top)){newElementPosition.height=totalHeight-borderRadius-newElementPosition.y;if(this._hasFixedHeight&&newElementPosition.height<preferredHeight){newElementPosition.y=totalHeight-preferredHeight-borderRadius;newElementPosition.height=preferredHeight;}}
verticalAlignment=WebInspector.Popover.Orientation.Top;}
var horizontalAlignment;this._popupArrowElement.removeAttribute("style");if(anchorBox.x+newElementPosition.width<totalWidth){newElementPosition.x=Math.max(borderRadius,anchorBox.x-borderRadius-arrowOffset);horizontalAlignment="left";this._popupArrowElement.style.left=arrowOffset+"px";}else if(newElementPosition.width+borderRadius*2<totalWidth){newElementPosition.x=totalWidth-newElementPosition.width-borderRadius-2*borderWidth;horizontalAlignment="right";var arrowRightPosition=Math.max(0,totalWidth-anchorBox.x-anchorBox.width-borderRadius-arrowOffset);arrowRightPosition+=anchorBox.width/2;arrowRightPosition=Math.min(arrowRightPosition,newElementPosition.width-borderRadius-arrowOffset);this._popupArrowElement.style.right=arrowRightPosition+"px";}else{newElementPosition.x=borderRadius;newElementPosition.width=totalWidth-borderRadius*2;newElementPosition.height+=scrollerWidth;horizontalAlignment="left";if(verticalAlignment===WebInspector.Popover.Orientation.Bottom)
newElementPosition.y-=scrollerWidth;this._popupArrowElement.style.left=Math.max(0,anchorBox.x-newElementPosition.x-borderRadius-arrowRadius+anchorBox.width/2)+"px";}
this.element.className=WebInspector.Popover._classNamePrefix+" "+verticalAlignment+"-"+horizontalAlignment+"-arrow";this.element.positionAt(newElementPosition.x,newElementPosition.y-borderWidth,container);this.element.style.width=newElementPosition.width+borderWidth*2+"px";this.element.style.height=newElementPosition.height+borderWidth*2+"px";},__proto__:WebInspector.Widget.prototype}
WebInspector.PopoverHelper=function(panelElement,getAnchor,showPopover,onHide,disableOnClick)
{this._getAnchor=getAnchor;this._showPopover=showPopover;this._onHide=onHide;this._disableOnClick=!!disableOnClick;panelElement.addEventListener("mousedown",this._mouseDown.bind(this),false);panelElement.addEventListener("mousemove",this._mouseMove.bind(this),false);panelElement.addEventListener("mouseout",this._mouseOut.bind(this),false);this.setTimeout(1000,500);}
WebInspector.PopoverHelper.prototype={setTimeout:function(timeout,hideTimeout)
{this._timeout=timeout;if(typeof hideTimeout==="number")
this._hideTimeout=hideTimeout;else
this._hideTimeout=timeout/2;},_eventInHoverElement:function(event)
{if(!this._hoverElement)
return false;var box=this._hoverElement instanceof AnchorBox?this._hoverElement:this._hoverElement.boxInWindow();return(box.x<=event.clientX&&event.clientX<=box.x+box.width&&box.y<=event.clientY&&event.clientY<=box.y+box.height);},_mouseDown:function(event)
{if(this._disableOnClick||!this._eventInHoverElement(event))
this.hidePopover();else{this._killHidePopoverTimer();this._handleMouseAction(event,true);}},_mouseMove:function(event)
{if(this._eventInHoverElement(event))
return;this._startHidePopoverTimer();this._handleMouseAction(event,false);},_popoverMouseOut:function(event)
{if(!this.isPopoverVisible())
return;if(event.relatedTarget&&!event.relatedTarget.isSelfOrDescendant(this._popover._contentDiv))
this._startHidePopoverTimer();},_mouseOut:function(event)
{if(!this.isPopoverVisible())
return;if(!this._eventInHoverElement(event))
this._startHidePopoverTimer();},_startHidePopoverTimer:function()
{if(!this._popover||this._hidePopoverTimer)
return;function doHide()
{this._hidePopover();delete this._hidePopoverTimer;}
this._hidePopoverTimer=setTimeout(doHide.bind(this),this._hideTimeout);},_handleMouseAction:function(event,isMouseDown)
{this._resetHoverTimer();if(event.which&&this._disableOnClick)
return;this._hoverElement=this._getAnchor(event.target,event);if(!this._hoverElement)
return;const toolTipDelay=isMouseDown?0:(this._popup?this._timeout*0.6:this._timeout);this._hoverTimer=setTimeout(this._mouseHover.bind(this,this._hoverElement),toolTipDelay);},_resetHoverTimer:function()
{if(this._hoverTimer){clearTimeout(this._hoverTimer);delete this._hoverTimer;}},isPopoverVisible:function()
{return!!this._popover;},hidePopover:function()
{this._resetHoverTimer();this._hidePopover();},_hidePopover:function()
{if(!this._popover)
return;if(this._onHide)
this._onHide();this._popover.dispose();delete this._popover;this._hoverElement=null;},_mouseHover:function(element)
{delete this._hoverTimer;this._hoverElement=element;this._hidePopover();this._popover=new WebInspector.Popover(this);this._showPopover(element,this._popover);},_killHidePopoverTimer:function()
{if(this._hidePopoverTimer){clearTimeout(this._hidePopoverTimer);delete this._hidePopoverTimer;this._resetHoverTimer();}}}
WebInspector.Popover.Orientation={Top:"top",Bottom:"bottom"};WebInspector.ProgressIndicator=function()
{this.element=createElementWithClass("div","progress-indicator");this._shadowRoot=WebInspector.createShadowRootWithCoreStyles(this.element,"ui/progressIndicator.css");this._contentElement=this._shadowRoot.createChild("div","progress-indicator-shadow-container");this._labelElement=this._contentElement.createChild("div","title");this._progressElement=this._contentElement.createChild("progress");this._progressElement.value=0;this._stopButton=this._contentElement.createChild("button","progress-indicator-shadow-stop-button");this._stopButton.addEventListener("click",this.cancel.bind(this));this._isCanceled=false;this._worked=0;}
WebInspector.ProgressIndicator.prototype={show:function(parent)
{parent.appendChild(this.element);},done:function()
{if(this._isDone)
return;this._isDone=true;this.element.remove();},cancel:function()
{this._isCanceled=true;},isCanceled:function()
{return this._isCanceled;},setTitle:function(title)
{this._labelElement.textContent=title;},setTotalWork:function(totalWork)
{this._progressElement.max=totalWork;},setWorked:function(worked,title)
{this._worked=worked;this._progressElement.value=worked;if(title)
this.setTitle(title);},worked:function(worked)
{this.setWorked(this._worked+(worked||1));}};WebInspector.ResizerWidget=function()
{WebInspector.Object.call(this);this._isEnabled=true;this._elements=[];this._installDragOnMouseDownBound=this._installDragOnMouseDown.bind(this);this._cursor="nwse-resize";};WebInspector.ResizerWidget.Events={ResizeStart:"ResizeStart",ResizeUpdate:"ResizeUpdate",ResizeEnd:"ResizeEnd"};WebInspector.ResizerWidget.prototype={isEnabled:function()
{return this._isEnabled;},setEnabled:function(enabled)
{this._isEnabled=enabled;this.updateElementCursors();},elements:function()
{return this._elements.slice();},addElement:function(element)
{if(this._elements.indexOf(element)!==-1)
return;this._elements.push(element);element.addEventListener("mousedown",this._installDragOnMouseDownBound,false);this._updateElementCursor(element);},removeElement:function(element)
{if(this._elements.indexOf(element)===-1)
return;this._elements.remove(element);element.removeEventListener("mousedown",this._installDragOnMouseDownBound,false);element.style.removeProperty("cursor");},updateElementCursors:function()
{this._elements.forEach(this._updateElementCursor.bind(this));},_updateElementCursor:function(element)
{if(this._isEnabled)
element.style.setProperty("cursor",this.cursor());else
element.style.removeProperty("cursor");},cursor:function()
{return this._cursor;},setCursor:function(cursor)
{this._cursor=cursor;this.updateElementCursors();},_installDragOnMouseDown:function(event)
{if(this._elements.indexOf(event.target)===-1)
return false;WebInspector.elementDragStart((event.target),this._dragStart.bind(this),this._drag.bind(this),this._dragEnd.bind(this),this.cursor(),event);},_dragStart:function(event)
{if(!this._isEnabled)
return false;this._startX=event.pageX;this._startY=event.pageY;this.sendDragStart(this._startX,this._startY);return true;},sendDragStart:function(x,y)
{this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeStart,{startX:x,currentX:x,startY:y,currentY:y});},_drag:function(event)
{if(!this._isEnabled){this._dragEnd(event);return true;}
this.sendDragMove(this._startX,event.pageX,this._startY,event.pageY,event.shiftKey);event.preventDefault();return false;},sendDragMove:function(startX,currentX,startY,currentY,shiftKey)
{this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeUpdate,{startX:startX,currentX:currentX,startY:startY,currentY:currentY,shiftKey:shiftKey});},_dragEnd:function(event)
{this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeEnd);delete this._startX;delete this._startY;},__proto__:WebInspector.Object.prototype};WebInspector.SimpleResizerWidget=function()
{WebInspector.ResizerWidget.call(this);this._isVertical=true;};WebInspector.SimpleResizerWidget.prototype={isVertical:function()
{return this._isVertical;},setVertical:function(vertical)
{this._isVertical=vertical;this.updateElementCursors();},cursor:function()
{return this._isVertical?"ns-resize":"ew-resize";},sendDragStart:function(x,y)
{var position=this._isVertical?y:x;this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeStart,{startPosition:position,currentPosition:position});},sendDragMove:function(startX,currentX,startY,currentY,shiftKey)
{if(this._isVertical)
this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeUpdate,{startPosition:startY,currentPosition:currentY,shiftKey:shiftKey});else
this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeUpdate,{startPosition:startX,currentPosition:currentX,shiftKey:shiftKey});},__proto__:WebInspector.ResizerWidget.prototype};;WebInspector.RootView=function()
{WebInspector.VBox.call(this);this.markAsRoot();this.element.classList.add("root-view");this.element.setAttribute("spellcheck",false);}
WebInspector.RootView.prototype={attachToDocument:function(document)
{document.defaultView.addEventListener("resize",this.doResize.bind(this),false);this._window=document.defaultView;this.doResize();this.show(document.body);},doResize:function()
{if(this._window){var size=this.constraints().minimum;var zoom=WebInspector.zoomManager.zoomFactor();var right=Math.min(0,this._window.innerWidth-size.width/zoom);this.element.style.marginRight=right+"px";var bottom=Math.min(0,this._window.innerHeight-size.height/zoom);this.element.style.marginBottom=bottom+"px";}
WebInspector.VBox.prototype.doResize.call(this);},__proto__:WebInspector.VBox.prototype};WebInspector.SearchableView=function(searchable,settingName)
{WebInspector.VBox.call(this,true);this.registerRequiredCSS("ui/searchableView.css");this.element[WebInspector.SearchableView._symbol]=this;this._searchProvider=searchable;this._setting=settingName?WebInspector.settings.createSetting(settingName,{}):null;this.contentElement.createChild("content");this._footerElementContainer=this.contentElement.createChild("div","search-bar hidden");this._footerElementContainer.style.order=100;var toolbar=new WebInspector.Toolbar("search-toolbar",this._footerElementContainer);if(this._searchProvider.supportsCaseSensitiveSearch()){this._caseSensitiveButton=new WebInspector.ToolbarToggle(WebInspector.UIString("Case sensitive"),"");this._caseSensitiveButton.setText("Aa");this._caseSensitiveButton.addEventListener("click",this._toggleCaseSensitiveSearch,this);toolbar.appendToolbarItem(this._caseSensitiveButton);}
if(this._searchProvider.supportsRegexSearch()){this._regexButton=new WebInspector.ToolbarToggle(WebInspector.UIString("Regex"),"");this._regexButton.setText(".*");this._regexButton.addEventListener("click",this._toggleRegexSearch,this);toolbar.appendToolbarItem(this._regexButton);}
this._footerElement=this._footerElementContainer.createChild("table","toolbar-search");this._footerElement.cellSpacing=0;this._firstRowElement=this._footerElement.createChild("tr");this._secondRowElement=this._footerElement.createChild("tr","hidden");var searchControlElementColumn=this._firstRowElement.createChild("td");this._searchControlElement=searchControlElementColumn.createChild("span","toolbar-search-control");this._searchInputElement=WebInspector.HistoryInput.create();this._searchInputElement.classList.add("search-replace");this._searchControlElement.appendChild(this._searchInputElement);this._searchInputElement.id="search-input-field";this._searchInputElement.placeholder=WebInspector.UIString("Find");this._matchesElement=this._searchControlElement.createChild("label","search-results-matches");this._matchesElement.setAttribute("for","search-input-field");this._searchNavigationElement=this._searchControlElement.createChild("div","toolbar-search-navigation-controls");this._searchNavigationPrevElement=this._searchNavigationElement.createChild("div","toolbar-search-navigation toolbar-search-navigation-prev");this._searchNavigationPrevElement.addEventListener("click",this._onPrevButtonSearch.bind(this),false);this._searchNavigationPrevElement.title=WebInspector.UIString("Search Previous");this._searchNavigationNextElement=this._searchNavigationElement.createChild("div","toolbar-search-navigation toolbar-search-navigation-next");this._searchNavigationNextElement.addEventListener("click",this._onNextButtonSearch.bind(this),false);this._searchNavigationNextElement.title=WebInspector.UIString("Search Next");this._searchInputElement.addEventListener("mousedown",this._onSearchFieldManualFocus.bind(this),false);this._searchInputElement.addEventListener("keydown",this._onSearchKeyDown.bind(this),true);this._searchInputElement.addEventListener("input",this._onInput.bind(this),false);this._replaceInputElement=this._secondRowElement.createChild("td").createChild("input","search-replace toolbar-replace-control");this._replaceInputElement.addEventListener("keydown",this._onReplaceKeyDown.bind(this),true);this._replaceInputElement.placeholder=WebInspector.UIString("Replace");this._findButtonElement=this._firstRowElement.createChild("td").createChild("button","search-action-button hidden");this._findButtonElement.textContent=WebInspector.UIString("Find");this._findButtonElement.tabIndex=-1;this._findButtonElement.addEventListener("click",this._onFindClick.bind(this),false);this._replaceButtonElement=this._secondRowElement.createChild("td").createChild("button","search-action-button");this._replaceButtonElement.textContent=WebInspector.UIString("Replace");this._replaceButtonElement.disabled=true;this._replaceButtonElement.tabIndex=-1;this._replaceButtonElement.addEventListener("click",this._replace.bind(this),false);this._prevButtonElement=this._firstRowElement.createChild("td").createChild("button","search-action-button hidden");this._prevButtonElement.textContent=WebInspector.UIString("Previous");this._prevButtonElement.tabIndex=-1;this._prevButtonElement.addEventListener("click",this._onPreviousClick.bind(this),false);this._replaceAllButtonElement=this._secondRowElement.createChild("td").createChild("button","search-action-button");this._replaceAllButtonElement.textContent=WebInspector.UIString("Replace All");this._replaceAllButtonElement.addEventListener("click",this._replaceAll.bind(this),false);this._replaceElement=this._firstRowElement.createChild("td").createChild("span");this._replaceLabelElement=createCheckboxLabel(WebInspector.UIString("Replace"));this._replaceCheckboxElement=this._replaceLabelElement.checkboxElement;this._uniqueId=++WebInspector.SearchableView._lastUniqueId;var replaceCheckboxId="search-replace-trigger"+this._uniqueId;this._replaceCheckboxElement.id=replaceCheckboxId;this._replaceCheckboxElement.addEventListener("change",this._updateSecondRowVisibility.bind(this),false);this._replaceElement.appendChild(this._replaceLabelElement);var cancelButtonElement=this._firstRowElement.createChild("td").createChild("button","search-action-button");cancelButtonElement.textContent=WebInspector.UIString("Cancel");cancelButtonElement.tabIndex=-1;cancelButtonElement.addEventListener("click",this.closeSearch.bind(this),false);this._minimalSearchQuerySize=3;this._loadSetting();}
WebInspector.SearchableView._lastUniqueId=0;WebInspector.SearchableView._symbol=Symbol("searchableView");WebInspector.SearchableView.fromElement=function(element)
{var view=null;while(element&&!view){view=element[WebInspector.SearchableView._symbol];element=element.parentElementOrShadowHost();}
return view;}
WebInspector.SearchableView.prototype={_toggleCaseSensitiveSearch:function()
{this._caseSensitiveButton.setToggled(!this._caseSensitiveButton.toggled());this._saveSetting();this._performSearch(false,true);},_toggleRegexSearch:function()
{this._regexButton.setToggled(!this._regexButton.toggled());this._saveSetting();this._performSearch(false,true);},_saveSetting:function()
{if(!this._setting)
return;var settingValue=this._setting.get()||{};settingValue.caseSensitive=this._caseSensitiveButton.toggled();settingValue.isRegex=this._regexButton.toggled();this._setting.set(settingValue);},_loadSetting:function()
{var settingValue=this._setting?(this._setting.get()||{}):{};if(this._searchProvider.supportsCaseSensitiveSearch())
this._caseSensitiveButton.setToggled(!!settingValue.caseSensitive);if(this._searchProvider.supportsRegexSearch())
this._regexButton.setToggled(!!settingValue.isRegex);},defaultFocusedElement:function()
{var children=this.children();for(var i=0;i<children.length;++i){var element=children[i].defaultFocusedElement();if(element)
return element;}
return WebInspector.Widget.prototype.defaultFocusedElement.call(this);},setMinimalSearchQuerySize:function(minimalSearchQuerySize)
{this._minimalSearchQuerySize=minimalSearchQuerySize;},setPlaceholder:function(placeholder)
{this._searchInputElement.placeholder=placeholder;},setReplaceable:function(replaceable)
{this._replaceable=replaceable;},updateSearchMatchesCount:function(matches)
{this._searchProvider.currentSearchMatches=matches;this._updateSearchMatchesCountAndCurrentMatchIndex(this._searchProvider.currentQuery?matches:0,-1);},updateCurrentMatchIndex:function(currentMatchIndex)
{this._updateSearchMatchesCountAndCurrentMatchIndex(this._searchProvider.currentSearchMatches,currentMatchIndex);},isSearchVisible:function()
{return this._searchIsVisible;},closeSearch:function()
{this.cancelSearch();if(WebInspector.currentFocusElement()&&WebInspector.currentFocusElement().isDescendant(this._footerElementContainer))
this.focus();},_toggleSearchBar:function(toggled)
{this._footerElementContainer.classList.toggle("hidden",!toggled);this.doResize();},cancelSearch:function()
{if(!this._searchIsVisible)
return;this.resetSearch();delete this._searchIsVisible;this._toggleSearchBar(false);},resetSearch:function()
{this._clearSearch();this._updateReplaceVisibility();this._matchesElement.textContent="";},refreshSearch:function()
{if(!this._searchIsVisible)
return;this.resetSearch();this._performSearch(false,false);},handleFindNextShortcut:function()
{if(!this._searchIsVisible)
return false;this._searchProvider.jumpToNextSearchResult();return true;},handleFindPreviousShortcut:function()
{if(!this._searchIsVisible)
return false;this._searchProvider.jumpToPreviousSearchResult();return true;},handleFindShortcut:function()
{this.showSearchField();return true;},handleCancelSearchShortcut:function()
{if(!this._searchIsVisible)
return false;this.closeSearch();return true;},_updateSearchNavigationButtonState:function(enabled)
{this._replaceButtonElement.disabled=!enabled;if(enabled){this._searchNavigationPrevElement.classList.add("enabled");this._searchNavigationNextElement.classList.add("enabled");}else{this._searchNavigationPrevElement.classList.remove("enabled");this._searchNavigationNextElement.classList.remove("enabled");}},_updateSearchMatchesCountAndCurrentMatchIndex:function(matches,currentMatchIndex)
{if(!this._currentQuery)
this._matchesElement.textContent="";else if(matches===0||currentMatchIndex>=0)
this._matchesElement.textContent=WebInspector.UIString("%d of %d",currentMatchIndex+1,matches);else if(matches===1)
this._matchesElement.textContent=WebInspector.UIString("1 match");else
this._matchesElement.textContent=WebInspector.UIString("%d matches",matches);this._updateSearchNavigationButtonState(matches>0);},showSearchField:function()
{if(this._searchIsVisible)
this.cancelSearch();var queryCandidate;if(WebInspector.currentFocusElement()!==this._searchInputElement){var selection=this._searchInputElement.getComponentSelection();if(selection.rangeCount)
queryCandidate=selection.toString().replace(/\r?\n.*/,"");}
this._toggleSearchBar(true);this._updateReplaceVisibility();if(queryCandidate)
this._searchInputElement.value=queryCandidate;this._performSearch(false,false);this._searchInputElement.focus();this._searchInputElement.select();this._searchIsVisible=true;},_updateReplaceVisibility:function()
{this._replaceElement.classList.toggle("hidden",!this._replaceable);if(!this._replaceable){this._replaceCheckboxElement.checked=false;this._updateSecondRowVisibility();}},_onSearchFieldManualFocus:function(event)
{WebInspector.setCurrentFocusElement((event.target));},_onSearchKeyDown:function(event)
{if(!isEnterKey(event))
return;if(!this._currentQuery)
this._performSearch(true,true,event.shiftKey);else
this._jumpToNextSearchResult(event.shiftKey);},_onReplaceKeyDown:function(event)
{if(isEnterKey(event))
this._replace();},_jumpToNextSearchResult:function(isBackwardSearch)
{if(!this._currentQuery||!this._searchNavigationPrevElement.classList.contains("enabled"))
return;if(isBackwardSearch)
this._searchProvider.jumpToPreviousSearchResult();else
this._searchProvider.jumpToNextSearchResult();},_onNextButtonSearch:function(event)
{if(!this._searchNavigationNextElement.classList.contains("enabled"))
return;this._jumpToNextSearchResult();this._searchInputElement.focus();},_onPrevButtonSearch:function(event)
{if(!this._searchNavigationPrevElement.classList.contains("enabled"))
return;this._jumpToNextSearchResult(true);this._searchInputElement.focus();},_onFindClick:function(event)
{if(!this._currentQuery)
this._performSearch(true,true);else
this._jumpToNextSearchResult();this._searchInputElement.focus();},_onPreviousClick:function(event)
{if(!this._currentQuery)
this._performSearch(true,true,true);else
this._jumpToNextSearchResult(true);this._searchInputElement.focus();},_clearSearch:function()
{delete this._currentQuery;if(!!this._searchProvider.currentQuery){delete this._searchProvider.currentQuery;this._searchProvider.searchCanceled();}
this._updateSearchMatchesCountAndCurrentMatchIndex(0,-1);},_performSearch:function(forceSearch,shouldJump,jumpBackwards)
{var query=this._searchInputElement.value;if(!query||(!forceSearch&&query.length<this._minimalSearchQuerySize&&!this._currentQuery)){this._clearSearch();return;}
this._currentQuery=query;this._searchProvider.currentQuery=query;var searchConfig=this._currentSearchConfig();this._searchProvider.performSearch(searchConfig,shouldJump,jumpBackwards);},_currentSearchConfig:function()
{var query=this._searchInputElement.value;var caseSensitive=this._caseSensitiveButton?this._caseSensitiveButton.toggled():false;var isRegex=this._regexButton?this._regexButton.toggled():false;return new WebInspector.SearchableView.SearchConfig(query,caseSensitive,isRegex);},_updateSecondRowVisibility:function()
{var secondRowVisible=this._replaceCheckboxElement.checked;this._footerElementContainer.classList.toggle("replaceable",secondRowVisible);this._footerElement.classList.toggle("toolbar-search-replace",secondRowVisible);this._secondRowElement.classList.toggle("hidden",!secondRowVisible);this._prevButtonElement.classList.toggle("hidden",!secondRowVisible);this._findButtonElement.classList.toggle("hidden",!secondRowVisible);this._replaceCheckboxElement.tabIndex=secondRowVisible?-1:0;if(secondRowVisible)
this._replaceInputElement.focus();else
this._searchInputElement.focus();this.doResize();},_replace:function()
{var searchConfig=this._currentSearchConfig();(this._searchProvider).replaceSelectionWith(searchConfig,this._replaceInputElement.value);delete this._currentQuery;this._performSearch(true,true);},_replaceAll:function()
{var searchConfig=this._currentSearchConfig();(this._searchProvider).replaceAllWith(searchConfig,this._replaceInputElement.value);},_onInput:function(event)
{if(this._valueChangedTimeoutId)
clearTimeout(this._valueChangedTimeoutId);var timeout=this._searchInputElement.value.length<3?200:0;this._valueChangedTimeoutId=setTimeout(this._onValueChanged.bind(this),timeout);},_onValueChanged:function()
{delete this._valueChangedTimeoutId;this._performSearch(false,true);},__proto__:WebInspector.VBox.prototype}
WebInspector.Searchable=function()
{}
WebInspector.Searchable.prototype={searchCanceled:function(){},performSearch:function(searchConfig,shouldJump,jumpBackwards){},jumpToNextSearchResult:function(){},jumpToPreviousSearchResult:function(){},supportsCaseSensitiveSearch:function(){},supportsRegexSearch:function(){}}
WebInspector.Replaceable=function()
{}
WebInspector.Replaceable.prototype={replaceSelectionWith:function(searchConfig,replacement){},replaceAllWith:function(searchConfig,replacement){}}
WebInspector.SearchableView.SearchConfig=function(query,caseSensitive,isRegex)
{this.query=query;this.caseSensitive=caseSensitive;this.isRegex=isRegex;}
WebInspector.SearchableView.SearchConfig.prototype={toSearchRegex:function(global)
{var modifiers=this.caseSensitive?"":"i";if(global)
modifiers+="g";var query=this.isRegex?"/"+this.query+"/":this.query;var regex;try{if(/^\/.+\/$/.test(query)){regex=new RegExp(query.substring(1,query.length-1),modifiers);regex.__fromRegExpQuery=true;}}catch(e){}
if(!regex)
regex=createPlainTextSearchRegex(query,modifiers);return regex;}};WebInspector.Section=function(title,subtitle)
{this.element=createElementWithClass("div","section");this.element._section=this;this.registerRequiredCSS("ui/section.css");this.headerElement=createElementWithClass("div","header monospace");this.titleElement=createElementWithClass("div","title");this.subtitleElement=createElementWithClass("div","subtitle");this.headerElement.appendChild(this.subtitleElement);this.headerElement.appendChild(this.titleElement);this.headerElement.addEventListener("click",this.handleClick.bind(this),false);this.element.appendChild(this.headerElement);this.title=title;if(subtitle){this._subtitle=subtitle;this.subtitleElement.textContent=subtitle;}
this._expanded=false;}
WebInspector.Section.prototype={get title()
{return this._title;},set title(x)
{if(this._title===x)
return;this._title=x;if(x instanceof Node){this.titleElement.removeChildren();this.titleElement.appendChild(x);}else
this.titleElement.textContent=x;},get subtitle()
{return this._subtitle;},get expanded()
{return this._expanded;},repopulate:function()
{this._populated=false;if(this._expanded){this.onpopulate();this._populated=true;}},onpopulate:function()
{},expand:function()
{if(this._expanded)
return;this._expanded=true;this.element.classList.add("expanded");if(!this._populated){this.onpopulate();this._populated=true;}},collapse:function()
{if(!this._expanded)
return;this._expanded=false;this.element.classList.remove("expanded");},registerRequiredCSS:function(cssFile)
{WebInspector.appendStyle(this.element,cssFile);},handleClick:function(event)
{if(this._doNotExpandOnTitleClick)
return;if(this._expanded)
this.collapse();else
this.expand();event.consume();},doNotExpandOnTitleClick:function()
{this._doNotExpandOnTitleClick=true;}}
WebInspector.PropertiesSection=function(title,subtitle)
{WebInspector.Section.call(this,title,subtitle);this.registerRequiredCSS("ui/propertiesSection.css");this.propertiesTreeOutline=new TreeOutline(true);this.propertiesElement=this.propertiesTreeOutline.element;this.propertiesElement.classList.add("properties","properties-tree","monospace");this.propertiesTreeOutline.setFocusable(false);this.propertiesTreeOutline.section=this;this.element.appendChild(this.propertiesElement);}
WebInspector.PropertiesSection.prototype={__proto__:WebInspector.Section.prototype};WebInspector.SettingsUI={}
WebInspector.SettingsUI.createSettingCheckbox=function(name,setting,omitParagraphElement,tooltip)
{var label=createCheckboxLabel(name);if(tooltip)
label.title=tooltip;var input=label.checkboxElement;input.name=name;WebInspector.SettingsUI.bindCheckbox(input,setting);if(omitParagraphElement)
return label;var p=createElement("p");p.appendChild(label);return p;}
WebInspector.SettingsUI.bindCheckbox=function(input,setting)
{function settingChanged()
{if(input.checked!==setting.get())
input.checked=setting.get();}
setting.addChangeListener(settingChanged);settingChanged();function inputChanged()
{if(setting.get()!==input.checked)
setting.set(input.checked);}
input.addEventListener("change",inputChanged,false);}
WebInspector.SettingsUI.createSettingInputField=function(label,setting,numeric,maxLength,width,validatorCallback,instant,clearForZero,placeholder)
{var p=createElement("p");var labelElement=p.createChild("label");labelElement.textContent=label;var inputElement=p.createChild("input");inputElement.type="text";if(numeric)
inputElement.className="numeric";if(maxLength)
inputElement.maxLength=maxLength;if(width)
inputElement.style.width=width;inputElement.placeholder=placeholder||"";var errorMessageLabel;if(validatorCallback)
errorMessageLabel=p.createChild("div","field-error-message");WebInspector.SettingsUI.bindSettingInputField(inputElement,setting,numeric,validatorCallback,instant,clearForZero,errorMessageLabel);return p;}
WebInspector.SettingsUI.bindSettingInputField=function(inputElement,setting,numeric,validatorCallback,instant,clearForZero,errorMessageLabel)
{if(validatorCallback||instant){inputElement.addEventListener("change",onInput,false);inputElement.addEventListener("input",onInput,false);}
inputElement.addEventListener("keydown",onKeyDown,false);function onInput()
{if(validatorCallback)
validate();if(instant)
apply();}
function onKeyDown(event)
{if(isEnterKey(event))
apply();incrementForArrows(event);}
function incrementForArrows(event)
{if(!numeric)
return;var increment=event.keyIdentifier==="Up"?1:event.keyIdentifier==="Down"?-1:0;if(!increment)
return;if(event.shiftKey)
increment*=10;var value=inputElement.value;if(validatorCallback&&validatorCallback(value))
return;value=Number(value);if(clearForZero&&!value)
return;value+=increment;if(clearForZero&&!value)
return;value=String(value);if(validatorCallback&&validatorCallback(value))
return;inputElement.value=value;apply();event.preventDefault();}
function validate()
{var error=validatorCallback(inputElement.value);if(!error)
error="";inputElement.classList.toggle("error-input",!!error);if(errorMessageLabel)
errorMessageLabel.textContent=error;}
if(!instant)
inputElement.addEventListener("blur",apply,false);function apply()
{if(validatorCallback&&validatorCallback(inputElement.value))
return;setting.removeChangeListener(onSettingChange);setting.set(numeric?Number(inputElement.value):inputElement.value);setting.addChangeListener(onSettingChange);}
setting.addChangeListener(onSettingChange);function onSettingChange()
{var value=setting.get();if(clearForZero&&!value)
value="";inputElement.value=value;validate();}
onSettingChange();if(validatorCallback)
validate();}
WebInspector.SettingsUI.createCustomSetting=function(name,element)
{var p=createElement("p");var fieldsetElement=p.createChild("fieldset");fieldsetElement.createChild("label").textContent=name;fieldsetElement.appendChild(element);return p;}
WebInspector.SettingsUI.createSettingFieldset=function(setting)
{var fieldset=createElement("fieldset");fieldset.disabled=!setting.get();setting.addChangeListener(settingChanged);return fieldset;function settingChanged()
{fieldset.disabled=!setting.get();}}
WebInspector.SettingsUI.regexValidator=function(text)
{var regex;try{regex=new RegExp(text);}catch(e){}
return regex?null:WebInspector.UIString("Invalid pattern");}
WebInspector.SettingsUI.createInput=function(parentElement,id,defaultText,eventListener,numeric,size)
{var element=parentElement.createChild("input");element.id=id;element.type="text";element.maxLength=12;element.style.width=size||"80px";element.value=defaultText;element.align="right";if(numeric)
element.className="numeric";element.addEventListener("input",eventListener,false);element.addEventListener("keydown",keyDownListener,false);function keyDownListener(event)
{if(isEnterKey(event))
eventListener(event);}
return element;}
WebInspector.SettingUI=function()
{}
WebInspector.SettingUI.prototype={settingElement:function(){}};WebInspector.SidebarSectionTreeElement=function(title)
{TreeElement.call(this,title.escapeHTML(),true);this.expand();}
WebInspector.SidebarSectionTreeElement.prototype={selectable:false,collapse:function()
{},get smallChildren()
{return this._smallChildren;},set smallChildren(x)
{if(this._smallChildren===x)
return;this._smallChildren=x;this._childrenListNode.classList.toggle("small",this._smallChildren);},onattach:function()
{this.listItemElement.classList.add("sidebar-tree-section");},__proto__:TreeElement.prototype}
WebInspector.SidebarTreeElement=function(className,title,subtitle,expandable)
{TreeElement.call(this,"",expandable);if(expandable)
this.disclosureButton=createElementWithClass("button","disclosure-button");this.iconElement=createElementWithClass("div","icon");this.statusElement=createElementWithClass("div","status");this._titlesElement=createElementWithClass("div","titles");this.titleContainer=this._titlesElement.createChild("span","title-container");this.titleElement=this.titleContainer.createChild("span","title");this.subtitleElement=this._titlesElement.createChild("span","subtitle");this.className=className;this.mainTitle=title;this.subtitle=subtitle;}
WebInspector.SidebarTreeElement.prototype={get small()
{return this._small;},set small(x)
{this._small=x;if(this.listItemElement)
this.listItemElement.classList.toggle("small",this._small);},get mainTitle()
{return this._mainTitle;},set mainTitle(x)
{this._mainTitle=x;this.refreshTitles();},get subtitle()
{return this._subtitle;},set subtitle(x)
{this._subtitle=x;this.refreshTitles();},set wait(x)
{this.listItemElement.classList.toggle("wait",x);},refreshTitles:function()
{var mainTitle=this.mainTitle;if(this.titleElement.textContent!==mainTitle)
this.titleElement.textContent=mainTitle;var subtitle=this.subtitle;if(subtitle){if(this.subtitleElement.textContent!==subtitle)
this.subtitleElement.textContent=subtitle;this._titlesElement.classList.remove("no-subtitle");}else{this.subtitleElement.textContent="";this._titlesElement.classList.add("no-subtitle");}},isEventWithinDisclosureTriangle:function(event)
{return event.target===this.disclosureButton;},onattach:function()
{this.listItemElement.classList.add("sidebar-tree-item");if(this.className)
this.listItemElement.classList.add(this.className);if(this.small)
this.listItemElement.classList.add("small");if(this.isExpandable()&&this.disclosureButton)
this.listItemElement.appendChild(this.disclosureButton);this.listItemElement.appendChildren(this.iconElement,this.statusElement,this._titlesElement);},__proto__:TreeElement.prototype};WebInspector.SoftContextMenu=function(items,itemSelectedCallback,parentMenu)
{this._items=items;this._itemSelectedCallback=itemSelectedCallback;this._parentMenu=parentMenu;}
WebInspector.SoftContextMenu.prototype={show:function(document,x,y)
{if(!this._items.length)
return;this._document=document;this._x=x;this._y=y;this._time=new Date().getTime();this.element=createElementWithClass("div","soft-context-menu");var root=WebInspector.createShadowRootWithCoreStyles(this.element,"ui/softContextMenu.css");this._contextMenuElement=root.createChild("div");this.element.style.top=y+"px";var subMenuOverlap=3;this.element.style.left=(this._parentMenu?x-subMenuOverlap:x)+"px";this._contextMenuElement.tabIndex=0;this._contextMenuElement.addEventListener("mouseup",consumeEvent,false);this._contextMenuElement.addEventListener("keydown",this._menuKeyDown.bind(this),false);for(var i=0;i<this._items.length;++i)
this._contextMenuElement.appendChild(this._createMenuItem(this._items[i]));if(!this._parentMenu){this._glassPaneElement=createElementWithClass("div","soft-context-menu-glass-pane fill");this._glassPaneElement.tabIndex=0;this._glassPaneElement.addEventListener("mouseup",this._glassPaneMouseUp.bind(this),false);this._glassPaneElement.appendChild(this.element);document.body.appendChild(this._glassPaneElement);this._discardMenuOnResizeListener=this._discardMenu.bind(this,true);document.defaultView.addEventListener("resize",this._discardMenuOnResizeListener,false);}else{this._parentMenu._parentGlassPaneElement().appendChild(this.element);}
if(document.body.offsetWidth<this.element.offsetLeft+this.element.offsetWidth){this.element.style.left=Math.max(WebInspector.Dialog.modalHostView().element.totalOffsetLeft(),this._parentMenu?this._parentMenu.element.offsetLeft-this.element.offsetWidth+subMenuOverlap:document.body.offsetWidth-this.element.offsetWidth)+"px";}
if(this._parentMenu&&document.body.offsetHeight<this.element.offsetTop+this.element.offsetHeight){y=Math.max(WebInspector.Dialog.modalHostView().element.totalOffsetTop(),document.body.offsetHeight-this.element.offsetHeight);this.element.style.top=y+"px";}
var maxHeight=WebInspector.Dialog.modalHostView().element.offsetHeight;maxHeight-=y-WebInspector.Dialog.modalHostView().element.totalOffsetTop();this.element.style.maxHeight=maxHeight+"px";this._focus();},discard:function()
{this._discardMenu(true);},_parentGlassPaneElement:function()
{if(this._glassPaneElement)
return this._glassPaneElement;if(this._parentMenu)
return this._parentMenu._parentGlassPaneElement();return null;},_createMenuItem:function(item)
{if(item.type==="separator")
return this._createSeparator();if(item.type==="subMenu")
return this._createSubMenu(item);var menuItemElement=createElementWithClass("div","soft-context-menu-item");var checkMarkElement=menuItemElement.createChild("div","checkmark");if(!item.checked)
checkMarkElement.style.opacity="0";if(item.element){var wrapper=menuItemElement.createChild("div","soft-context-menu-custom-item");wrapper.appendChild(item.element);menuItemElement._isCustom=true;return menuItemElement;}
if(!item.enabled)
menuItemElement.classList.add("soft-context-menu-disabled");menuItemElement.createTextChild(item.label);menuItemElement.createChild("span","soft-context-menu-shortcut").textContent=item.shortcut;menuItemElement.addEventListener("mousedown",this._menuItemMouseDown.bind(this),false);menuItemElement.addEventListener("mouseup",this._menuItemMouseUp.bind(this),false);menuItemElement.addEventListener("mouseover",this._menuItemMouseOver.bind(this),false);menuItemElement.addEventListener("mouseleave",this._menuItemMouseLeave.bind(this),false);menuItemElement._actionId=item.id;return menuItemElement;},_createSubMenu:function(item)
{var menuItemElement=createElementWithClass("div","soft-context-menu-item");menuItemElement._subItems=item.subItems;var checkMarkElement=menuItemElement.createChild("span","soft-context-menu-item-checkmark checkmark");checkMarkElement.textContent="\u2713 ";checkMarkElement.style.opacity="0";menuItemElement.createTextChild(item.label);var subMenuArrowElement=menuItemElement.createChild("span","soft-context-menu-item-submenu-arrow");subMenuArrowElement.textContent="\u25B6";menuItemElement.addEventListener("mousedown",this._menuItemMouseDown.bind(this),false);menuItemElement.addEventListener("mouseup",this._menuItemMouseUp.bind(this),false);menuItemElement.addEventListener("mouseover",this._menuItemMouseOver.bind(this),false);menuItemElement.addEventListener("mouseleave",this._menuItemMouseLeave.bind(this),false);return menuItemElement;},_createSeparator:function()
{var separatorElement=createElementWithClass("div","soft-context-menu-separator");separatorElement._isSeparator=true;separatorElement.createChild("div","separator-line");return separatorElement;},_menuItemMouseDown:function(event)
{event.consume(true);},_menuItemMouseUp:function(event)
{this._triggerAction(event.target,event);event.consume();},_focus:function()
{this._contextMenuElement.focus();},_triggerAction:function(menuItemElement,event)
{if(!menuItemElement._subItems){this._discardMenu(true,event);if(typeof menuItemElement._actionId!=="undefined"){this._itemSelectedCallback(menuItemElement._actionId);delete menuItemElement._actionId;}
return;}
this._showSubMenu(menuItemElement);event.consume();},_showSubMenu:function(menuItemElement)
{if(menuItemElement._subMenuTimer){clearTimeout(menuItemElement._subMenuTimer);delete menuItemElement._subMenuTimer;}
if(this._subMenu)
return;this._subMenu=new WebInspector.SoftContextMenu(menuItemElement._subItems,this._itemSelectedCallback,this);var topPadding=4;this._subMenu.show(this._document,menuItemElement.totalOffsetLeft()+menuItemElement.offsetWidth,menuItemElement.totalOffsetTop()-1-topPadding);},_hideSubMenu:function()
{if(!this._subMenu)
return;this._subMenu._discardSubMenus();this._focus();},_menuItemMouseOver:function(event)
{this._highlightMenuItem(event.target,true);},_menuItemMouseLeave:function(event)
{if(!this._subMenu||!event.relatedTarget){this._highlightMenuItem(null,true);return;}
var relatedTarget=event.relatedTarget;if(relatedTarget.classList.contains("soft-context-menu-glass-pane"))
this._highlightMenuItem(null,true);},_highlightMenuItem:function(menuItemElement,scheduleSubMenu)
{if(this._highlightedMenuItemElement===menuItemElement)
return;this._hideSubMenu();if(this._highlightedMenuItemElement){this._highlightedMenuItemElement.classList.remove("soft-context-menu-item-mouse-over");if(this._highlightedMenuItemElement._subItems&&this._highlightedMenuItemElement._subMenuTimer){clearTimeout(this._highlightedMenuItemElement._subMenuTimer);delete this._highlightedMenuItemElement._subMenuTimer;}}
this._highlightedMenuItemElement=menuItemElement;if(this._highlightedMenuItemElement){this._highlightedMenuItemElement.classList.add("soft-context-menu-item-mouse-over");this._contextMenuElement.focus();if(scheduleSubMenu&&this._highlightedMenuItemElement._subItems&&!this._highlightedMenuItemElement._subMenuTimer)
this._highlightedMenuItemElement._subMenuTimer=setTimeout(this._showSubMenu.bind(this,this._highlightedMenuItemElement),150);}},_highlightPrevious:function()
{var menuItemElement=this._highlightedMenuItemElement?this._highlightedMenuItemElement.previousSibling:this._contextMenuElement.lastChild;while(menuItemElement&&(menuItemElement._isSeparator||menuItemElement._isCustom))
menuItemElement=menuItemElement.previousSibling;if(menuItemElement)
this._highlightMenuItem(menuItemElement,false);},_highlightNext:function()
{var menuItemElement=this._highlightedMenuItemElement?this._highlightedMenuItemElement.nextSibling:this._contextMenuElement.firstChild;while(menuItemElement&&(menuItemElement._isSeparator||menuItemElement._isCustom))
menuItemElement=menuItemElement.nextSibling;if(menuItemElement)
this._highlightMenuItem(menuItemElement,false);},_menuKeyDown:function(event)
{switch(event.keyIdentifier){case"Up":this._highlightPrevious();break;case"Down":this._highlightNext();break;case"Left":if(this._parentMenu){this._highlightMenuItem(null,false);this._parentMenu._hideSubMenu();}
break;case"Right":if(!this._highlightedMenuItemElement)
break;if(this._highlightedMenuItemElement._subItems){this._showSubMenu(this._highlightedMenuItemElement);this._subMenu._focus();this._subMenu._highlightNext();}
break;case"U+001B":this._discardMenu(false,event);break;case"Enter":if(!isEnterKey(event))
break;case"U+0020":if(this._highlightedMenuItemElement)
this._triggerAction(this._highlightedMenuItemElement,event);if(this._highlightedMenuItemElement._subItems){this._subMenu._focus();this._subMenu._highlightNext();}
break;}
event.consume(true);},_glassPaneMouseUp:function(event)
{if(new Date().getTime()-this._time<300)
return;if(event.target===this.element)
return;this._discardMenu(true,event);event.consume();},_discardMenu:function(closeParentMenus,event)
{if(this._subMenu&&!closeParentMenus)
return;if(this._glassPaneElement){var glassPane=this._glassPaneElement;delete this._glassPaneElement;this._document.body.removeChild(glassPane);if(this._parentMenu){delete this._parentMenu._subMenu;if(closeParentMenus)
this._parentMenu._discardMenu(closeParentMenus,event);else
this._parentMenu._focus();}
if(event)
event.consume(true);}else if(this._parentMenu&&this._contextMenuElement.parentElementOrShadowHost()){this._discardSubMenus();if(closeParentMenus)
this._parentMenu._discardMenu(closeParentMenus,event);else
this._parentMenu._focus();if(event)
event.consume(true);}
if(this._discardMenuOnResizeListener){this._document.defaultView.removeEventListener("resize",this._discardMenuOnResizeListener,false);delete this._discardMenuOnResizeListener;}},_discardSubMenus:function()
{if(this._subMenu)
this._subMenu._discardSubMenus();this.element.remove();if(this._parentMenu)
delete this._parentMenu._subMenu;}};WebInspector.SplitWidget=function(isVertical,secondIsSidebar,settingName,defaultSidebarWidth,defaultSidebarHeight,constraintsInDip)
{WebInspector.Widget.call(this,true);this.element.classList.add("split-widget");this.registerRequiredCSS("ui/splitWidget.css");this.contentElement.classList.add("shadow-split-widget");this._mainElement=this.contentElement.createChild("div","shadow-split-widget-contents shadow-split-widget-main vbox");this._mainElement.createChild("content").select=".insertion-point-main";this._sidebarElement=this.contentElement.createChild("div","shadow-split-widget-contents shadow-split-widget-sidebar vbox");this._sidebarElement.createChild("content").select=".insertion-point-sidebar";this._resizerElement=this.contentElement.createChild("div","shadow-split-widget-resizer");this._resizerWidget=new WebInspector.SimpleResizerWidget();this._resizerWidget.setEnabled(true);this._resizerWidget.addEventListener(WebInspector.ResizerWidget.Events.ResizeStart,this._onResizeStart,this);this._resizerWidget.addEventListener(WebInspector.ResizerWidget.Events.ResizeUpdate,this._onResizeUpdate,this);this._resizerWidget.addEventListener(WebInspector.ResizerWidget.Events.ResizeEnd,this._onResizeEnd,this);this._defaultSidebarWidth=defaultSidebarWidth||200;this._defaultSidebarHeight=defaultSidebarHeight||this._defaultSidebarWidth;this._constraintsInDip=!!constraintsInDip;this._setting=settingName?WebInspector.settings.createSetting(settingName,{}):null;this.setSecondIsSidebar(secondIsSidebar);this._innerSetVertical(isVertical);this._showMode=WebInspector.SplitWidget.ShowMode.Both;this.installResizer(this._resizerElement);}
WebInspector.SplitWidget.SettingForOrientation;WebInspector.SplitWidget.ShowMode={Both:"Both",OnlyMain:"OnlyMain",OnlySidebar:"OnlySidebar"}
WebInspector.SplitWidget.Events={SidebarSizeChanged:"SidebarSizeChanged",ShowModeChanged:"ShowModeChanged"}
WebInspector.SplitWidget.MinPadding=20;WebInspector.SplitWidget.prototype={isVertical:function()
{return this._isVertical;},setVertical:function(isVertical)
{if(this._isVertical===isVertical)
return;this._innerSetVertical(isVertical);if(this.isShowing())
this._updateLayout();},_innerSetVertical:function(isVertical)
{this.contentElement.classList.toggle("vbox",!isVertical);this.contentElement.classList.toggle("hbox",isVertical);this._isVertical=isVertical;delete this._resizerElementSize;this._sidebarSizeDIP=-1;this._restoreSidebarSizeFromSettings();if(this._shouldSaveShowMode)
this._restoreAndApplyShowModeFromSettings();this._updateShowHideSidebarButton();this._resizerWidget.setVertical(!isVertical);this.invalidateConstraints();},_updateLayout:function(animate)
{delete this._totalSizeCSS;delete this._totalSizeOtherDimensionCSS;this._mainElement.style.removeProperty("width");this._mainElement.style.removeProperty("height");this._sidebarElement.style.removeProperty("width");this._sidebarElement.style.removeProperty("height");this._innerSetSidebarSizeDIP(this._preferredSidebarSizeDIP(),!!animate);},setMainWidget:function(widget)
{if(this._mainWidget)
this._mainWidget.detach();this._mainWidget=widget;if(widget){widget.element.classList.add("insertion-point-main");widget.element.classList.remove("insertion-point-sidebar");if(this._showMode===WebInspector.SplitWidget.ShowMode.OnlyMain||this._showMode===WebInspector.SplitWidget.ShowMode.Both)
widget.show(this.element);}},setSidebarWidget:function(widget)
{if(this._sidebarWidget)
this._sidebarWidget.detach();this._sidebarWidget=widget;if(widget){widget.element.classList.add("insertion-point-sidebar");widget.element.classList.remove("insertion-point-main");if(this._showMode===WebInspector.SplitWidget.ShowMode.OnlySidebar||this._showMode===WebInspector.SplitWidget.ShowMode.Both)
widget.show(this.element);}},mainWidget:function()
{return this._mainWidget;},sidebarWidget:function()
{return this._sidebarWidget;},childWasDetached:function(widget)
{if(this._detaching)
return;if(this._mainWidget===widget)
delete this._mainWidget;if(this._sidebarWidget===widget)
delete this._sidebarWidget;},isSidebarSecond:function()
{return this._secondIsSidebar;},enableShowModeSaving:function()
{this._shouldSaveShowMode=true;this._restoreAndApplyShowModeFromSettings();},showMode:function()
{return this._showMode;},setSecondIsSidebar:function(secondIsSidebar)
{this.contentElement.classList.toggle("shadow-split-widget-first-is-sidebar",!secondIsSidebar);this._secondIsSidebar=secondIsSidebar;},sidebarSide:function()
{if(this._showMode!==WebInspector.SplitWidget.ShowMode.Both)
return null;return this._isVertical?(this._secondIsSidebar?"right":"left"):(this._secondIsSidebar?"bottom":"top");},resizerElement:function()
{return this._resizerElement;},hideMain:function(animate)
{this._showOnly(this._sidebarWidget,this._mainWidget,this._sidebarElement,this._mainElement,animate);this._updateShowMode(WebInspector.SplitWidget.ShowMode.OnlySidebar);},hideSidebar:function(animate)
{this._showOnly(this._mainWidget,this._sidebarWidget,this._mainElement,this._sidebarElement,animate);this._updateShowMode(WebInspector.SplitWidget.ShowMode.OnlyMain);},_showOnly:function(sideToShow,sideToHide,shadowToShow,shadowToHide,animate)
{this._cancelAnimation();function callback()
{if(sideToShow){if(sideToShow===this._mainWidget)
this._mainWidget.show(this.element,this._sidebarWidget?this._sidebarWidget.element:null);else
this._sidebarWidget.show(this.element);}
if(sideToHide){this._detaching=true;sideToHide.detach();delete this._detaching;}
this._resizerElement.classList.add("hidden");shadowToShow.classList.remove("hidden");shadowToShow.classList.add("maximized");shadowToHide.classList.add("hidden");shadowToHide.classList.remove("maximized");this._removeAllLayoutProperties();this.doResize();}
if(animate)
this._animate(true,callback.bind(this));else
callback.call(this);this._sidebarSizeDIP=-1;this.setResizable(false);},_removeAllLayoutProperties:function()
{this._sidebarElement.style.removeProperty("flexBasis");this._mainElement.style.removeProperty("width");this._mainElement.style.removeProperty("height");this._sidebarElement.style.removeProperty("width");this._sidebarElement.style.removeProperty("height");this._resizerElement.style.removeProperty("left");this._resizerElement.style.removeProperty("right");this._resizerElement.style.removeProperty("top");this._resizerElement.style.removeProperty("bottom");this._resizerElement.style.removeProperty("margin-left");this._resizerElement.style.removeProperty("margin-right");this._resizerElement.style.removeProperty("margin-top");this._resizerElement.style.removeProperty("margin-bottom");},showBoth:function(animate)
{if(this._showMode===WebInspector.SplitWidget.ShowMode.Both)
animate=false;this._cancelAnimation();this._mainElement.classList.remove("maximized","hidden");this._sidebarElement.classList.remove("maximized","hidden");this._resizerElement.classList.remove("hidden");if(this._sidebarWidget)
this._sidebarWidget.show(this.element);if(this._mainWidget)
this._mainWidget.show(this.element,this._sidebarWidget?this._sidebarWidget.element:null);this.setSecondIsSidebar(this._secondIsSidebar);this._sidebarSizeDIP=-1;this.setResizable(true);this._updateShowMode(WebInspector.SplitWidget.ShowMode.Both);this._updateLayout(animate);},setResizable:function(resizable)
{this._resizerWidget.setEnabled(resizable);},isResizable:function()
{return this._resizerWidget.isEnabled();},setSidebarSize:function(size)
{var sizeDIP=WebInspector.zoomManager.cssToDIP(size);this._savedSidebarSizeDIP=sizeDIP;this._saveSetting();this._innerSetSidebarSizeDIP(sizeDIP,false,true);},sidebarSize:function()
{var sizeDIP=Math.max(0,this._sidebarSizeDIP);return WebInspector.zoomManager.dipToCSS(sizeDIP);},_totalSizeDIP:function()
{if(!this._totalSizeCSS){this._totalSizeCSS=this._isVertical?this.contentElement.offsetWidth:this.contentElement.offsetHeight;this._totalSizeOtherDimensionCSS=this._isVertical?this.contentElement.offsetHeight:this.contentElement.offsetWidth;}
return WebInspector.zoomManager.cssToDIP(this._totalSizeCSS);},_updateShowMode:function(showMode)
{this._showMode=showMode;this._saveShowModeToSettings();this._updateShowHideSidebarButton();this.dispatchEventToListeners(WebInspector.SplitWidget.Events.ShowModeChanged,showMode);this.invalidateConstraints();},_innerSetSidebarSizeDIP:function(sizeDIP,animate,userAction)
{if(this._showMode!==WebInspector.SplitWidget.ShowMode.Both||!this.isShowing())
return;sizeDIP=this._applyConstraints(sizeDIP,userAction);if(this._sidebarSizeDIP===sizeDIP)
return;if(!this._resizerElementSize)
this._resizerElementSize=this._isVertical?this._resizerElement.offsetWidth:this._resizerElement.offsetHeight;this._removeAllLayoutProperties();var sidebarSizeValue=WebInspector.zoomManager.dipToCSS(sizeDIP)+"px";var mainSizeValue=(this._totalSizeCSS-WebInspector.zoomManager.dipToCSS(sizeDIP))+"px";this._sidebarElement.style.flexBasis=sidebarSizeValue;if(this._isVertical){this._sidebarElement.style.width=sidebarSizeValue;this._mainElement.style.width=mainSizeValue;this._sidebarElement.style.height=this._totalSizeOtherDimensionCSS+"px";this._mainElement.style.height=this._totalSizeOtherDimensionCSS+"px";}else{this._sidebarElement.style.height=sidebarSizeValue;this._mainElement.style.height=mainSizeValue;this._sidebarElement.style.width=this._totalSizeOtherDimensionCSS+"px";this._mainElement.style.width=this._totalSizeOtherDimensionCSS+"px";}
if(this._isVertical){if(this._secondIsSidebar){this._resizerElement.style.right=sidebarSizeValue;this._resizerElement.style.marginRight=-this._resizerElementSize/2+"px";}else{this._resizerElement.style.left=sidebarSizeValue;this._resizerElement.style.marginLeft=-this._resizerElementSize/2+"px";}}else{if(this._secondIsSidebar){this._resizerElement.style.bottom=sidebarSizeValue;this._resizerElement.style.marginBottom=-this._resizerElementSize/2+"px";}else{this._resizerElement.style.top=sidebarSizeValue;this._resizerElement.style.marginTop=-this._resizerElementSize/2+"px";}}
this._sidebarSizeDIP=sizeDIP;if(animate){this._animate(false);}else{this.doResize();this.dispatchEventToListeners(WebInspector.SplitWidget.Events.SidebarSizeChanged,this.sidebarSize());}},_animate:function(reverse,callback)
{var animationTime=50;this._animationCallback=callback;var animatedMarginPropertyName;if(this._isVertical)
animatedMarginPropertyName=this._secondIsSidebar?"margin-right":"margin-left";else
animatedMarginPropertyName=this._secondIsSidebar?"margin-bottom":"margin-top";var marginFrom=reverse?"0":"-"+WebInspector.zoomManager.dipToCSS(this._sidebarSizeDIP)+"px";var marginTo=reverse?"-"+WebInspector.zoomManager.dipToCSS(this._sidebarSizeDIP)+"px":"0";this.contentElement.style.setProperty(animatedMarginPropertyName,marginFrom);if(!reverse){suppressUnused(this._mainElement.offsetWidth);suppressUnused(this._sidebarElement.offsetWidth);}
if(!reverse)
this._sidebarWidget.doResize();this.contentElement.style.setProperty("transition",animatedMarginPropertyName+" "+animationTime+"ms linear");var boundAnimationFrame;var startTime;function animationFrame()
{delete this._animationFrameHandle;if(!startTime){this.contentElement.style.setProperty(animatedMarginPropertyName,marginTo);startTime=window.performance.now();}else if(window.performance.now()<startTime+animationTime){if(this._mainWidget)
this._mainWidget.doResize();}else{this._cancelAnimation();if(this._mainWidget)
this._mainWidget.doResize();this.dispatchEventToListeners(WebInspector.SplitWidget.Events.SidebarSizeChanged,this.sidebarSize());return;}
this._animationFrameHandle=this.contentElement.window().requestAnimationFrame(boundAnimationFrame);}
boundAnimationFrame=animationFrame.bind(this);this._animationFrameHandle=this.contentElement.window().requestAnimationFrame(boundAnimationFrame);},_cancelAnimation:function()
{this.contentElement.style.removeProperty("margin-top");this.contentElement.style.removeProperty("margin-right");this.contentElement.style.removeProperty("margin-bottom");this.contentElement.style.removeProperty("margin-left");this.contentElement.style.removeProperty("transition");if(this._animationFrameHandle){this.contentElement.window().cancelAnimationFrame(this._animationFrameHandle);delete this._animationFrameHandle;}
if(this._animationCallback){this._animationCallback();delete this._animationCallback;}},_applyConstraints:function(sidebarSize,userAction)
{var totalSize=this._totalSizeDIP();var zoomFactor=this._constraintsInDip?1:WebInspector.zoomManager.zoomFactor();var constraints=this._sidebarWidget?this._sidebarWidget.constraints():new Constraints();var minSidebarSize=this.isVertical()?constraints.minimum.width:constraints.minimum.height;if(!minSidebarSize)
minSidebarSize=WebInspector.SplitWidget.MinPadding;minSidebarSize*=zoomFactor;var preferredSidebarSize=this.isVertical()?constraints.preferred.width:constraints.preferred.height;if(!preferredSidebarSize)
preferredSidebarSize=WebInspector.SplitWidget.MinPadding;preferredSidebarSize*=zoomFactor;if(sidebarSize<preferredSidebarSize)
preferredSidebarSize=Math.max(sidebarSize,minSidebarSize);preferredSidebarSize+=zoomFactor;constraints=this._mainWidget?this._mainWidget.constraints():new Constraints();var minMainSize=this.isVertical()?constraints.minimum.width:constraints.minimum.height;if(!minMainSize)
minMainSize=WebInspector.SplitWidget.MinPadding;minMainSize*=zoomFactor;var preferredMainSize=this.isVertical()?constraints.preferred.width:constraints.preferred.height;if(!preferredMainSize)
preferredMainSize=WebInspector.SplitWidget.MinPadding;preferredMainSize*=zoomFactor;var savedMainSize=this.isVertical()?this._savedVerticalMainSize:this._savedHorizontalMainSize;if(typeof savedMainSize!=="undefined")
preferredMainSize=Math.min(preferredMainSize,savedMainSize*zoomFactor);if(userAction)
preferredMainSize=minMainSize;var totalPreferred=preferredMainSize+preferredSidebarSize;if(totalPreferred<=totalSize)
return Number.constrain(sidebarSize,preferredSidebarSize,totalSize-preferredMainSize);if(minMainSize+minSidebarSize<=totalSize){var delta=totalPreferred-totalSize;var sidebarDelta=delta*preferredSidebarSize/totalPreferred;sidebarSize=preferredSidebarSize-sidebarDelta;return Number.constrain(sidebarSize,minSidebarSize,totalSize-minMainSize);}
return Math.max(0,totalSize-minMainSize);},wasShown:function()
{this._forceUpdateLayout();WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged,this._onZoomChanged,this);},willHide:function()
{WebInspector.zoomManager.removeEventListener(WebInspector.ZoomManager.Events.ZoomChanged,this._onZoomChanged,this);},onResize:function()
{this._updateLayout();},onLayout:function()
{this._updateLayout();},calculateConstraints:function()
{if(this._showMode===WebInspector.SplitWidget.ShowMode.OnlyMain)
return this._mainWidget?this._mainWidget.constraints():new Constraints();if(this._showMode===WebInspector.SplitWidget.ShowMode.OnlySidebar)
return this._sidebarWidget?this._sidebarWidget.constraints():new Constraints();var mainConstraints=this._mainWidget?this._mainWidget.constraints():new Constraints();var sidebarConstraints=this._sidebarWidget?this._sidebarWidget.constraints():new Constraints();var min=WebInspector.SplitWidget.MinPadding;if(this._isVertical){mainConstraints=mainConstraints.widthToMax(min).addWidth(1);sidebarConstraints=sidebarConstraints.widthToMax(min);return mainConstraints.addWidth(sidebarConstraints).heightToMax(sidebarConstraints);}else{mainConstraints=mainConstraints.heightToMax(min).addHeight(1);sidebarConstraints=sidebarConstraints.heightToMax(min);return mainConstraints.widthToMax(sidebarConstraints).addHeight(sidebarConstraints);}},_onResizeStart:function(event)
{this._resizeStartSizeDIP=this._sidebarSizeDIP;},_onResizeUpdate:function(event)
{var offset=event.data.currentPosition-event.data.startPosition;var offsetDIP=WebInspector.zoomManager.cssToDIP(offset);var newSizeDIP=this._secondIsSidebar?this._resizeStartSizeDIP-offsetDIP:this._resizeStartSizeDIP+offsetDIP;var constrainedSizeDIP=this._applyConstraints(newSizeDIP,true);this._savedSidebarSizeDIP=constrainedSizeDIP;this._saveSetting();this._innerSetSidebarSizeDIP(constrainedSizeDIP,false,true);if(this.isVertical())
this._savedVerticalMainSize=this._totalSizeDIP()-this._sidebarSizeDIP;else
this._savedHorizontalMainSize=this._totalSizeDIP()-this._sidebarSizeDIP;},_onResizeEnd:function(event)
{delete this._resizeStartSizeDIP;},hideDefaultResizer:function()
{this.uninstallResizer(this._resizerElement);},installResizer:function(resizerElement)
{this._resizerWidget.addElement(resizerElement);},uninstallResizer:function(resizerElement)
{this._resizerWidget.removeElement(resizerElement);},hasCustomResizer:function()
{var elements=this._resizerWidget.elements();return elements.length>1||(elements.length==1&&elements[0]!==this._resizerElement);},toggleResizer:function(resizer,on)
{if(on)
this.installResizer(resizer);else
this.uninstallResizer(resizer);},_settingForOrientation:function()
{var state=this._setting?this._setting.get():{};return this._isVertical?state.vertical:state.horizontal;},_preferredSidebarSizeDIP:function()
{var size=this._savedSidebarSizeDIP;if(!size){size=this._isVertical?this._defaultSidebarWidth:this._defaultSidebarHeight;if(0<size&&size<1)
size*=this._totalSizeDIP();}
return size;},_restoreSidebarSizeFromSettings:function()
{var settingForOrientation=this._settingForOrientation();this._savedSidebarSizeDIP=settingForOrientation?settingForOrientation.size:0;},_restoreAndApplyShowModeFromSettings:function()
{var orientationState=this._settingForOrientation();this._savedShowMode=orientationState&&orientationState.showMode?orientationState.showMode:this._showMode;this._showMode=this._savedShowMode;switch(this._savedShowMode){case WebInspector.SplitWidget.ShowMode.Both:this.showBoth();break;case WebInspector.SplitWidget.ShowMode.OnlyMain:this.hideSidebar();break;case WebInspector.SplitWidget.ShowMode.OnlySidebar:this.hideMain();break;}},_saveShowModeToSettings:function()
{this._savedShowMode=this._showMode;this._saveSetting();},_saveSetting:function()
{if(!this._setting)
return;var state=this._setting.get();var orientationState=(this._isVertical?state.vertical:state.horizontal)||{};orientationState.size=this._savedSidebarSizeDIP;if(this._shouldSaveShowMode)
orientationState.showMode=this._savedShowMode;if(this._isVertical)
state.vertical=orientationState;else
state.horizontal=orientationState;this._setting.set(state);},_forceUpdateLayout:function()
{this._sidebarSizeDIP=-1;this._updateLayout();},_onZoomChanged:function(event)
{this._forceUpdateLayout();},displayShowHideSidebarButton:function(title,className)
{console.assert(this.isVertical(),"Buttons for split widget with horizontal split are not supported yet.");this._showHideSidebarButtonTitle=WebInspector.UIString(title);this._showHideSidebarButton=this._mainElement.createChild("button","sidebar-show-hide-button "+(className||""));this._showHideSidebarButton.addEventListener("click",buttonClicked.bind(this),false);this._updateShowHideSidebarButton();function buttonClicked(event)
{if(this._showMode!==WebInspector.SplitWidget.ShowMode.Both)
this.showBoth(true);else
this.hideSidebar(true);}
return this._showHideSidebarButton;},_updateShowHideSidebarButton:function()
{if(!this._showHideSidebarButton)
return;var sidebarHidden=this._showMode===WebInspector.SplitWidget.ShowMode.OnlyMain;this._showHideSidebarButton.classList.toggle("toggled-show",sidebarHidden);this._showHideSidebarButton.classList.toggle("toggled-hide",!sidebarHidden);this._showHideSidebarButton.classList.toggle("top-sidebar-show-hide-button",!this.isVertical()&&!this.isSidebarSecond());this._showHideSidebarButton.classList.toggle("right-sidebar-show-hide-button",this.isVertical()&&this.isSidebarSecond());this._showHideSidebarButton.classList.toggle("bottom-sidebar-show-hide-button",!this.isVertical()&&this.isSidebarSecond());this._showHideSidebarButton.classList.toggle("left-sidebar-show-hide-button",this.isVertical()&&!this.isSidebarSecond());this._showHideSidebarButton.title=sidebarHidden?WebInspector.UIString("Show %s",this._showHideSidebarButtonTitle):WebInspector.UIString("Hide %s",this._showHideSidebarButtonTitle);},__proto__:WebInspector.Widget.prototype};WebInspector.StackView=function(isVertical)
{WebInspector.VBox.call(this);this._isVertical=isVertical;this._currentSplitWidget=null;}
WebInspector.StackView.prototype={appendView:function(view,sidebarSizeSettingName,defaultSidebarWidth,defaultSidebarHeight)
{var splitWidget=new WebInspector.SplitWidget(this._isVertical,true,sidebarSizeSettingName,defaultSidebarWidth,defaultSidebarHeight);splitWidget.setMainWidget(view);splitWidget.hideSidebar();if(!this._currentSplitWidget){splitWidget.show(this.element);}else{this._currentSplitWidget.setSidebarWidget(splitWidget);this._currentSplitWidget.showBoth();}
this._currentSplitWidget=splitWidget;return splitWidget;},detachChildWidgets:function()
{WebInspector.Widget.prototype.detachChildWidgets.call(this);this._currentSplitWidget=null;},__proto__:WebInspector.VBox.prototype};WebInspector.Toolbar=function(className,parentElement)
{this._items=[];this._reverse=false;this.element=parentElement?parentElement.createChild("div"):createElement("div");this.element.className=className;this.element.classList.add("toolbar");this._shadowRoot=WebInspector.createShadowRootWithCoreStyles(this.element,"ui/toolbar.css");this._contentElement=this._shadowRoot.createChild("div","toolbar-shadow");this._insertionPoint=this._contentElement.createChild("content");}
WebInspector.Toolbar.prototype={makeWrappable:function(reverse)
{this._contentElement.classList.add("wrappable");this._reverse=!!reverse;if(reverse)
this._contentElement.classList.add("wrappable-reverse");},makeVertical:function()
{this._contentElement.classList.add("vertical");},makeBlueOnHover:function()
{this._contentElement.classList.add("toolbar-blue-on-hover");},makeToggledGray:function()
{this._contentElement.classList.add("toolbar-toggled-gray");},setEnabled:function(enabled)
{for(var item of this._items)
item.setEnabled(enabled);},appendToolbarItem:function(item)
{this._items.push(item);item._toolbar=this;if(this._reverse)
this._contentElement.insertBefore(item.element,this._insertionPoint.nextSibling);else
this._contentElement.insertBefore(item.element,this._insertionPoint);this._hideSeparatorDupes();},appendSeparator:function()
{this.appendToolbarItem(new WebInspector.ToolbarSeparator());},appendText:function(text)
{this.appendToolbarItem(new WebInspector.ToolbarLabel(text));},removeToolbarItems:function()
{for(var item of this._items)
delete item._toolbar;this._items=[];this._contentElement.removeChildren();this._insertionPoint=this._contentElement.createChild("content");},setColor:function(color)
{var style=createElement("style");style.textContent=".toolbar-glyph { background-color: "+color+" !important }";this._shadowRoot.appendChild(style);},setToggledColor:function(color)
{var style=createElement("style");style.textContent=".toolbar-button.toolbar-state-on .toolbar-glyph { background-color: "+color+" !important }";this._shadowRoot.appendChild(style);},_hideSeparatorDupes:function()
{if(!this._items.length)
return;var previousIsSeparator=false;var lastSeparator;var nonSeparatorVisible=false;for(var i=0;i<this._items.length;++i){if(this._items[i]instanceof WebInspector.ToolbarSeparator){this._items[i].setVisible(!previousIsSeparator);previousIsSeparator=true;lastSeparator=this._items[i];continue;}
if(this._items[i].visible()){previousIsSeparator=false;lastSeparator=null;nonSeparatorVisible=true;}}
if(lastSeparator&&lastSeparator!==this._items.peekLast())
lastSeparator.setVisible(false);this.element.classList.toggle("hidden",lastSeparator&&lastSeparator.visible()&&!nonSeparatorVisible);}}
WebInspector.ToolbarItem=function(element)
{this.element=element;this.element.classList.add("toolbar-item");this._visible=true;this._enabled=true;this.element.addEventListener("mouseenter",this._mouseEnter.bind(this),false);this.element.addEventListener("mouseleave",this._mouseLeave.bind(this),false);}
WebInspector.ToolbarItem.prototype={_mouseEnter:function()
{this.element.classList.add("hover");},_mouseLeave:function()
{this.element.classList.remove("hover");},setEnabled:function(value)
{if(this._enabled===value)
return;this._enabled=value;this._applyEnabledState();},_applyEnabledState:function()
{this.element.disabled=!this._enabled;},visible:function()
{return this._visible;},setVisible:function(x)
{if(this._visible===x)
return;this.element.classList.toggle("hidden",!x);this._visible=x;if(this._toolbar&&!(this instanceof WebInspector.ToolbarSeparator))
this._toolbar._hideSeparatorDupes();},__proto__:WebInspector.Object.prototype}
WebInspector.ToolbarLabel=function(text,glyph)
{WebInspector.ToolbarItem.call(this,createElementWithClass("button","toolbar-text-glyph"));this._glyphElement=this.element.createChild("div","toolbar-glyph hidden");this._textElement=this.element.createChild("div","toolbar-text hidden");this.setText(text||"");if(glyph)
this.setGlyph(glyph);this._state="";this._title="";}
WebInspector.ToolbarLabel.prototype={setText:function(text)
{if(this._text===text)
return;this._textElement.textContent=text;this._textElement.classList.toggle("hidden",!text);this._text=text;},setGlyph:function(glyph)
{if(this._glyph===glyph)
return;if(this._glyph)
this._glyphElement.classList.remove(this._glyph);if(glyph)
this._glyphElement.classList.add(glyph);this._glyphElement.classList.toggle("hidden",!glyph);this.element.classList.toggle("toolbar-has-glyph",!!glyph);this._glyph=glyph;},setBackgroundImage:function(iconURL)
{this.element.style.backgroundImage="url("+iconURL+")";},state:function()
{return this._state;},setState:function(state)
{if(this._state===state)
return;this.element.classList.remove("toolbar-state-"+this._state);this.element.classList.add("toolbar-state-"+state);this._state=state;},setTitle:function(title)
{if(this._title===title)
return;this._title=title;WebInspector.Tooltip.install(this.element,title);},setBold:function(bold)
{this.element.classList.toggle("toolbar-bold",bold);},setDimmed:function(dimmed)
{this.element.classList.toggle("toolbar-dimmed",dimmed);},addDropDownArrow:function()
{this.element.classList.add("toolbar-has-dropdown");this.element.createChild("div","toolbar-dropdown-arrow");},__proto__:WebInspector.ToolbarItem.prototype}
WebInspector.ToolbarButton=function(title,glyph)
{WebInspector.ToolbarLabel.call(this);this.element.classList.add("toolbar-button");this.element.addEventListener("click",this._clicked.bind(this),false);this.element.addEventListener("mousedown",this._mouseDown.bind(this),false);this.element.addEventListener("mouseup",this._mouseUp.bind(this),false);this.setBold(true);this.setTitle(title);this.setGlyph(glyph);}
WebInspector.ToolbarButton.prototype={_clicked:function(event)
{var defaultPrevented=this.dispatchEventToListeners("click",event);event.consume(defaultPrevented);},_mouseDown:function(event)
{this.dispatchEventToListeners("mousedown",event);},_mouseUp:function(event)
{this.dispatchEventToListeners("mouseup",event);},__proto__:WebInspector.ToolbarLabel.prototype}
WebInspector.ToolbarInput=function(placeholder,growFactor)
{WebInspector.ToolbarItem.call(this,createElementWithClass("input","toolbar-item"));this.element.addEventListener("input",this._onChangeCallback.bind(this),false);if(growFactor)
this.element.style.flexGrow=growFactor;if(placeholder)
this.element.setAttribute("placeholder",placeholder);this._value="";}
WebInspector.ToolbarInput.Event={TextChanged:"TextChanged"};WebInspector.ToolbarInput.prototype={setValue:function(value)
{this._value=value;this.element.value=value;},value:function()
{return this.element.value;},_onChangeCallback:function()
{this.dispatchEventToListeners(WebInspector.ToolbarInput.Event.TextChanged,this.element.value);},__proto__:WebInspector.ToolbarItem.prototype}
WebInspector.ToolbarToggle=function(title,glyph)
{WebInspector.ToolbarButton.call(this,title,glyph);this._toggled=false;this.setState("off");}
WebInspector.ToolbarToggle.prototype={toggled:function()
{return this._toggled;},setToggled:function(toggled)
{if(this._toggled===toggled)
return;this._toggled=toggled;this.setState(toggled?"on":"off");},__proto__:WebInspector.ToolbarButton.prototype}
WebInspector.Toolbar.createActionButton=function(action,toggledOptions,untoggledOptions)
{var button=new WebInspector.ToolbarButton(action.title(),action.icon());button.addEventListener("click",action.execute,action);action.addEventListener(WebInspector.Action.Events.Enabled,enabledChanged);action.addEventListener(WebInspector.Action.Events.StateChanged,stateChanged);action.addEventListener(WebInspector.Action.Events.TitleChanged,titleChanged);var longClickController=null;var longClickButtons=null;var longClickGlyph=null;titleChanged();stateChanged();return button;function titleChanged()
{WebInspector.Tooltip.install(button.element,action.title(),action.id());}
function enabledChanged(event)
{button.setEnabled((event.data));}
function stateChanged()
{button.setState(action.state());updateOptions();}
function updateOptions()
{if(action.statesCount()!==2)
return;var buttons=action.toggled()?(toggledOptions||null):(untoggledOptions||null);if(buttons&&buttons.length){if(!longClickController){longClickController=new WebInspector.LongClickController(button.element,showOptions);longClickGlyph=button.element.createChild("div","long-click-glyph toolbar-button-theme");longClickButtons=buttons;}}else{if(longClickController){longClickController.dispose();longClickController=null;longClickGlyph.remove();longClickGlyph=null;longClickButtons=null;}}}
function showOptions()
{var buttons=longClickButtons.slice();var mainButtonClone=new WebInspector.ToolbarButton(action.title(),action.icon());mainButtonClone.addEventListener("click",clicked);function clicked(event)
{button._clicked((event.data));}
mainButtonClone.setState(action.state());buttons.push(mainButtonClone);var document=button.element.ownerDocument;document.documentElement.addEventListener("mouseup",mouseUp,false);var optionsGlassPane=new WebInspector.GlassPane(document);var optionsBar=new WebInspector.Toolbar("fill",optionsGlassPane.element);optionsBar._contentElement.classList.add("floating");const buttonHeight=26;var hostButtonPosition=button.element.totalOffset();var topNotBottom=hostButtonPosition.top+buttonHeight*buttons.length<document.documentElement.offsetHeight;if(topNotBottom)
buttons=buttons.reverse();optionsBar.element.style.height=(buttonHeight*buttons.length)+"px";if(topNotBottom)
optionsBar.element.style.top=(hostButtonPosition.top+1)+"px";else
optionsBar.element.style.top=(hostButtonPosition.top-(buttonHeight*(buttons.length-1)))+"px";optionsBar.element.style.left=(hostButtonPosition.left+1)+"px";for(var i=0;i<buttons.length;++i){buttons[i].element.addEventListener("mousemove",mouseOver,false);buttons[i].element.addEventListener("mouseout",mouseOut,false);optionsBar.appendToolbarItem(buttons[i]);}
var hostButtonIndex=topNotBottom?0:buttons.length-1;buttons[hostButtonIndex].element.classList.add("emulate-active");function mouseOver(e)
{if(e.which!==1)
return;var buttonElement=e.target.enclosingNodeOrSelfWithClass("toolbar-item");buttonElement.classList.add("emulate-active");}
function mouseOut(e)
{if(e.which!==1)
return;var buttonElement=e.target.enclosingNodeOrSelfWithClass("toolbar-item");buttonElement.classList.remove("emulate-active");}
function mouseUp(e)
{if(e.which!==1)
return;optionsGlassPane.dispose();document.documentElement.removeEventListener("mouseup",mouseUp,false);for(var i=0;i<buttons.length;++i){if(buttons[i].element.classList.contains("emulate-active")){buttons[i].element.classList.remove("emulate-active");buttons[i]._clicked(e);break;}}}}}
WebInspector.ToolbarMenuButton=function(contextMenuHandler,useSoftMenu)
{WebInspector.ToolbarButton.call(this,"","menu-toolbar-item");this._contextMenuHandler=contextMenuHandler;this._useSoftMenu=!!useSoftMenu;}
WebInspector.ToolbarMenuButton.prototype={_clicked:function(event)
{var contextMenu=new WebInspector.ContextMenu(event,this._useSoftMenu,this.element.totalOffsetLeft(),this.element.totalOffsetTop()+this.element.offsetHeight);this._contextMenuHandler(contextMenu);contextMenu.show();},__proto__:WebInspector.ToolbarButton.prototype}
WebInspector.ToolbarSettingToggle=function(setting,glyph,title,toggledTitle)
{WebInspector.ToolbarToggle.call(this,title,glyph);this._defaultTitle=title;this._toggledTitle=toggledTitle||title;this._setting=setting;this._settingChanged();this._setting.addChangeListener(this._settingChanged,this);}
WebInspector.ToolbarSettingToggle.prototype={_settingChanged:function()
{var toggled=this._setting.get();this.setToggled(toggled);this.setTitle(toggled?this._toggledTitle:this._defaultTitle);},_clicked:function(event)
{this._setting.set(!this.toggled());WebInspector.ToolbarToggle.prototype._clicked.call(this,event);},__proto__:WebInspector.ToolbarToggle.prototype}
WebInspector.ToolbarSeparator=function()
{WebInspector.ToolbarItem.call(this,createElementWithClass("div","toolbar-divider"));}
WebInspector.ToolbarSeparator.prototype={__proto__:WebInspector.ToolbarItem.prototype}
WebInspector.ToolbarItem.Provider=function()
{}
WebInspector.ToolbarItem.Provider.prototype={item:function(){}}
WebInspector.ToolbarComboBox=function(changeHandler,className)
{WebInspector.ToolbarItem.call(this,createElementWithClass("span","toolbar-select-container"));this._selectElement=this.element.createChild("select","toolbar-item");this.element.createChild("div","toolbar-dropdown-arrow");if(changeHandler)
this._selectElement.addEventListener("change",changeHandler,false);if(className)
this._selectElement.classList.add(className);}
WebInspector.ToolbarComboBox.prototype={selectElement:function()
{return(this._selectElement);},size:function()
{return this._selectElement.childElementCount;},options:function()
{return Array.prototype.slice.call(this._selectElement.children,0);},addOption:function(option)
{this._selectElement.appendChild(option);},createOption:function(label,title,value)
{var option=this._selectElement.createChild("option");option.text=label;if(title)
option.title=title;if(typeof value!=="undefined")
option.value=value;return option;},_applyEnabledState:function()
{this._selectElement.disabled=!this._enabled;},removeOption:function(option)
{this._selectElement.removeChild(option);},removeOptions:function()
{this._selectElement.removeChildren();},selectedOption:function()
{if(this._selectElement.selectedIndex>=0)
return this._selectElement[this._selectElement.selectedIndex];return null;},select:function(option)
{this._selectElement.selectedIndex=Array.prototype.indexOf.call((this._selectElement),option);},setSelectedIndex:function(index)
{this._selectElement.selectedIndex=index;},selectedIndex:function()
{return this._selectElement.selectedIndex;},setMaxWidth:function(width)
{this._selectElement.style.maxWidth=width+"px";},__proto__:WebInspector.ToolbarItem.prototype}
WebInspector.ToolbarCheckbox=function(text,title,setting)
{WebInspector.ToolbarItem.call(this,createCheckboxLabel(text));this.element.classList.add("checkbox");this.inputElement=this.element.checkboxElement;if(title)
this.element.title=title;if(setting)
WebInspector.SettingsUI.bindCheckbox(this.inputElement,setting);}
WebInspector.ToolbarCheckbox.prototype={checked:function()
{return this.inputElement.checked;},__proto__:WebInspector.ToolbarItem.prototype}
WebInspector.ExtensibleToolbar=function(location,parentElement)
{WebInspector.Toolbar.call(this,"",parentElement);this._loadItems(location);}
WebInspector.ExtensibleToolbar.prototype={_loadItems:function(location)
{var extensions=self.runtime.extensions(WebInspector.ToolbarItem.Provider);var promises=[];for(var i=0;i<extensions.length;++i){if(extensions[i].descriptor()["location"]===location)
promises.push(resolveItem(extensions[i]));}
Promise.all(promises).then(appendItemsInOrder.bind(this));function resolveItem(extension)
{var descriptor=extension.descriptor();if(descriptor["separator"])
return Promise.resolve((new WebInspector.ToolbarSeparator()));if(descriptor["actionId"])
return Promise.resolve((WebInspector.Toolbar.createActionButton(WebInspector.actionRegistry.action(descriptor["actionId"]))));return extension.instancePromise().then(fetchItemFromProvider);function fetchItemFromProvider(provider)
{return(provider).item();}}
function appendItemsInOrder(items)
{for(var i=0;i<items.length;++i){var item=items[i];if(item)
this.appendToolbarItem(item);}}},__proto__:WebInspector.Toolbar.prototype};WebInspector.Tooltip=function(doc)
{this.element=doc.body.createChild("div");this._shadowRoot=WebInspector.createShadowRootWithCoreStyles(this.element,"ui/tooltip.css");this._tooltipElement=this._shadowRoot.createChild("div","tooltip");doc.addEventListener("mousemove",this._mouseMove.bind(this),true);doc.addEventListener("mousedown",this._hide.bind(this,true),true);doc.addEventListener("mouseleave",this._hide.bind(this,false),true);doc.addEventListener("keydown",this._hide.bind(this,true),true);WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged,this._reset,this);doc.defaultView.addEventListener("resize",this._reset.bind(this),false);}
WebInspector.Tooltip.Timing={"InstantThreshold":300,"OpeningDelay":600}
WebInspector.Tooltip.prototype={_mouseMove:function(event)
{var path=event.deepPath?event.deepPath:event.path;if(!path||event.buttons!==0)
return;if(this._anchorElement&&path.indexOf(this._anchorElement)===-1)
this._hide(false);for(var element of path){if(element===this._anchorElement){return;}else if(element[WebInspector.Tooltip._symbol]){this._show(element,event);return;}}},_show:function(anchorElement,event)
{var tooltip=anchorElement[WebInspector.Tooltip._symbol];this._anchorElement=anchorElement;this._tooltipElement.removeChildren();for(var element of WebInspector.Tooltip._nativeOverrideContainer){if(this._anchorElement.isSelfOrDescendant(element)){Object.defineProperty(this._anchorElement,"title",WebInspector.Tooltip._nativeTitle);this._anchorElement.title=tooltip.content;return;}}
if(typeof tooltip.content==="string")
this._tooltipElement.textContent=tooltip.content;else
this._tooltipElement.appendChild(tooltip.content);if(tooltip.actionId){var shortcuts=WebInspector.shortcutRegistry.shortcutDescriptorsForAction(tooltip.actionId);for(var shortcut of shortcuts){var shortcutElement=this._tooltipElement.createChild("div","tooltip-shortcut");shortcutElement.textContent=shortcut.name;}}
this._tooltipElement.classList.add("shown");this._tooltipElement.positionAt(0,0);var now=Date.now();var instant=(this._tooltipLastClosed&&now-this._tooltipLastClosed<WebInspector.Tooltip.Timing.InstantThreshold);this._tooltipElement.classList.toggle("instant",instant);this._tooltipLastOpened=instant?now:now+WebInspector.Tooltip.Timing.OpeningDelay;var container=WebInspector.Dialog.modalHostView().element;if(!anchorElement.isDescendant(container))
container=this.element.parentElement;var containerOffset=container.offsetRelativeToWindow(this.element.window());var containerOffsetWidth=container.offsetWidth;var containerOffsetHeight=container.offsetHeight;var anchorBox=this._anchorElement.boxInWindow(this.element.window());const anchorOffset=2;const pageMargin=2;var cursorOffset=10;this._tooltipElement.style.maxWidth=(containerOffsetWidth-pageMargin*2)+"px";this._tooltipElement.style.maxHeight="";var tooltipWidth=this._tooltipElement.offsetWidth;var tooltipHeight=this._tooltipElement.offsetHeight;var anchorTooltipAtElement=this._anchorElement.nodeName==="BUTTON"||this._anchorElement.nodeName==="LABEL";var tooltipX=anchorTooltipAtElement?anchorBox.x:event.x+cursorOffset;tooltipX=Number.constrain(tooltipX,containerOffset.x+pageMargin,containerOffset.x+containerOffsetWidth-tooltipWidth-pageMargin);var tooltipY;if(!anchorTooltipAtElement){tooltipY=event.y+cursorOffset+tooltipHeight<containerOffset.y+containerOffsetHeight?event.y+cursorOffset:event.y-tooltipHeight;}else{var onBottom=anchorBox.y+anchorOffset+anchorBox.height+tooltipHeight<containerOffset.y+containerOffsetHeight;tooltipY=onBottom?anchorBox.y+anchorBox.height+anchorOffset:anchorBox.y-tooltipHeight-anchorOffset;}
this._tooltipElement.positionAt(tooltipX,tooltipY);},_hide:function(removeInstant)
{delete this._anchorElement;this._tooltipElement.classList.remove("shown");if(Date.now()>this._tooltipLastOpened)
this._tooltipLastClosed=Date.now();if(removeInstant)
delete this._tooltipLastClosed;},_reset:function()
{this._hide(true);this._tooltipElement.positionAt(0,0);this._tooltipElement.style.maxWidth="0";this._tooltipElement.style.maxHeight="0";}}
WebInspector.Tooltip._symbol=Symbol("Tooltip");WebInspector.Tooltip.installHandler=function(doc)
{new WebInspector.Tooltip(doc);}
WebInspector.Tooltip.install=function(element,tooltipContent,actionId,options)
{if(typeof tooltipContent==="string"&&tooltipContent===""){delete element[WebInspector.Tooltip._symbol];return;}
element[WebInspector.Tooltip._symbol]={content:tooltipContent,actionId:actionId,options:options||{}};}
WebInspector.Tooltip.addNativeOverrideContainer=function(element)
{WebInspector.Tooltip._nativeOverrideContainer.push(element);}
WebInspector.Tooltip._nativeOverrideContainer=[];WebInspector.Tooltip._nativeTitle=(Object.getOwnPropertyDescriptor(HTMLElement.prototype,"title"));Object.defineProperty(HTMLElement.prototype,"title",{get:function()
{var tooltip=this[WebInspector.Tooltip._symbol];return tooltip?tooltip.content:"";},set:function(x)
{WebInspector.Tooltip.install(this,x);}});;WebInspector.SuggestBoxDelegate=function()
{}
WebInspector.SuggestBoxDelegate.prototype={applySuggestion:function(suggestion,isIntermediateSuggestion){},acceptSuggestion:function(){},}
WebInspector.SuggestBox=function(suggestBoxDelegate,maxItemsHeight)
{this._suggestBoxDelegate=suggestBoxDelegate;this._length=0;this._selectedIndex=-1;this._selectedElement=null;this._maxItemsHeight=maxItemsHeight;this._maybeHideBound=this._maybeHide.bind(this);this._container=createElementWithClass("div","suggest-box-container");this._element=this._container.createChild("div","suggest-box");this._element.addEventListener("mousedown",this._onBoxMouseDown.bind(this),true);this._detailsPopup=this._container.createChild("div","suggest-box details-popup monospace");this._detailsPopup.classList.add("hidden");this._asyncDetailsCallback=null;this._asyncDetailsPromises=({});}
WebInspector.SuggestBox.prototype={visible:function()
{return!!this._container.parentElement;},setPosition:function(anchorBox)
{this._updateBoxPosition(anchorBox);},_updateBoxPosition:function(anchorBox)
{console.assert(this._overlay);if(this._lastAnchorBox&&this._lastAnchorBox.equals(anchorBox))
return;this._lastAnchorBox=anchorBox;var container=WebInspector.Dialog.modalHostView().element;anchorBox=anchorBox.relativeToElement(container);var totalHeight=container.offsetHeight;var aboveHeight=anchorBox.y;var underHeight=totalHeight-anchorBox.y-anchorBox.height;this._overlay.setLeftOffset(anchorBox.x);var under=underHeight>=aboveHeight;if(under)
this._overlay.setVerticalOffset(anchorBox.y+anchorBox.height,true);else
this._overlay.setVerticalOffset(totalHeight-anchorBox.y,false);var rowHeight=17;var spacer=6;var maxHeight=this._maxItemsHeight?this._maxItemsHeight*rowHeight:Math.max(underHeight,aboveHeight)-spacer;this._element.style.maxHeight=maxHeight+"px";},_onBoxMouseDown:function(event)
{if(this._hideTimeoutId){window.clearTimeout(this._hideTimeoutId);delete this._hideTimeoutId;}
event.preventDefault();},_maybeHide:function()
{if(!this._hideTimeoutId)
this._hideTimeoutId=window.setTimeout(this.hide.bind(this),0);},_show:function()
{if(this.visible())
return;this._bodyElement=document.body;this._bodyElement.addEventListener("mousedown",this._maybeHideBound,true);this._overlay=new WebInspector.SuggestBox.Overlay();this._overlay.setContentElement(this._container);},hide:function()
{if(!this.visible())
return;this._bodyElement.removeEventListener("mousedown",this._maybeHideBound,true);delete this._bodyElement;this._container.remove();this._overlay.dispose();delete this._overlay;delete this._selectedElement;this._selectedIndex=-1;delete this._lastAnchorBox;},removeFromElement:function()
{this.hide();},_applySuggestion:function(isIntermediateSuggestion)
{if(!this.visible()||!this._selectedElement)
return false;var suggestion=this._selectedElement.__fullValue;if(!suggestion)
return false;this._suggestBoxDelegate.applySuggestion(suggestion,isIntermediateSuggestion);return true;},acceptSuggestion:function()
{var result=this._applySuggestion();this.hide();if(!result)
return false;this._suggestBoxDelegate.acceptSuggestion();return true;},_selectClosest:function(shift,isCircular)
{if(!this._length)
return false;if(this._selectedIndex===-1&&shift<0)
shift+=1;var index=this._selectedIndex+shift;if(isCircular)
index=(this._length+index)%this._length;else
index=Number.constrain(index,0,this._length-1);this._selectItem(index,true);this._applySuggestion(true);return true;},_onItemMouseDown:function(event)
{this._selectedElement=event.currentTarget;this.acceptSuggestion();event.consume(true);},_createItemElement:function(prefix,text,index)
{var element=createElementWithClass("div","suggest-box-content-item source-code");element.tabIndex=-1;if(prefix&&prefix.length&&!text.indexOf(prefix)){element.createChild("span","prefix").textContent=prefix;element.createChild("span","suffix").textContent=text.substring(prefix.length).trimEnd(50);}else{element.createChild("span","suffix").textContent=text.trimEnd(50);}
element.__fullValue=text;element.createChild("span","spacer");element.addEventListener("mousedown",this._onItemMouseDown.bind(this),false);return element;},_updateItems:function(items,userEnteredText,asyncDetails)
{this._length=items.length;this._asyncDetailsPromises={};this._asyncDetailsCallback=asyncDetails;this._element.removeChildren();delete this._selectedElement;for(var i=0;i<items.length;++i){var item=items[i];var currentItemElement=this._createItemElement(userEnteredText,item,i);this._element.appendChild(currentItemElement);}},_asyncDetails:function(index)
{if(!this._asyncDetailsCallback)
return Promise.resolve();if(!this._asyncDetailsPromises[index])
this._asyncDetailsPromises[index]=this._asyncDetailsCallback(index);return this._asyncDetailsPromises[index];},_showDetailsPopup:function(details)
{this._detailsPopup.removeChildren();if(!details)
return;this._detailsPopup.createChild("section","detail").createTextChild(details.detail);this._detailsPopup.createChild("section","description").createTextChild(details.description);this._detailsPopup.classList.remove("hidden");},_selectItem:function(index,scrollIntoView)
{if(this._selectedElement)
this._selectedElement.classList.remove("selected");this._selectedIndex=index;if(index<0)
return;this._selectedElement=this._element.children[index];this._selectedElement.classList.add("selected");this._detailsPopup.classList.add("hidden");var elem=this._selectedElement;this._asyncDetails(index).then(showDetails.bind(this),function(){});if(scrollIntoView)
this._selectedElement.scrollIntoViewIfNeeded(false);function showDetails(details)
{if(elem===this._selectedElement)
this._showDetailsPopup(details);}},_canShowBox:function(completions,canShowForSingleItem,userEnteredText)
{if(!completions||!completions.length)
return false;if(completions.length>1)
return true;return canShowForSingleItem&&completions[0]!==userEnteredText;},_ensureRowCountPerViewport:function()
{if(this._rowCountPerViewport)
return;if(!this._element.firstChild)
return;this._rowCountPerViewport=Math.floor(this._element.offsetHeight/this._element.firstChild.offsetHeight);},updateSuggestions:function(anchorBox,completions,selectedIndex,canShowForSingleItem,userEnteredText,asyncDetails)
{if(this._canShowBox(completions,canShowForSingleItem,userEnteredText)){this._updateItems(completions,userEnteredText,asyncDetails);this._show();this._updateBoxPosition(anchorBox);this._selectItem(selectedIndex,selectedIndex>0);delete this._rowCountPerViewport;}else
this.hide();},keyPressed:function(event)
{switch(event.keyIdentifier){case"Up":return this.upKeyPressed();case"Down":return this.downKeyPressed();case"PageUp":return this.pageUpKeyPressed();case"PageDown":return this.pageDownKeyPressed();case"Enter":return this.enterKeyPressed();}
return false;},upKeyPressed:function()
{return this._selectClosest(-1,true);},downKeyPressed:function()
{return this._selectClosest(1,true);},pageUpKeyPressed:function()
{this._ensureRowCountPerViewport();return this._selectClosest(-this._rowCountPerViewport,false);},pageDownKeyPressed:function()
{this._ensureRowCountPerViewport();return this._selectClosest(this._rowCountPerViewport,false);},enterKeyPressed:function()
{var hasSelectedItem=!!this._selectedElement;this.acceptSuggestion();return hasSelectedItem;}}
WebInspector.SuggestBox.Overlay=function()
{this.element=createElementWithClass("div","suggest-box-overlay");var root=WebInspector.createShadowRootWithCoreStyles(this.element,"ui/suggestBox.css");this._leftSpacerElement=root.createChild("div","suggest-box-left-spacer");this._horizontalElement=root.createChild("div","suggest-box-horizontal");this._topSpacerElement=this._horizontalElement.createChild("div","suggest-box-top-spacer");this._bottomSpacerElement=this._horizontalElement.createChild("div","suggest-box-bottom-spacer");this._resize();document.body.appendChild(this.element);}
WebInspector.SuggestBox.Overlay.prototype={setLeftOffset:function(offset)
{this._leftSpacerElement.style.flexBasis=offset+"px";},setVerticalOffset:function(offset,isTopOffset)
{this.element.classList.toggle("under-anchor",isTopOffset);if(isTopOffset){this._bottomSpacerElement.style.flexBasis="auto";this._topSpacerElement.style.flexBasis=offset+"px";}else{this._bottomSpacerElement.style.flexBasis=offset+"px";this._topSpacerElement.style.flexBasis="auto";}},setContentElement:function(element)
{this._horizontalElement.insertBefore(element,this._bottomSpacerElement);},_resize:function()
{var container=WebInspector.Dialog.modalHostView().element;var containerBox=container.boxInWindow(container.ownerDocument.defaultView);this.element.style.left=containerBox.x+"px";this.element.style.top=containerBox.y+"px";this.element.style.height=containerBox.height+"px";this.element.style.width=containerBox.width+"px";},dispose:function()
{this.element.remove();}};WebInspector.TabbedPane=function()
{WebInspector.VBox.call(this,true);this.registerRequiredCSS("ui/tabbedPane.css");this.element.classList.add("tabbed-pane");this.contentElement.classList.add("tabbed-pane-shadow");this.contentElement.tabIndex=-1;this._headerElement=this.contentElement.createChild("div","tabbed-pane-header");this._headerElement.createChild("content").select=".tabbed-pane-header-before";this._headerContentsElement=this._headerElement.createChild("div","tabbed-pane-header-contents");this._tabSlider=createElementWithClass("div","tabbed-pane-tab-slider");this._headerElement.createChild("content").select=".tabbed-pane-header-after";this._tabsElement=this._headerContentsElement.createChild("div","tabbed-pane-header-tabs");this._contentElement=this.contentElement.createChild("div","tabbed-pane-content");this._contentElement.createChild("content");this._tabs=[];this._tabsHistory=[];this._tabsById={};this._currentTabLocked=false;this._dropDownButton=this._createDropDownButton();WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged,this._zoomChanged,this);}
WebInspector.TabbedPane.EventTypes={TabSelected:"TabSelected",TabClosed:"TabClosed",TabOrderChanged:"TabOrderChanged"}
WebInspector.TabbedPane.prototype={setCurrentTabLocked:function(locked)
{this._currentTabLocked=locked;this._headerElement.classList.toggle("locked",this._currentTabLocked);},get visibleView()
{return this._currentTab?this._currentTab.view:null;},tabViews:function()
{function tabToView(tab)
{return tab.view;}
return this._tabs.map(tabToView);},get selectedTabId()
{return this._currentTab?this._currentTab.id:null;},setShrinkableTabs:function(shrinkableTabs)
{this._shrinkableTabs=shrinkableTabs;},setVerticalTabLayout:function(verticalTabLayout)
{this._verticalTabLayout=verticalTabLayout;this.contentElement.classList.add("vertical-tab-layout");this.invalidateConstraints();},setCloseableTabs:function(closeableTabs)
{this._closeableTabs=closeableTabs;},defaultFocusedElement:function()
{return this.visibleView?this.visibleView.defaultFocusedElement():this.contentElement;},focus:function()
{if(this.visibleView)
this.visibleView.focus();else
this.contentElement.focus();},headerElement:function()
{return this._headerElement;},isTabCloseable:function(id)
{var tab=this._tabsById[id];return tab?tab.isCloseable():false;},setTabDelegate:function(delegate)
{var tabs=this._tabs.slice();for(var i=0;i<tabs.length;++i)
tabs[i].setDelegate(delegate);this._delegate=delegate;},appendTab:function(id,tabTitle,view,tabTooltip,userGesture,isCloseable,index)
{isCloseable=typeof isCloseable==="boolean"?isCloseable:this._closeableTabs;var tab=new WebInspector.TabbedPaneTab(this,id,tabTitle,isCloseable,view,tabTooltip);tab.setDelegate(this._delegate);this._tabsById[id]=tab;if(index!==undefined)
this._tabs.splice(index,0,tab);else
this._tabs.push(tab);this._tabsHistory.push(tab);if(this._tabsHistory[0]===tab&&this.isShowing())
this.selectTab(tab.id,userGesture);this._updateTabElements();},closeTab:function(id,userGesture)
{this.closeTabs([id],userGesture);},closeTabs:function(ids,userGesture)
{var focused=this.hasFocus();for(var i=0;i<ids.length;++i)
this._innerCloseTab(ids[i],userGesture);this._updateTabElements();if(this._tabsHistory.length)
this.selectTab(this._tabsHistory[0].id,false);if(focused)
this.focus();},_innerCloseTab:function(id,userGesture)
{if(!this._tabsById[id])
return;if(userGesture&&!this._tabsById[id]._closeable)
return;if(this._currentTab&&this._currentTab.id===id)
this._hideCurrentTab();var tab=this._tabsById[id];delete this._tabsById[id];this._tabsHistory.splice(this._tabsHistory.indexOf(tab),1);this._tabs.splice(this._tabs.indexOf(tab),1);if(tab._shown)
this._hideTabElement(tab);var eventData={tabId:id,view:tab.view,isUserGesture:userGesture};this.dispatchEventToListeners(WebInspector.TabbedPane.EventTypes.TabClosed,eventData);return true;},hasTab:function(tabId)
{return!!this._tabsById[tabId];},allTabs:function()
{return this._tabs.map(function(tab){return tab.id;});},otherTabs:function(id)
{var result=[];for(var i=0;i<this._tabs.length;++i){if(this._tabs[i].id!==id)
result.push(this._tabs[i].id);}
return result;},_tabsToTheRight:function(id)
{var index=-1;for(var i=0;i<this._tabs.length;++i){if(this._tabs[i].id===id){index=i;break;}}
if(index===-1)
return[];return this._tabs.slice(index+1).map(function(tab){return tab.id;});},selectTab:function(id,userGesture)
{if(this._currentTabLocked)
return false;var focused=this.hasFocus();var tab=this._tabsById[id];if(!tab)
return false;if(this._currentTab&&this._currentTab.id===id)
return true;this._hideCurrentTab();this._showTab(tab);this._currentTab=tab;this._tabsHistory.splice(this._tabsHistory.indexOf(tab),1);this._tabsHistory.splice(0,0,tab);this._updateTabElements();if(focused)
this.focus();var eventData={tabId:id,view:tab.view,isUserGesture:userGesture};this.dispatchEventToListeners(WebInspector.TabbedPane.EventTypes.TabSelected,eventData);return true;},lastOpenedTabIds:function(tabsCount)
{function tabToTabId(tab){return tab.id;}
return this._tabsHistory.slice(0,tabsCount).map(tabToTabId);},setTabIcon:function(id,iconType,iconTooltip)
{var tab=this._tabsById[id];if(tab._setIconType(iconType,iconTooltip))
this._updateTabElements();},toggleTabClass:function(id,className,force)
{var tab=this._tabsById[id];if(tab._toggleClass(className,force))
this._updateTabElements();},_zoomChanged:function(event)
{for(var i=0;i<this._tabs.length;++i)
delete this._tabs[i]._measuredWidth;if(this.isShowing())
this._updateTabElements();},changeTabTitle:function(id,tabTitle)
{var tab=this._tabsById[id];if(tab.title===tabTitle)
return;tab.title=tabTitle;this._updateTabElements();},changeTabView:function(id,view)
{var tab=this._tabsById[id];if(this._currentTab&&this._currentTab.id===tab.id){if(tab.view!==view)
this._hideTab(tab);tab.view=view;this._showTab(tab);}else
tab.view=view;},onResize:function()
{this._updateTabElements();},headerResized:function()
{this._updateTabElements();},wasShown:function()
{var effectiveTab=this._currentTab||this._tabsHistory[0];if(effectiveTab)
this.selectTab(effectiveTab.id);},setTabSlider:function(enable)
{this._sliderEnabled=enable;this._tabSlider.classList.toggle("enabled",enable);},calculateConstraints:function()
{var constraints=WebInspector.VBox.prototype.calculateConstraints.call(this);var minContentConstraints=new Constraints(new Size(0,0),new Size(50,50));constraints=constraints.widthToMax(minContentConstraints).heightToMax(minContentConstraints);if(this._verticalTabLayout)
constraints=constraints.addWidth(new Constraints(new Size(120,0)));else
constraints=constraints.addHeight(new Constraints(new Size(0,30)));return constraints;},_updateTabElements:function()
{WebInspector.invokeOnceAfterBatchUpdate(this,this._innerUpdateTabElements);},setPlaceholderText:function(text)
{this._noTabsMessage=text;},_innerUpdateTabElements:function()
{if(!this.isShowing())
return;if(!this._tabs.length){this._contentElement.classList.add("has-no-tabs");if(this._noTabsMessage&&!this._noTabsMessageElement){this._noTabsMessageElement=this._contentElement.createChild("div","tabbed-pane-placeholder fill");this._noTabsMessageElement.textContent=this._noTabsMessage;}}else{this._contentElement.classList.remove("has-no-tabs");if(this._noTabsMessageElement){this._noTabsMessageElement.remove();delete this._noTabsMessageElement;}}
this._measureDropDownButton();this._updateWidths();this._updateTabsDropDown();this._updateTabSlider();},_showTabElement:function(index,tab)
{if(index>=this._tabsElement.children.length)
this._tabsElement.appendChild(tab.tabElement);else
this._tabsElement.insertBefore(tab.tabElement,this._tabsElement.children[index]);tab._shown=true;},_hideTabElement:function(tab)
{this._tabsElement.removeChild(tab.tabElement);tab._shown=false;},_createDropDownButton:function()
{var dropDownContainer=createElementWithClass("div","tabbed-pane-header-tabs-drop-down-container");dropDownContainer.createChild("div","glyph");this._dropDownMenu=new WebInspector.DropDownMenu(dropDownContainer);this._dropDownMenu.addEventListener(WebInspector.DropDownMenu.Events.ItemSelected,this._dropDownMenuItemSelected,this);return dropDownContainer;},_dropDownMenuItemSelected:function(event)
{var tabId=(event.data);this._lastSelectedOverflowTab=this._tabsById[tabId];this.selectTab(tabId,true);},_totalWidth:function()
{return this._headerContentsElement.getBoundingClientRect().width;},_numberOfTabsShown:function()
{var numTabsShown=0;for(var tab of this._tabs){if(tab._shown)
numTabsShown++;}
return numTabsShown;},disableOverflowMenu:function()
{this._overflowDisabled=true;},_updateTabsDropDown:function()
{var tabsToShowIndexes=this._tabsToShowIndexes(this._tabs,this._tabsHistory,this._totalWidth(),this._measuredDropDownButtonWidth||0);if(this._lastSelectedOverflowTab&&this._numberOfTabsShown()!==tabsToShowIndexes.length){delete this._lastSelectedOverflowTab;this._updateTabsDropDown();return;}
for(var i=0;i<this._tabs.length;++i){if(this._tabs[i]._shown&&tabsToShowIndexes.indexOf(i)===-1)
this._hideTabElement(this._tabs[i]);}
for(var i=0;i<tabsToShowIndexes.length;++i){var tab=this._tabs[tabsToShowIndexes[i]];if(!tab._shown)
this._showTabElement(i,tab);}
if(!this._overflowDisabled)
this._populateDropDownFromIndex();},_populateDropDownFromIndex:function()
{if(this._dropDownButton.parentElement)
this._headerContentsElement.removeChild(this._dropDownButton);this._dropDownMenu.clear();var tabsToShow=[];for(var i=0;i<this._tabs.length;++i){if(!this._tabs[i]._shown)
tabsToShow.push(this._tabs[i]);}
var selectedId=null;for(var i=0;i<tabsToShow.length;++i){var tab=tabsToShow[i];this._dropDownMenu.addItem(tab.id,tab.title);if(this._tabsHistory[0]===tab)
selectedId=tab.id;}
if(tabsToShow.length){this._headerContentsElement.appendChild(this._dropDownButton);this._dropDownMenu.selectItem(selectedId);}},_measureDropDownButton:function()
{if(this._overflowDisabled||this._measuredDropDownButtonWidth)
return;this._dropDownButton.classList.add("measuring");this._headerContentsElement.appendChild(this._dropDownButton);this._measuredDropDownButtonWidth=this._dropDownButton.getBoundingClientRect().width;this._headerContentsElement.removeChild(this._dropDownButton);this._dropDownButton.classList.remove("measuring");},_updateWidths:function()
{var measuredWidths=this._measureWidths();var maxWidth=this._shrinkableTabs?this._calculateMaxWidth(measuredWidths.slice(),this._totalWidth()):Number.MAX_VALUE;var i=0;for(var tabId in this._tabs){var tab=this._tabs[tabId];tab.setWidth(this._verticalTabLayout?-1:Math.min(maxWidth,measuredWidths[i++]));}},_measureWidths:function()
{this._tabsElement.style.setProperty("width","2000px");var measuringTabElements=[];for(var tabId in this._tabs){var tab=this._tabs[tabId];if(typeof tab._measuredWidth==="number")
continue;var measuringTabElement=tab._createTabElement(true);measuringTabElement.__tab=tab;measuringTabElements.push(measuringTabElement);this._tabsElement.appendChild(measuringTabElement);}
for(var i=0;i<measuringTabElements.length;++i){var width=measuringTabElements[i].getBoundingClientRect().width;measuringTabElements[i].__tab._measuredWidth=Math.ceil(width);}
for(var i=0;i<measuringTabElements.length;++i)
measuringTabElements[i].remove();var measuredWidths=[];for(var tabId in this._tabs)
measuredWidths.push(this._tabs[tabId]._measuredWidth);this._tabsElement.style.removeProperty("width");return measuredWidths;},_calculateMaxWidth:function(measuredWidths,totalWidth)
{if(!measuredWidths.length)
return 0;measuredWidths.sort(function(x,y){return x-y;});var totalMeasuredWidth=0;for(var i=0;i<measuredWidths.length;++i)
totalMeasuredWidth+=measuredWidths[i];if(totalWidth>=totalMeasuredWidth)
return measuredWidths[measuredWidths.length-1];var totalExtraWidth=0;for(var i=measuredWidths.length-1;i>0;--i){var extraWidth=measuredWidths[i]-measuredWidths[i-1];totalExtraWidth+=(measuredWidths.length-i)*extraWidth;if(totalWidth+totalExtraWidth>=totalMeasuredWidth)
return measuredWidths[i-1]+(totalWidth+totalExtraWidth-totalMeasuredWidth)/(measuredWidths.length-i);}
return totalWidth/measuredWidths.length;},_tabsToShowIndexes:function(tabsOrdered,tabsHistory,totalWidth,measuredDropDownButtonWidth)
{var tabsToShowIndexes=[];var totalTabsWidth=0;var tabCount=tabsOrdered.length;var tabsToLookAt=tabsOrdered.slice(0);if(this._currentTab!==undefined)
tabsToLookAt.unshift(tabsToLookAt.splice(tabsToLookAt.indexOf(this._currentTab),1)[0]);if(this._lastSelectedOverflowTab!==undefined)
tabsToLookAt.unshift(tabsToLookAt.splice(tabsToLookAt.indexOf(this._lastSelectedOverflowTab),1)[0]);for(var i=0;i<tabCount;++i){var tab=this._automaticReorder?tabsHistory[i]:tabsToLookAt[i];totalTabsWidth+=tab.width();var minimalRequiredWidth=totalTabsWidth;if(i!==tabCount-1)
minimalRequiredWidth+=measuredDropDownButtonWidth;if(!this._verticalTabLayout&&minimalRequiredWidth>totalWidth)
break;tabsToShowIndexes.push(tabsOrdered.indexOf(tab));}
tabsToShowIndexes.sort(function(x,y){return x-y;});return tabsToShowIndexes;},_hideCurrentTab:function()
{if(!this._currentTab)
return;this._hideTab(this._currentTab);delete this._currentTab;},_showTab:function(tab)
{tab.tabElement.classList.add("selected");tab.view.show(this.element);this._updateTabSlider();},_updateTabSlider:function()
{if(!this._currentTab||!this._sliderEnabled)
return;var left=0;for(var i=0;i<this._tabs.length&&this._currentTab!==this._tabs[i]&&this._tabs[i]._shown;i++)
left+=this._tabs[i]._measuredWidth;var sliderWidth=this._currentTab._shown?this._currentTab._measuredWidth:this._dropDownButton.offsetWidth;var scaleFactor=window.devicePixelRatio>=1.5?" scaleY(0.75)":"";this._tabSlider.style.transform="translateX("+left+"px)"+scaleFactor;this._tabSlider.style.width=sliderWidth+"px";if(this._tabSlider.parentElement!==this._headerContentsElement)
this._headerContentsElement.appendChild(this._tabSlider);},_hideTab:function(tab)
{tab.tabElement.classList.remove("selected");tab.view.detach();},elementsToRestoreScrollPositionsFor:function()
{return[this._contentElement];},_insertBefore:function(tab,index)
{this._tabsElement.insertBefore(tab._tabElement||null,this._tabsElement.childNodes[index]);var oldIndex=this._tabs.indexOf(tab);this._tabs.splice(oldIndex,1);if(oldIndex<index)
--index;this._tabs.splice(index,0,tab);this.dispatchEventToListeners(WebInspector.TabbedPane.EventTypes.TabOrderChanged,this._tabs);},insertBeforeTabStrip:function(element)
{element.classList.add("tabbed-pane-header-before");this.element.appendChild(element);},appendAfterTabStrip:function(element)
{element.classList.add("tabbed-pane-header-after");this.element.appendChild(element);},renderWithNoHeaderBackground:function()
{this._headerElement.classList.add("tabbed-pane-no-header-background");},setAllowTabReorder:function(allow,automatic)
{this._allowTabReorder=allow;this._automaticReorder=automatic;},__proto__:WebInspector.VBox.prototype}
WebInspector.TabbedPaneTab=function(tabbedPane,id,title,closeable,view,tooltip)
{this._closeable=closeable;this._tabbedPane=tabbedPane;this._id=id;this._title=title;this._tooltip=tooltip;this._view=view;this._shown=false;this._measuredWidth;this._tabElement;}
WebInspector.TabbedPaneTab.prototype={get id()
{return this._id;},get title()
{return this._title;},set title(title)
{if(title===this._title)
return;this._title=title;if(this._titleElement)
this._titleElement.textContent=title;delete this._measuredWidth;},isCloseable:function()
{return this._closeable;},_setIconType:function(iconType,iconTooltip)
{if(iconType===this._iconType&&iconTooltip===this._iconTooltip)
return false;this._iconType=iconType;this._iconTooltip=iconTooltip;if(this._tabElement)
this._createIconElement(this._tabElement,this._titleElement);delete this._measuredWidth;return true;},_toggleClass:function(className,force)
{var element=this.tabElement;var hasClass=element.classList.contains(className);if(hasClass===force)
return false;element.classList.toggle(className,force);delete this._measuredWidth;return true;},get view()
{return this._view;},set view(view)
{this._view=view;},get tooltip()
{return this._tooltip;},set tooltip(tooltip)
{this._tooltip=tooltip;if(this._titleElement)
this._titleElement.title=tooltip||"";},get tabElement()
{if(!this._tabElement)
this._tabElement=this._createTabElement(false);return this._tabElement;},width:function()
{return this._width;},setWidth:function(width)
{this.tabElement.style.width=width===-1?"":(width+"px");this._width=width;},setDelegate:function(delegate)
{this._delegate=delegate;},_createIconElement:function(tabElement,titleElement)
{if(tabElement.__iconElement)
tabElement.__iconElement.remove();if(!this._iconType)
return;var iconElement=createElementWithClass("label","tabbed-pane-header-tab-icon","dt-icon-label");iconElement.type=this._iconType;if(this._iconTooltip)
iconElement.title=this._iconTooltip;tabElement.insertBefore(iconElement,titleElement);tabElement.__iconElement=iconElement;},_createTabElement:function(measuring)
{var tabElement=createElementWithClass("div","tabbed-pane-header-tab");tabElement.id="tab-"+this._id;tabElement.tabIndex=-1;tabElement.selectTabForTest=this._tabbedPane.selectTab.bind(this._tabbedPane,this.id,true);var titleElement=tabElement.createChild("span","tabbed-pane-header-tab-title");titleElement.textContent=this.title;titleElement.title=this.tooltip||"";this._createIconElement(tabElement,titleElement);if(!measuring)
this._titleElement=titleElement;if(this._closeable)
tabElement.createChild("div","tabbed-pane-close-button","dt-close-button").gray=true;if(measuring){tabElement.classList.add("measuring");}else{tabElement.addEventListener("click",this._tabClicked.bind(this),false);tabElement.addEventListener("mousedown",this._tabMouseDown.bind(this),false);tabElement.addEventListener("mouseup",this._tabMouseUp.bind(this),false);tabElement.addEventListener("contextmenu",this._tabContextMenu.bind(this),false);if(this._tabbedPane._allowTabReorder)
WebInspector.installDragHandle(tabElement,this._startTabDragging.bind(this),this._tabDragging.bind(this),this._endTabDragging.bind(this),"-webkit-grabbing","pointer",200);}
return tabElement;},_tabClicked:function(event)
{var middleButton=event.button===1;var shouldClose=this._closeable&&(middleButton||event.target.classList.contains("tabbed-pane-close-button"));if(!shouldClose){this._tabbedPane.focus();return;}
this._closeTabs([this.id]);event.consume(true);},_tabMouseDown:function(event)
{if(event.target.classList.contains("tabbed-pane-close-button")||event.button===1)
return;this._tabbedPane.selectTab(this.id,true);},_tabMouseUp:function(event)
{if(event.button===1)
event.consume(true);},_closeTabs:function(ids)
{if(this._delegate){this._delegate.closeTabs(this._tabbedPane,ids);return;}
this._tabbedPane.closeTabs(ids,true);},_tabContextMenu:function(event)
{function close()
{this._closeTabs([this.id]);}
function closeOthers()
{this._closeTabs(this._tabbedPane.otherTabs(this.id));}
function closeAll()
{this._closeTabs(this._tabbedPane.allTabs());}
function closeToTheRight()
{this._closeTabs(this._tabbedPane._tabsToTheRight(this.id));}
var contextMenu=new WebInspector.ContextMenu(event);if(this._closeable){contextMenu.appendItem(WebInspector.UIString.capitalize("Close"),close.bind(this));contextMenu.appendItem(WebInspector.UIString.capitalize("Close ^others"),closeOthers.bind(this));contextMenu.appendItem(WebInspector.UIString.capitalize("Close ^tabs to the ^right"),closeToTheRight.bind(this));contextMenu.appendItem(WebInspector.UIString.capitalize("Close ^all"),closeAll.bind(this));}
if(this._delegate)
this._delegate.onContextMenu(this.id,contextMenu);contextMenu.show();},_startTabDragging:function(event)
{if(event.target.classList.contains("tabbed-pane-close-button"))
return false;this._dragStartX=event.pageX;this._tabElement.classList.add("dragging");this._tabbedPane._tabSlider.remove();return true;},_tabDragging:function(event)
{var tabElements=this._tabbedPane._tabsElement.childNodes;for(var i=0;i<tabElements.length;++i){var tabElement=tabElements[i];if(tabElement===this._tabElement)
continue;var intersects=tabElement.offsetLeft+tabElement.clientWidth>this._tabElement.offsetLeft&&this._tabElement.offsetLeft+this._tabElement.clientWidth>tabElement.offsetLeft;if(!intersects)
continue;if(Math.abs(event.pageX-this._dragStartX)<tabElement.clientWidth/2+5)
break;if(event.pageX-this._dragStartX>0){tabElement=tabElement.nextSibling;++i;}
var oldOffsetLeft=this._tabElement.offsetLeft;this._tabbedPane._insertBefore(this,i);this._dragStartX+=this._tabElement.offsetLeft-oldOffsetLeft;break;}
if(!this._tabElement.previousSibling&&event.pageX-this._dragStartX<0){this._tabElement.style.setProperty("left","0px");return;}
if(!this._tabElement.nextSibling&&event.pageX-this._dragStartX>0){this._tabElement.style.setProperty("left","0px");return;}
this._tabElement.style.setProperty("left",(event.pageX-this._dragStartX)+"px");},_endTabDragging:function(event)
{this._tabElement.classList.remove("dragging");this._tabElement.style.removeProperty("left");delete this._dragStartX;this._tabbedPane._updateTabSlider();}}
WebInspector.TabbedPaneTabDelegate=function()
{}
WebInspector.TabbedPaneTabDelegate.prototype={closeTabs:function(tabbedPane,ids){},onContextMenu:function(tabId,contextMenu){}}
WebInspector.ExtensibleTabbedPaneController=function(tabbedPane,extensionPoint,viewCallback)
{this._tabbedPane=tabbedPane;this._extensionPoint=extensionPoint;this._viewCallback=viewCallback;this._promiseForId={};this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,this._tabSelected,this);this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabClosed,this._tabClosed,this);this._views=new Map();this._closeableTabSetting=WebInspector.settings.createSetting(extensionPoint+"-closeableTabs",{});this._initialize();}
WebInspector.ExtensibleTabbedPaneController.prototype={_initialize:function()
{this._extensions=new Map();var extensions=self.runtime.extensions(this._extensionPoint);for(var i=0;i<extensions.length;++i){var id=extensions[i].descriptor()["name"];this._extensions.set(id,extensions[i]);if(this._isPermanentTab(id))
this._appendTab(extensions[i]);}
for(var i=0;i<extensions.length;i++){var id=extensions[i].descriptor()["name"];if(this._isCloseableTab(id)&&this._closeableTabSetting.get()[id])
this._appendTab(extensions[i]);}},_isPermanentTab:function(id)
{return this._extensions.get(id).descriptor()["persistence"]==="permanent"||!this._extensions.get(id).descriptor()["persistence"];},_isCloseableTab:function(id)
{return this._extensions.get(id).descriptor()["persistence"]==="closeable";},enableMoreTabsButton:function()
{var toolbar=new WebInspector.Toolbar("drawer-toolbar");toolbar.appendToolbarItem(new WebInspector.ToolbarMenuButton(this._appendTabsToMenu.bind(this)));this._tabbedPane.insertBeforeTabStrip(toolbar.element);this._tabbedPane.disableOverflowMenu();},_appendTabsToMenu:function(contextMenu)
{for(var id of this._extensions.keysArray().filter(this._isPermanentTab.bind(this))){var title=WebInspector.UIString(this._extensions.get(id).title(WebInspector.platform()));contextMenu.appendItem(title,this.showTab.bind(this,id));}
for(var id of this._extensions.keysArray().filter(this._isCloseableTab.bind(this))){var title=WebInspector.UIString(this._extensions.get(id).title(WebInspector.platform()));contextMenu.appendItem(title,this.showTab.bind(this,id));}},_appendTab:function(extension)
{var descriptor=extension.descriptor();var id=descriptor["name"];var title=WebInspector.UIString(extension.title(WebInspector.platform()));var closeable=descriptor["persistence"]==="closeable"||descriptor["persistence"]==="temporary";this._tabbedPane.appendTab(id,title,this._views.get(id)||new WebInspector.Widget(),undefined,false,closeable);},showTab:function(id)
{function viewLoaded(view)
{if(this._pendingView===id)
this._tabbedPane.selectTab(id);delete this._pendingView;return view;}
console.assert(this._extensions.get(id));if(!this._tabbedPane.hasTab(id))
this._appendTab((this._extensions.get(id)));this._tabbedPane.selectTab(id);var descriptor=this._extensions.get(id).descriptor();if(descriptor["persistence"]==="closeable"){var tabs=this._closeableTabSetting.get();if(!tabs[id]){tabs[id]=true;this._closeableTabSetting.set(tabs);}}
this._pendingView=id;return this.viewForId(id).then(viewLoaded.bind(this));},_tabSelected:function(event)
{var tabId=(event.data.tabId);this.viewForId(tabId);},_tabClosed:function(event)
{var tabs=this._closeableTabSetting.get();if(tabs[event.data.tabId]){delete tabs[event.data.tabId];this._closeableTabSetting.set(tabs);}},viewIds:function()
{return this._extensions.keysArray();},viewForId:function(id)
{if(this._views.has(id))
return Promise.resolve((this._views.get(id)));if(!this._extensions.has(id))
return Promise.resolve((null));if(this._promiseForId[id])
return this._promiseForId[id];var promise=this._extensions.get(id).instancePromise();this._promiseForId[id]=(promise);return promise.then(cacheView.bind(this));function cacheView(object)
{var view=(object);delete this._promiseForId[id];this._views.set(id,view);if(this._viewCallback&&view)
this._viewCallback(id,view);var shouldFocus=this._tabbedPane.visibleView.element.isSelfOrAncestor(WebInspector.currentFocusElement());this._tabbedPane.changeTabView(id,view);if(shouldFocus)
view.focus();return view;}}};WebInspector.SidebarPane=function(title)
{WebInspector.Widget.call(this);this.setMinimumSize(25,0);this.element.className="sidebar-pane";this._title=title;this._expandCallback=null;this._paneVisible=true;}
WebInspector.SidebarPane.prototype={toolbar:function()
{if(!this._toolbar){this._toolbar=new WebInspector.Toolbar("");this._toolbar.element.addEventListener("click",consumeEvent);this.element.insertBefore(this._toolbar.element,this.element.firstChild);}
return this._toolbar;},title:function()
{return this._title;},expand:function()
{this.onContentReady();},onContentReady:function()
{if(this._expandCallback)
this._expandCallback();else
this._expandPending=true;},_attached:function(setVisibleCallback,expandCallback)
{this._setVisibleCallback=setVisibleCallback;this._setVisibleCallback(this._paneVisible);this._expandCallback=expandCallback;if(this._expandPending){delete this._expandPending;this._expandCallback();}},setVisible:function(visible)
{this._paneVisible=visible;if(this._setVisibleCallback)
this._setVisibleCallback(visible)},__proto__:WebInspector.Widget.prototype}
WebInspector.SidebarPaneTitle=function(container,pane)
{this._pane=pane;this.element=container.createChild("div","sidebar-pane-title");this.element.textContent=pane.title();this.element.tabIndex=0;this.element.addEventListener("click",this._toggleExpanded.bind(this),false);this.element.addEventListener("keydown",this._onTitleKeyDown.bind(this),false);}
WebInspector.SidebarPaneTitle.prototype={_expand:function()
{this.element.classList.add("expanded");this._pane.show(this.element.parentElement,(this.element.nextSibling));},_collapse:function()
{this.element.classList.remove("expanded");if(this._pane.element.parentNode==this.element.parentNode)
this._pane.detach();},_toggleExpanded:function()
{if(this.element.classList.contains("expanded"))
this._collapse();else
this._pane.expand();},_onTitleKeyDown:function(event)
{if(isEnterKey(event)||event.keyCode===WebInspector.KeyboardShortcut.Keys.Space.code)
this._toggleExpanded();}}
WebInspector.SidebarPaneStack=function()
{WebInspector.Widget.call(this);this.setMinimumSize(25,0);this.element.className="sidebar-pane-stack";this._titleByPane=new Map();}
WebInspector.SidebarPaneStack.prototype={addPane:function(pane)
{var paneTitle=new WebInspector.SidebarPaneTitle(this.element,pane);this._titleByPane.set(pane,paneTitle);if(pane._toolbar)
paneTitle.element.appendChild(pane._toolbar.element);pane._attached(this._setPaneVisible.bind(this,pane),paneTitle._expand.bind(paneTitle));},_setPaneVisible:function(pane,visible)
{var title=this._titleByPane.get(pane);if(!title)
return;title.element.classList.toggle("hidden",!visible);pane.element.classList.toggle("sidebar-pane-hidden",!visible);},__proto__:WebInspector.Widget.prototype}
WebInspector.SidebarTabbedPane=function()
{WebInspector.TabbedPane.call(this);this.element.classList.add("sidebar-tabbed-pane");}
WebInspector.SidebarTabbedPane.prototype={addPane:function(pane)
{var title=pane.title();this.appendTab(title,title,pane);if(pane._toolbar)
pane.element.insertBefore(pane._toolbar.element,pane.element.firstChild);pane._attached(this._setPaneVisible.bind(this,pane),this.selectTab.bind(this,title));},_setPaneVisible:function(pane,visible)
{var title=pane._title;if(visible){if(!this.hasTab(title))
this.appendTab(title,title,pane);}else{if(this.hasTab(title))
this.closeTab(title);}},__proto__:WebInspector.TabbedPane.prototype};WebInspector.TextPrompt=function(completions,stopCharacters)
{this._proxyElement;this._proxyElementDisplay="inline-block";this._loadCompletions=completions;this._completionStopCharacters=stopCharacters||" =:[({;,!+-*/&|^<>.";this._autocompletionTimeout=WebInspector.TextPrompt.DefaultAutocompletionTimeout;}
WebInspector.TextPrompt.DefaultAutocompletionTimeout=250;WebInspector.TextPrompt.Events={ItemApplied:"text-prompt-item-applied",ItemAccepted:"text-prompt-item-accepted"};WebInspector.TextPrompt.prototype={setAutocompletionTimeout:function(timeout)
{this._autocompletionTimeout=timeout;},setSuggestBoxEnabled:function(suggestBoxEnabled)
{this._suggestBoxEnabled=suggestBoxEnabled;},renderAsBlock:function()
{this._proxyElementDisplay="block";},attach:function(element)
{return this._attachInternal(element);},attachAndStartEditing:function(element,blurListener)
{var proxyElement=this._attachInternal(element);this._startEditing(blurListener);return proxyElement;},_attachInternal:function(element)
{if(this._proxyElement)
throw"Cannot attach an attached TextPrompt";this._element=element;this._boundOnKeyDown=this.onKeyDown.bind(this);this._boundOnInput=this.onInput.bind(this);this._boundOnMouseWheel=this.onMouseWheel.bind(this);this._boundSelectStart=this._selectStart.bind(this);this._boundRemoveSuggestionAids=this._removeSuggestionAids.bind(this);this._proxyElement=element.ownerDocument.createElement("span");var shadowRoot=WebInspector.createShadowRootWithCoreStyles(this._proxyElement,"ui/textPrompt.css");this._contentElement=shadowRoot.createChild("div");this._contentElement.createChild("content");this._proxyElement.style.display=this._proxyElementDisplay;element.parentElement.insertBefore(this._proxyElement,element);this._proxyElement.appendChild(element);this._element.classList.add("text-prompt");this._element.addEventListener("keydown",this._boundOnKeyDown,false);this._element.addEventListener("input",this._boundOnInput,false);this._element.addEventListener("mousewheel",this._boundOnMouseWheel,false);this._element.addEventListener("selectstart",this._boundSelectStart,false);this._element.addEventListener("blur",this._boundRemoveSuggestionAids,false);this._element.ownerDocument.defaultView.addEventListener("resize",this._boundRemoveSuggestionAids,false);if(this._suggestBoxEnabled)
this._suggestBox=new WebInspector.SuggestBox(this);return this._proxyElement;},detach:function()
{this._removeFromElement();this._proxyElement.parentElement.insertBefore(this._element,this._proxyElement);this._proxyElement.remove();delete this._proxyElement;this._element.classList.remove("text-prompt");WebInspector.restoreFocusFromElement(this._element);},text:function()
{return this._element.textContent;},userEnteredText:function()
{var text=this.text();if(this.autoCompleteElement){var addition=this.autoCompleteElement.textContent;text=text.substring(0,text.length-addition.length);}
return text;},setText:function(x)
{this._removeSuggestionAids();if(!x){this._element.removeChildren();this._element.createChild("br");}else{this._element.textContent=x;}
this.moveCaretToEndOfPrompt();this._element.scrollIntoView();},_removeFromElement:function()
{this.clearAutoComplete(true);this._element.removeEventListener("keydown",this._boundOnKeyDown,false);this._element.removeEventListener("input",this._boundOnInput,false);this._element.removeEventListener("selectstart",this._boundSelectStart,false);this._element.removeEventListener("blur",this._boundRemoveSuggestionAids,false);this._element.ownerDocument.defaultView.removeEventListener("resize",this._boundRemoveSuggestionAids,false);if(this._isEditing)
this._stopEditing();if(this._suggestBox)
this._suggestBox.removeFromElement();},_startEditing:function(blurListener)
{this._isEditing=true;this._contentElement.classList.add("text-prompt-editing");if(blurListener){this._blurListener=blurListener;this._element.addEventListener("blur",this._blurListener,false);}
this._oldTabIndex=this._element.tabIndex;if(this._element.tabIndex<0)
this._element.tabIndex=0;WebInspector.setCurrentFocusElement(this._element);if(!this.text())
this._updateAutoComplete();},_stopEditing:function()
{this._element.tabIndex=this._oldTabIndex;if(this._blurListener)
this._element.removeEventListener("blur",this._blurListener,false);this._contentElement.classList.remove("text-prompt-editing");delete this._isEditing;},_removeSuggestionAids:function()
{this.clearAutoComplete();this.hideSuggestBox();},_selectStart:function()
{if(this._selectionTimeout)
clearTimeout(this._selectionTimeout);this._removeSuggestionAids();function moveBackIfOutside()
{delete this._selectionTimeout;if(!this.isCaretInsidePrompt()&&this._element.isComponentSelectionCollapsed()){this.moveCaretToEndOfPrompt();this.autoCompleteSoon();}}
this._selectionTimeout=setTimeout(moveBackIfOutside.bind(this),100);},_updateAutoComplete:function(force)
{this.clearAutoComplete();this.autoCompleteSoon(force);},onMouseWheel:function(event)
{},onKeyDown:function(event)
{var handled=false;delete this._needUpdateAutocomplete;switch(event.keyIdentifier){case"U+0009":handled=this.tabKeyPressed(event);break;case"Left":case"Home":this._removeSuggestionAids();break;case"Right":case"End":if(this.isCaretAtEndOfPrompt())
handled=this.acceptAutoComplete();else
this._removeSuggestionAids();break;case"U+001B":if(this.isSuggestBoxVisible()){this._removeSuggestionAids();handled=true;}
break;case"U+0020":if(event.ctrlKey&&!event.metaKey&&!event.altKey&&!event.shiftKey){this._updateAutoComplete(true);handled=true;}
break;case"Alt":case"Meta":case"Shift":case"Control":break;}
if(!handled&&this.isSuggestBoxVisible())
handled=this._suggestBox.keyPressed(event);if(!handled)
this._needUpdateAutocomplete=true;if(handled)
event.consume(true);},onInput:function(event)
{if(this._needUpdateAutocomplete)
this._updateAutoComplete();},acceptAutoComplete:function()
{var result=false;if(this.isSuggestBoxVisible())
result=this._suggestBox.acceptSuggestion();if(!result)
result=this._acceptSuggestionInternal();return result;},clearAutoComplete:function(includeTimeout)
{if(includeTimeout&&this._completeTimeout){clearTimeout(this._completeTimeout);delete this._completeTimeout;}
delete this._waitingForCompletions;if(!this.autoCompleteElement)
return;this.autoCompleteElement.remove();delete this.autoCompleteElement;delete this._userEnteredRange;delete this._userEnteredText;},autoCompleteSoon:function(force)
{var immediately=this.isSuggestBoxVisible()||force;if(!this._completeTimeout)
this._completeTimeout=setTimeout(this.complete.bind(this,force),immediately?0:this._autocompletionTimeout);},complete:function(force,reverse)
{this.clearAutoComplete(true);var selection=this._element.getComponentSelection();if(!selection.rangeCount)
return;var selectionRange=selection.getRangeAt(0);var shouldExit;if(!force&&!this.isCaretAtEndOfPrompt()&&!this.isSuggestBoxVisible())
shouldExit=true;else if(!selection.isCollapsed)
shouldExit=true;else if(!force){var wordSuffixRange=selectionRange.startContainer.rangeOfWord(selectionRange.endOffset,this._completionStopCharacters,this._element,"forward");if(wordSuffixRange.toString().length)
shouldExit=true;}
if(shouldExit){this.hideSuggestBox();return;}
var wordPrefixRange=selectionRange.startContainer.rangeOfWord(selectionRange.startOffset,this._completionStopCharacters,this._element,"backward");this._waitingForCompletions=true;this._loadCompletions((this._proxyElement),this.text(),selectionRange.startOffset,wordPrefixRange,force||false,this._completionsReady.bind(this,selection,wordPrefixRange,!!reverse,!!force));},disableDefaultSuggestionForEmptyInput:function()
{this._disableDefaultSuggestionForEmptyInput=true;},_boxForAnchorAtStart:function(selection,textRange)
{var rangeCopy=selection.getRangeAt(0).cloneRange();var anchorElement=createElement("span");anchorElement.textContent="\u200B";textRange.insertNode(anchorElement);var box=anchorElement.boxInWindow(window);anchorElement.remove();selection.removeAllRanges();selection.addRange(rangeCopy);return box;},_buildCommonPrefix:function(completions,wordPrefixLength)
{var commonPrefix=completions[0];for(var i=0;i<completions.length;++i){var completion=completions[i];var lastIndex=Math.min(commonPrefix.length,completion.length);for(var j=wordPrefixLength;j<lastIndex;++j){if(commonPrefix[j]!==completion[j]){commonPrefix=commonPrefix.substr(0,j);break;}}}
return commonPrefix;},_createRange:function()
{return document.createRange();},additionalCompletions:function(prefix)
{return[];},_completionsReady:function(selection,originalWordPrefixRange,reverse,force,completions,selectedIndex)
{var prefix=originalWordPrefixRange.toString();if(prefix||force){if(prefix)
completions=completions.concat(this.additionalCompletions(prefix));else
completions=this.additionalCompletions(prefix).concat(completions);}
var store=new Set();completions=completions.filter(item=>!store.has(item)&&!!store.add(item));if(!this._waitingForCompletions||!completions.length){this.hideSuggestBox();return;}
delete this._waitingForCompletions;var selectionRange=selection.getRangeAt(0);var fullWordRange=this._createRange();fullWordRange.setStart(originalWordPrefixRange.startContainer,originalWordPrefixRange.startOffset);fullWordRange.setEnd(selectionRange.endContainer,selectionRange.endOffset);if(prefix+selectionRange.toString()!==fullWordRange.toString())
return;selectedIndex=(this._disableDefaultSuggestionForEmptyInput&&!this.text())?-1:(selectedIndex||0);this._userEnteredRange=fullWordRange;this._userEnteredText=fullWordRange.toString();if(this._suggestBox)
this._suggestBox.updateSuggestions(this._boxForAnchorAtStart(selection,fullWordRange),completions,selectedIndex,!this.isCaretAtEndOfPrompt(),this._userEnteredText);if(selectedIndex===-1)
return;var wordPrefixLength=originalWordPrefixRange.toString().length;this._commonPrefix=this._buildCommonPrefix(completions,wordPrefixLength);if(this.isCaretAtEndOfPrompt()){var completionText=completions[selectedIndex];var prefixText=this._userEnteredRange.toString();var suffixText=completionText.substring(wordPrefixLength);this._userEnteredRange.deleteContents();this._element.normalize();var finalSelectionRange=this._createRange();var prefixTextNode=createTextNode(prefixText);fullWordRange.insertNode(prefixTextNode);this.autoCompleteElement=createElementWithClass("span","auto-complete-text");this.autoCompleteElement.textContent=suffixText;prefixTextNode.parentNode.insertBefore(this.autoCompleteElement,prefixTextNode.nextSibling);finalSelectionRange.setStart(prefixTextNode,wordPrefixLength);finalSelectionRange.setEnd(prefixTextNode,wordPrefixLength);selection.removeAllRanges();selection.addRange(finalSelectionRange);this.dispatchEventToListeners(WebInspector.TextPrompt.Events.ItemApplied);}},_completeCommonPrefix:function()
{if(!this.autoCompleteElement||!this._commonPrefix||!this._userEnteredText||!this._commonPrefix.startsWith(this._userEnteredText))
return;if(!this.isSuggestBoxVisible()){this.acceptAutoComplete();return;}
this.autoCompleteElement.textContent=this._commonPrefix.substring(this._userEnteredText.length);this._acceptSuggestionInternal(true);},applySuggestion:function(completionText,isIntermediateSuggestion)
{this._applySuggestion(completionText,isIntermediateSuggestion);},_applySuggestion:function(completionText,isIntermediateSuggestion)
{var wordPrefixLength=this._userEnteredText?this._userEnteredText.length:0;this._userEnteredRange.deleteContents();this._element.normalize();var finalSelectionRange=this._createRange();var completionTextNode=createTextNode(completionText);this._userEnteredRange.insertNode(completionTextNode);if(this.autoCompleteElement){this.autoCompleteElement.remove();delete this.autoCompleteElement;}
if(isIntermediateSuggestion)
finalSelectionRange.setStart(completionTextNode,wordPrefixLength);else
finalSelectionRange.setStart(completionTextNode,completionText.length);finalSelectionRange.setEnd(completionTextNode,completionText.length);var selection=this._element.getComponentSelection();selection.removeAllRanges();selection.addRange(finalSelectionRange);if(isIntermediateSuggestion)
this.dispatchEventToListeners(WebInspector.TextPrompt.Events.ItemApplied,{itemText:completionText});},acceptSuggestion:function()
{this._acceptSuggestionInternal();},_acceptSuggestionInternal:function(prefixAccepted)
{if(!this.autoCompleteElement||!this.autoCompleteElement.parentNode)
return false;var text=this.autoCompleteElement.textContent;var textNode=createTextNode(text);this.autoCompleteElement.parentNode.replaceChild(textNode,this.autoCompleteElement);delete this.autoCompleteElement;var finalSelectionRange=this._createRange();finalSelectionRange.setStart(textNode,text.length);finalSelectionRange.setEnd(textNode,text.length);var selection=this._element.getComponentSelection();selection.removeAllRanges();selection.addRange(finalSelectionRange);if(!prefixAccepted){this.hideSuggestBox();this.dispatchEventToListeners(WebInspector.TextPrompt.Events.ItemAccepted);}else
this.autoCompleteSoon(true);return true;},hideSuggestBox:function()
{if(this.isSuggestBoxVisible())
this._suggestBox.hide();},isSuggestBoxVisible:function()
{return this._suggestBox&&this._suggestBox.visible();},isCaretInsidePrompt:function()
{return this._element.isInsertionCaretInside();},isCaretAtEndOfPrompt:function()
{var selection=this._element.getComponentSelection();if(!selection.rangeCount||!selection.isCollapsed)
return false;var selectionRange=selection.getRangeAt(0);var node=selectionRange.startContainer;if(!node.isSelfOrDescendant(this._element))
return false;if(node.nodeType===Node.TEXT_NODE&&selectionRange.startOffset<node.nodeValue.length)
return false;var foundNextText=false;while(node){if(node.nodeType===Node.TEXT_NODE&&node.nodeValue.length){if(foundNextText&&(!this.autoCompleteElement||!this.autoCompleteElement.isAncestor(node)))
return false;foundNextText=true;}
node=node.traverseNextNode(this._element);}
return true;},isCaretOnFirstLine:function()
{var selection=this._element.getComponentSelection();var focusNode=selection.focusNode;if(!focusNode||focusNode.nodeType!==Node.TEXT_NODE||focusNode.parentNode!==this._element)
return true;if(focusNode.textContent.substring(0,selection.focusOffset).indexOf("\n")!==-1)
return false;focusNode=focusNode.previousSibling;while(focusNode){if(focusNode.nodeType!==Node.TEXT_NODE)
return true;if(focusNode.textContent.indexOf("\n")!==-1)
return false;focusNode=focusNode.previousSibling;}
return true;},isCaretOnLastLine:function()
{var selection=this._element.getComponentSelection();var focusNode=selection.focusNode;if(!focusNode||focusNode.nodeType!==Node.TEXT_NODE||focusNode.parentNode!==this._element)
return true;if(focusNode.textContent.substring(selection.focusOffset).indexOf("\n")!==-1)
return false;focusNode=focusNode.nextSibling;while(focusNode){if(focusNode.nodeType!==Node.TEXT_NODE)
return true;if(focusNode.textContent.indexOf("\n")!==-1)
return false;focusNode=focusNode.nextSibling;}
return true;},moveCaretToEndOfPrompt:function()
{var selection=this._element.getComponentSelection();var selectionRange=this._createRange();var container=this._element;while(container.childNodes.length)
container=container.lastChild;var offset=container.nodeType===Node.TEXT_NODE?container.textContent.length:0;selectionRange.setStart(container,offset);selectionRange.setEnd(container,offset);selection.removeAllRanges();selection.addRange(selectionRange);},tabKeyPressed:function(event)
{this._completeCommonPrefix();return true;},proxyElementForTests:function()
{return this._proxyElement||null;},__proto__:WebInspector.Object.prototype}
WebInspector.TextPromptWithHistory=function(completions,stopCharacters)
{WebInspector.TextPrompt.call(this,completions,stopCharacters);this._data=[];this._historyOffset=1;}
WebInspector.TextPromptWithHistory.prototype={historyData:function()
{return this._data;},additionalCompletions:function(prefix)
{if(!this.isCaretAtEndOfPrompt())
return[];var result=[];var text=this.text();for(var i=this._data.length-1;i>=0&&result.length<50;--i){var item=this._data[i];if(!item.startsWith(text))
continue;result.push(item.substring(text.length-prefix.length));}
return result;},setHistoryData:function(data)
{this._data=[].concat(data);this._historyOffset=1;},pushHistoryItem:function(text)
{if(this._uncommittedIsTop){this._data.pop();delete this._uncommittedIsTop;}
this._historyOffset=1;if(text===this._currentHistoryItem())
return;this._data.push(text);},_pushCurrentText:function()
{if(this._uncommittedIsTop)
this._data.pop();this._uncommittedIsTop=true;this.clearAutoComplete(true);this._data.push(this.text());},_previous:function()
{if(this._historyOffset>this._data.length)
return undefined;if(this._historyOffset===1)
this._pushCurrentText();++this._historyOffset;return this._currentHistoryItem();},_next:function()
{if(this._historyOffset===1)
return undefined;--this._historyOffset;return this._currentHistoryItem();},_currentHistoryItem:function()
{return this._data[this._data.length-this._historyOffset];},onKeyDown:function(event)
{var newText;var isPrevious;switch(event.keyIdentifier){case"Up":if(!this.isCaretOnFirstLine()||this.isSuggestBoxVisible())
break;newText=this._previous();isPrevious=true;break;case"Down":if(!this.isCaretOnLastLine()||this.isSuggestBoxVisible())
break;newText=this._next();break;case"U+0050":if(WebInspector.isMac()&&event.ctrlKey&&!event.metaKey&&!event.altKey&&!event.shiftKey){newText=this._previous();isPrevious=true;}
break;case"U+004E":if(WebInspector.isMac()&&event.ctrlKey&&!event.metaKey&&!event.altKey&&!event.shiftKey)
newText=this._next();break;}
if(newText!==undefined){event.consume(true);this.setText(newText);if(isPrevious){var firstNewlineIndex=this.text().indexOf("\n");if(firstNewlineIndex===-1)
this.moveCaretToEndOfPrompt();else{var selection=this._element.getComponentSelection();var selectionRange=this._createRange();selectionRange.setStart(this._element.firstChild,firstNewlineIndex);selectionRange.setEnd(this._element.firstChild,firstNewlineIndex);selection.removeAllRanges();selection.addRange(selectionRange);}}
return;}
WebInspector.TextPrompt.prototype.onKeyDown.apply(this,arguments);},__proto__:WebInspector.TextPrompt.prototype};WebInspector.highlightedSearchResultClassName="highlighted-search-result";WebInspector.installDragHandle=function(element,elementDragStart,elementDrag,elementDragEnd,cursor,hoverCursor,startDelay)
{function onMouseDown(event)
{var dragStart=WebInspector.elementDragStart.bind(WebInspector,element,elementDragStart,elementDrag,elementDragEnd,cursor,event);if(!startDelay)
dragStart();startTimer=setTimeout(dragStart,startDelay||0);}
function onMouseUp()
{if(startTimer)
clearInterval(startTimer);startTimer=null;}
var startTimer;element.addEventListener("mousedown",onMouseDown,false);if(startDelay)
element.addEventListener("mouseup",onMouseUp,false);if(hoverCursor!==null)
element.style.cursor=hoverCursor||cursor;}
WebInspector.elementDragStart=function(targetElement,elementDragStart,elementDrag,elementDragEnd,cursor,event)
{if(event.button||(WebInspector.isMac()&&event.ctrlKey))
return;if(WebInspector._elementDraggingEventListener)
return;if(elementDragStart&&!elementDragStart((event)))
return;if(WebInspector._elementDraggingGlassPane){WebInspector._elementDraggingGlassPane.dispose();delete WebInspector._elementDraggingGlassPane;}
var targetDocument=event.target.ownerDocument;WebInspector._elementDraggingEventListener=elementDrag;WebInspector._elementEndDraggingEventListener=elementDragEnd;WebInspector._mouseOutWhileDraggingTargetDocument=targetDocument;WebInspector._dragEventsTargetDocument=targetDocument;WebInspector._dragEventsTargetDocumentTop=targetDocument.defaultView.top.document;targetDocument.addEventListener("mousemove",WebInspector._elementDragMove,true);targetDocument.addEventListener("mouseup",WebInspector._elementDragEnd,true);targetDocument.addEventListener("mouseout",WebInspector._mouseOutWhileDragging,true);if(targetDocument!==WebInspector._dragEventsTargetDocumentTop)
WebInspector._dragEventsTargetDocumentTop.addEventListener("mouseup",WebInspector._elementDragEnd,true);if(typeof cursor==="string"){WebInspector._restoreCursorAfterDrag=restoreCursor.bind(null,targetElement.style.cursor);targetElement.style.cursor=cursor;targetDocument.body.style.cursor=cursor;}
function restoreCursor(oldCursor)
{targetDocument.body.style.removeProperty("cursor");targetElement.style.cursor=oldCursor;WebInspector._restoreCursorAfterDrag=null;}
event.preventDefault();}
WebInspector._mouseOutWhileDragging=function()
{var document=WebInspector._mouseOutWhileDraggingTargetDocument;WebInspector._unregisterMouseOutWhileDragging();WebInspector._elementDraggingGlassPane=new WebInspector.GlassPane(document);}
WebInspector._unregisterMouseOutWhileDragging=function()
{if(!WebInspector._mouseOutWhileDraggingTargetDocument)
return;WebInspector._mouseOutWhileDraggingTargetDocument.removeEventListener("mouseout",WebInspector._mouseOutWhileDragging,true);delete WebInspector._mouseOutWhileDraggingTargetDocument;}
WebInspector._unregisterDragEvents=function()
{if(!WebInspector._dragEventsTargetDocument)
return;WebInspector._dragEventsTargetDocument.removeEventListener("mousemove",WebInspector._elementDragMove,true);WebInspector._dragEventsTargetDocument.removeEventListener("mouseup",WebInspector._elementDragEnd,true);if(WebInspector._dragEventsTargetDocument!==WebInspector._dragEventsTargetDocumentTop)
WebInspector._dragEventsTargetDocumentTop.removeEventListener("mouseup",WebInspector._elementDragEnd,true);delete WebInspector._dragEventsTargetDocument;delete WebInspector._dragEventsTargetDocumentTop;}
WebInspector._elementDragMove=function(event)
{if(event.buttons!==1){WebInspector._elementDragEnd(event);return;}
if(WebInspector._elementDraggingEventListener((event)))
WebInspector._cancelDragEvents(event);}
WebInspector._cancelDragEvents=function(event)
{WebInspector._unregisterDragEvents();WebInspector._unregisterMouseOutWhileDragging();if(WebInspector._restoreCursorAfterDrag)
WebInspector._restoreCursorAfterDrag();if(WebInspector._elementDraggingGlassPane)
WebInspector._elementDraggingGlassPane.dispose();delete WebInspector._elementDraggingGlassPane;delete WebInspector._elementDraggingEventListener;delete WebInspector._elementEndDraggingEventListener;}
WebInspector._elementDragEnd=function(event)
{var elementDragEnd=WebInspector._elementEndDraggingEventListener;WebInspector._cancelDragEvents((event));event.preventDefault();if(elementDragEnd)
elementDragEnd((event));}
WebInspector.GlassPane=function(document,dimmed)
{this.element=createElement("div");var background=dimmed?"rgba(255, 255, 255, 0.5)":"transparent";this._zIndex=WebInspector._glassPane?WebInspector._glassPane._zIndex+1000:3000;this.element.style.cssText="position:absolute;top:0;bottom:0;left:0;right:0;background-color:"+background+";z-index:"+this._zIndex+";overflow:hidden;";document.body.appendChild(this.element);WebInspector._glassPane=this;}
WebInspector.GlassPane.prototype={dispose:function()
{delete WebInspector._glassPane;if(WebInspector.GlassPane.DefaultFocusedViewStack.length)
WebInspector.GlassPane.DefaultFocusedViewStack.peekLast().focus();this.element.remove();}}
WebInspector._glassPane;WebInspector.GlassPane.DefaultFocusedViewStack=[];WebInspector.isBeingEdited=function(node)
{if(!node||node.nodeType!==Node.ELEMENT_NODE)
return false;var element=(node);if(element.classList.contains("text-prompt")||element.nodeName==="INPUT"||element.nodeName==="TEXTAREA")
return true;if(!WebInspector.__editingCount)
return false;while(element){if(element.__editing)
return true;element=element.parentElementOrShadowHost();}
return false;}
WebInspector.isEditing=function()
{if(WebInspector.__editingCount)
return true;var element=WebInspector.currentFocusElement();if(!element)
return false;return element.classList.contains("text-prompt")||element.nodeName==="INPUT"||element.nodeName==="TEXTAREA";}
WebInspector.markBeingEdited=function(element,value)
{if(value){if(element.__editing)
return false;element.classList.add("being-edited");element.__editing=true;WebInspector.__editingCount=(WebInspector.__editingCount||0)+1;}else{if(!element.__editing)
return false;element.classList.remove("being-edited");delete element.__editing;--WebInspector.__editingCount;}
return true;}
WebInspector.CSSNumberRegex=/^(-?(?:\d+(?:\.\d+)?|\.\d+))$/;WebInspector.StyleValueDelimiters=" \xA0\t\n\"':;,/()";WebInspector._valueModificationDirection=function(event)
{var direction=null;if(event.type==="mousewheel"){if(event.wheelDeltaY>0)
direction="Up";else if(event.wheelDeltaY<0)
direction="Down";}else{if(event.keyIdentifier==="Up"||event.keyIdentifier==="PageUp")
direction="Up";else if(event.keyIdentifier==="Down"||event.keyIdentifier==="PageDown")
direction="Down";}
return direction;}
WebInspector._modifiedHexValue=function(hexString,event)
{var direction=WebInspector._valueModificationDirection(event);if(!direction)
return hexString;var number=parseInt(hexString,16);if(isNaN(number)||!isFinite(number))
return hexString;var maxValue=Math.pow(16,hexString.length)-1;var arrowKeyOrMouseWheelEvent=(event.keyIdentifier==="Up"||event.keyIdentifier==="Down"||event.type==="mousewheel");var delta;if(arrowKeyOrMouseWheelEvent)
delta=(direction==="Up")?1:-1;else
delta=(event.keyIdentifier==="PageUp")?16:-16;if(event.shiftKey)
delta*=16;var result=number+delta;if(result<0)
result=0;else if(result>maxValue)
return hexString;var resultString=result.toString(16).toUpperCase();for(var i=0,lengthDelta=hexString.length-resultString.length;i<lengthDelta;++i)
resultString="0"+resultString;return resultString;}
WebInspector._modifiedFloatNumber=function(number,event)
{var direction=WebInspector._valueModificationDirection(event);if(!direction)
return number;var arrowKeyOrMouseWheelEvent=(event.keyIdentifier==="Up"||event.keyIdentifier==="Down"||event.type==="mousewheel");var changeAmount=1;if(event.shiftKey&&!arrowKeyOrMouseWheelEvent)
changeAmount=100;else if(event.shiftKey||!arrowKeyOrMouseWheelEvent)
changeAmount=10;else if(event.altKey)
changeAmount=0.1;if(direction==="Down")
changeAmount*=-1;var result=Number((number+changeAmount).toFixed(6));if(!String(result).match(WebInspector.CSSNumberRegex))
return null;return result;}
WebInspector.createReplacementString=function(wordString,event,customNumberHandler)
{var replacementString;var prefix,suffix,number;var matches;matches=/(.*#)([\da-fA-F]+)(.*)/.exec(wordString);if(matches&&matches.length){prefix=matches[1];suffix=matches[3];number=WebInspector._modifiedHexValue(matches[2],event);replacementString=customNumberHandler?customNumberHandler(prefix,number,suffix):prefix+number+suffix;}else{matches=/(.*?)(-?(?:\d+(?:\.\d+)?|\.\d+))(.*)/.exec(wordString);if(matches&&matches.length){prefix=matches[1];suffix=matches[3];number=WebInspector._modifiedFloatNumber(parseFloat(matches[2]),event);if(number===null)
return null;replacementString=customNumberHandler?customNumberHandler(prefix,number,suffix):prefix+number+suffix;}}
return replacementString||null;}
WebInspector.handleElementValueModifications=function(event,element,finishHandler,suggestionHandler,customNumberHandler)
{function createRange()
{return document.createRange();}
var arrowKeyOrMouseWheelEvent=(event.keyIdentifier==="Up"||event.keyIdentifier==="Down"||event.type==="mousewheel");var pageKeyPressed=(event.keyIdentifier==="PageUp"||event.keyIdentifier==="PageDown");if(!arrowKeyOrMouseWheelEvent&&!pageKeyPressed)
return false;var selection=element.getComponentSelection();if(!selection.rangeCount)
return false;var selectionRange=selection.getRangeAt(0);if(!selectionRange.commonAncestorContainer.isSelfOrDescendant(element))
return false;var originalValue=element.textContent;var wordRange=selectionRange.startContainer.rangeOfWord(selectionRange.startOffset,WebInspector.StyleValueDelimiters,element);var wordString=wordRange.toString();if(suggestionHandler&&suggestionHandler(wordString))
return false;var replacementString=WebInspector.createReplacementString(wordString,event,customNumberHandler);if(replacementString){var replacementTextNode=createTextNode(replacementString);wordRange.deleteContents();wordRange.insertNode(replacementTextNode);var finalSelectionRange=createRange();finalSelectionRange.setStart(replacementTextNode,0);finalSelectionRange.setEnd(replacementTextNode,replacementString.length);selection.removeAllRanges();selection.addRange(finalSelectionRange);event.handled=true;event.preventDefault();if(finishHandler)
finishHandler(originalValue,replacementString);return true;}
return false;}
Number.preciseMillisToString=function(ms,precision)
{precision=precision||0;var format="%."+precision+"f\u2009ms";return WebInspector.UIString(format,ms);}
WebInspector._subMillisFormat=new WebInspector.UIStringFormat("%.2f\u2009ms");WebInspector._millisFormat=new WebInspector.UIStringFormat("%.0f\u2009ms");WebInspector._secondsFormat=new WebInspector.UIStringFormat("%.2f\u2009s");WebInspector._minutesFormat=new WebInspector.UIStringFormat("%.1f\u2009min");WebInspector._hoursFormat=new WebInspector.UIStringFormat("%.1f\u2009hrs");WebInspector._daysFormat=new WebInspector.UIStringFormat("%.1f\u2009days");Number.millisToString=function(ms,higherResolution)
{if(!isFinite(ms))
return"-";if(ms===0)
return"0";if(higherResolution&&ms<1000)
return WebInspector._subMillisFormat.format(ms);else if(ms<1000)
return WebInspector._millisFormat.format(ms);var seconds=ms/1000;if(seconds<60)
return WebInspector._secondsFormat.format(seconds);var minutes=seconds/60;if(minutes<60)
return WebInspector._minutesFormat.format(minutes);var hours=minutes/60;if(hours<24)
return WebInspector._hoursFormat.format(hours);var days=hours/24;return WebInspector._daysFormat.format(days);}
Number.secondsToString=function(seconds,higherResolution)
{if(!isFinite(seconds))
return"-";return Number.millisToString(seconds*1000,higherResolution);}
Number.bytesToString=function(bytes)
{if(bytes<1024)
return WebInspector.UIString("%.0f\u2009B",bytes);var kilobytes=bytes/1024;if(kilobytes<100)
return WebInspector.UIString("%.1f\u2009KB",kilobytes);if(kilobytes<1024)
return WebInspector.UIString("%.0f\u2009KB",kilobytes);var megabytes=kilobytes/1024;if(megabytes<100)
return WebInspector.UIString("%.1f\u2009MB",megabytes);else
return WebInspector.UIString("%.0f\u2009MB",megabytes);}
Number.withThousandsSeparator=function(num)
{var str=num+"";var re=/(\d+)(\d{3})/;while(str.match(re))
str=str.replace(re,"$1\u2009$2");return str;}
WebInspector.formatLocalized=function(format,substitutions)
{var formatters={s:substitution=>substitution};function append(a,b)
{a.appendChild(typeof b==="string"?createTextNode(b):b);return a;}
return String.format(WebInspector.UIString(format),substitutions,formatters,createElement("span"),append).formattedResult;}
WebInspector.openLinkExternallyLabel=function()
{return WebInspector.UIString.capitalize("Open ^link in ^new ^tab");}
WebInspector.copyLinkAddressLabel=function()
{return WebInspector.UIString.capitalize("Copy ^link ^address");}
WebInspector.anotherProfilerActiveLabel=function()
{return WebInspector.UIString("Another profiler is already active");}
WebInspector.asyncStackTraceLabel=function(description)
{if(description)
return description+" "+WebInspector.UIString("(async)");return WebInspector.UIString("Async Call");}
WebInspector.manageBlackboxingSettingsTabLabel=function()
{return WebInspector.UIString("Blackboxing");}
WebInspector.installComponentRootStyles=function(element)
{WebInspector.appendStyle(element,"ui/inspectorCommon.css");WebInspector.themeSupport.injectHighlightStyleSheets(element);element.classList.add("platform-"+WebInspector.platform());if(Runtime.experiments.isEnabled("materialDesign"))
element.classList.add("material");}
WebInspector.createShadowRootWithCoreStyles=function(element,cssFile)
{var shadowRoot=element.createShadowRoot();WebInspector.appendStyle(shadowRoot,"ui/inspectorCommon.css");WebInspector.themeSupport.injectHighlightStyleSheets(shadowRoot);if(cssFile)
WebInspector.appendStyle(shadowRoot,cssFile);shadowRoot.addEventListener("focus",WebInspector._focusChanged.bind(WebInspector),true);return shadowRoot;}
WebInspector._windowFocused=function(document,event)
{if(event.target.document.nodeType===Node.DOCUMENT_NODE)
document.body.classList.remove("inactive");}
WebInspector._windowBlurred=function(document,event)
{if(event.target.document.nodeType===Node.DOCUMENT_NODE)
document.body.classList.add("inactive");}
WebInspector.previousFocusElement=function()
{return WebInspector._previousFocusElement;}
WebInspector.currentFocusElement=function()
{return WebInspector._currentFocusElement;}
WebInspector._focusChanged=function(event)
{var node=event.deepActiveElement();WebInspector.setCurrentFocusElement(node);}
WebInspector._documentBlurred=function(document,event)
{if(!event.relatedTarget&&document.activeElement===document.body)
WebInspector.setCurrentFocusElement(null);}
WebInspector._textInputTypes=["text","search","tel","url","email","password"].keySet();WebInspector._isTextEditingElement=function(element)
{if(element instanceof HTMLInputElement)
return element.type in WebInspector._textInputTypes;if(element instanceof HTMLTextAreaElement)
return true;return false;}
WebInspector.setCurrentFocusElement=function(x)
{if(WebInspector._glassPane&&x&&!WebInspector._glassPane.element.isAncestor(x))
return;if(WebInspector._currentFocusElement!==x)
WebInspector._previousFocusElement=WebInspector._currentFocusElement;WebInspector._currentFocusElement=x;if(x){x.focus();var selection=x.getComponentSelection();if(!WebInspector._isTextEditingElement(x)&&selection.isCollapsed&&!x.isInsertionCaretInside()){var selectionRange=x.ownerDocument.createRange();selectionRange.setStart(x,0);selectionRange.setEnd(x,0);selection.removeAllRanges();selection.addRange(selectionRange);}}else if(WebInspector._previousFocusElement)
WebInspector._previousFocusElement.blur();}
WebInspector.restoreFocusFromElement=function(element)
{if(element&&element.isSelfOrAncestor(WebInspector.currentFocusElement()))
WebInspector.setCurrentFocusElement(WebInspector.previousFocusElement());}
WebInspector.highlightSearchResult=function(element,offset,length,domChanges)
{var result=WebInspector.highlightSearchResults(element,[new WebInspector.SourceRange(offset,length)],domChanges);return result.length?result[0]:null;}
WebInspector.highlightSearchResults=function(element,resultRanges,changes)
{return WebInspector.highlightRangesWithStyleClass(element,resultRanges,WebInspector.highlightedSearchResultClassName,changes);}
WebInspector.runCSSAnimationOnce=function(element,className)
{function animationEndCallback()
{element.classList.remove(className);element.removeEventListener("webkitAnimationEnd",animationEndCallback,false);}
if(element.classList.contains(className))
element.classList.remove(className);element.addEventListener("webkitAnimationEnd",animationEndCallback,false);element.classList.add(className);}
WebInspector.highlightRangesWithStyleClass=function(element,resultRanges,styleClass,changes)
{changes=changes||[];var highlightNodes=[];var textNodes=element.childTextNodes();var lineText=textNodes.map(function(node){return node.textContent;}).join("");var ownerDocument=element.ownerDocument;if(textNodes.length===0)
return highlightNodes;var nodeRanges=[];var rangeEndOffset=0;for(var i=0;i<textNodes.length;++i){var range={};range.offset=rangeEndOffset;range.length=textNodes[i].textContent.length;rangeEndOffset=range.offset+range.length;nodeRanges.push(range);}
var startIndex=0;for(var i=0;i<resultRanges.length;++i){var startOffset=resultRanges[i].offset;var endOffset=startOffset+resultRanges[i].length;while(startIndex<textNodes.length&&nodeRanges[startIndex].offset+nodeRanges[startIndex].length<=startOffset)
startIndex++;var endIndex=startIndex;while(endIndex<textNodes.length&&nodeRanges[endIndex].offset+nodeRanges[endIndex].length<endOffset)
endIndex++;if(endIndex===textNodes.length)
break;var highlightNode=ownerDocument.createElement("span");highlightNode.className=styleClass;highlightNode.textContent=lineText.substring(startOffset,endOffset);var lastTextNode=textNodes[endIndex];var lastText=lastTextNode.textContent;lastTextNode.textContent=lastText.substring(endOffset-nodeRanges[endIndex].offset);changes.push({node:lastTextNode,type:"changed",oldText:lastText,newText:lastTextNode.textContent});if(startIndex===endIndex){lastTextNode.parentElement.insertBefore(highlightNode,lastTextNode);changes.push({node:highlightNode,type:"added",nextSibling:lastTextNode,parent:lastTextNode.parentElement});highlightNodes.push(highlightNode);var prefixNode=ownerDocument.createTextNode(lastText.substring(0,startOffset-nodeRanges[startIndex].offset));lastTextNode.parentElement.insertBefore(prefixNode,highlightNode);changes.push({node:prefixNode,type:"added",nextSibling:highlightNode,parent:lastTextNode.parentElement});}else{var firstTextNode=textNodes[startIndex];var firstText=firstTextNode.textContent;var anchorElement=firstTextNode.nextSibling;firstTextNode.parentElement.insertBefore(highlightNode,anchorElement);changes.push({node:highlightNode,type:"added",nextSibling:anchorElement,parent:firstTextNode.parentElement});highlightNodes.push(highlightNode);firstTextNode.textContent=firstText.substring(0,startOffset-nodeRanges[startIndex].offset);changes.push({node:firstTextNode,type:"changed",oldText:firstText,newText:firstTextNode.textContent});for(var j=startIndex+1;j<endIndex;j++){var textNode=textNodes[j];var text=textNode.textContent;textNode.textContent="";changes.push({node:textNode,type:"changed",oldText:text,newText:textNode.textContent});}}
startIndex=endIndex;nodeRanges[startIndex].offset=endOffset;nodeRanges[startIndex].length=lastTextNode.textContent.length;}
return highlightNodes;}
WebInspector.applyDomChanges=function(domChanges)
{for(var i=0,size=domChanges.length;i<size;++i){var entry=domChanges[i];switch(entry.type){case"added":entry.parent.insertBefore(entry.node,entry.nextSibling);break;case"changed":entry.node.textContent=entry.newText;break;}}}
WebInspector.revertDomChanges=function(domChanges)
{for(var i=domChanges.length-1;i>=0;--i){var entry=domChanges[i];switch(entry.type){case"added":entry.node.remove();break;case"changed":entry.node.textContent=entry.oldText;break;}}}
WebInspector.measurePreferredSize=function(element,containerElement)
{containerElement=containerElement||element.ownerDocument.body;containerElement.appendChild(element);element.positionAt(0,0);var result=new Size(element.offsetWidth,element.offsetHeight);element.positionAt(undefined,undefined);element.remove();return result;}
WebInspector.InvokeOnceHandlers=function(autoInvoke)
{this._handlers=null;this._autoInvoke=autoInvoke;}
WebInspector.InvokeOnceHandlers.prototype={add:function(object,method)
{if(!this._handlers){this._handlers=new Map();if(this._autoInvoke)
this.scheduleInvoke();}
var methods=this._handlers.get(object);if(!methods){methods=new Set();this._handlers.set(object,methods);}
methods.add(method);},scheduleInvoke:function()
{if(this._handlers)
requestAnimationFrame(this._invoke.bind(this));},_invoke:function()
{var handlers=this._handlers;this._handlers=null;var keys=handlers.keysArray();for(var i=0;i<keys.length;++i){var object=keys[i];var methods=handlers.get(object).valuesArray();for(var j=0;j<methods.length;++j)
methods[j].call(object);}}}
WebInspector._coalescingLevel=0;WebInspector._postUpdateHandlers=null;WebInspector.startBatchUpdate=function()
{if(!WebInspector._coalescingLevel++)
WebInspector._postUpdateHandlers=new WebInspector.InvokeOnceHandlers(false);}
WebInspector.endBatchUpdate=function()
{if(--WebInspector._coalescingLevel)
return;WebInspector._postUpdateHandlers.scheduleInvoke();WebInspector._postUpdateHandlers=null;}
WebInspector.invokeOnceAfterBatchUpdate=function(object,method)
{if(!WebInspector._postUpdateHandlers)
WebInspector._postUpdateHandlers=new WebInspector.InvokeOnceHandlers(true);WebInspector._postUpdateHandlers.add(object,method);}
WebInspector.animateFunction=function(window,func,params,frames,animationComplete)
{var values=new Array(params.length);var deltas=new Array(params.length);for(var i=0;i<params.length;++i){values[i]=params[i].from;deltas[i]=(params[i].to-params[i].from)/frames;}
var raf=window.requestAnimationFrame(animationStep);var framesLeft=frames;function animationStep()
{if(--framesLeft<0){if(animationComplete)
animationComplete();return;}
for(var i=0;i<params.length;++i){if(params[i].to>params[i].from)
values[i]=Number.constrain(values[i]+deltas[i],params[i].from,params[i].to);else
values[i]=Number.constrain(values[i]+deltas[i],params[i].to,params[i].from);}
func.apply(null,values);raf=window.requestAnimationFrame(animationStep);}
function cancelAnimation()
{window.cancelAnimationFrame(raf);}
return cancelAnimation;}
WebInspector.LongClickController=function(element,callback)
{this._element=element;this._callback=callback;this._enable();}
WebInspector.LongClickController.prototype={reset:function()
{if(this._longClickInterval){clearInterval(this._longClickInterval);delete this._longClickInterval;}},_enable:function()
{if(this._longClickData)
return;var boundMouseDown=mouseDown.bind(this);var boundMouseUp=mouseUp.bind(this);var boundReset=this.reset.bind(this);this._element.addEventListener("mousedown",boundMouseDown,false);this._element.addEventListener("mouseout",boundReset,false);this._element.addEventListener("mouseup",boundMouseUp,false);this._element.addEventListener("click",boundReset,true);this._longClickData={mouseUp:boundMouseUp,mouseDown:boundMouseDown,reset:boundReset};function mouseDown(e)
{if(e.which!==1)
return;var callback=this._callback;this._longClickInterval=setTimeout(callback.bind(null,e),200);}
function mouseUp(e)
{if(e.which!==1)
return;this.reset();}},dispose:function()
{if(!this._longClickData)
return;this._element.removeEventListener("mousedown",this._longClickData.mouseDown,false);this._element.removeEventListener("mouseout",this._longClickData.reset,false);this._element.removeEventListener("mouseup",this._longClickData.mouseUp,false);this._element.addEventListener("click",this._longClickData.reset,true);delete this._longClickData;},__proto__:WebInspector.Object.prototype}
WebInspector.initializeUIUtils=function(document,themeSetting)
{document.defaultView.addEventListener("focus",WebInspector._windowFocused.bind(WebInspector,document),false);document.defaultView.addEventListener("blur",WebInspector._windowBlurred.bind(WebInspector,document),false);document.addEventListener("focus",WebInspector._focusChanged.bind(WebInspector),true);document.addEventListener("blur",WebInspector._documentBlurred.bind(WebInspector,document),true);if(!WebInspector.themeSupport)
WebInspector.themeSupport=new WebInspector.ThemeSupport(themeSetting);WebInspector.themeSupport.applyTheme(document);}
WebInspector.beautifyFunctionName=function(name)
{return name||WebInspector.UIString("(anonymous function)");}
function registerCustomElement(localName,typeExtension,prototype)
{return document.registerElement(typeExtension,{prototype:Object.create(prototype),extends:localName});}
function createTextButton(text,clickHandler,className,title)
{var element=createElementWithClass("button",className||"","text-button");element.textContent=text;if(clickHandler)
element.addEventListener("click",clickHandler,false);if(title)
element.title=title;return element;}
function createRadioLabel(name,title,checked)
{var element=createElement("label","dt-radio");element.radioElement.name=name;element.radioElement.checked=!!checked;element.createTextChild(title);return element;}
function createCheckboxLabel(title,checked)
{var element=createElement("label","dt-checkbox");element.checkboxElement.checked=!!checked;if(title!==undefined){element.textElement=element.createChild("div","dt-checkbox-text");element.textElement.textContent=title;}
return element;}
WebInspector.appendStyle=function(node,cssFile)
{var content=Runtime.cachedResources[cssFile]||"";if(!content)
console.error(cssFile+" not preloaded. Check module.json");var styleElement=createElement("style");styleElement.type="text/css";styleElement.textContent=content;node.appendChild(styleElement);var themeStyleSheet=WebInspector.themeSupport.themeStyleSheet(cssFile,content);if(themeStyleSheet){styleElement=createElement("style");styleElement.type="text/css";styleElement.textContent=themeStyleSheet+"\n"+Runtime.resolveSourceURL(cssFile+".theme");node.appendChild(styleElement);}};(function(){registerCustomElement("button","text-button",{createdCallback:function()
{this.type="button";var root=WebInspector.createShadowRootWithCoreStyles(this,"ui/textButton.css");root.createChild("content");},__proto__:HTMLButtonElement.prototype});registerCustomElement("label","dt-radio",{createdCallback:function()
{this.radioElement=this.createChild("input","dt-radio-button");this.radioElement.type="radio";var root=WebInspector.createShadowRootWithCoreStyles(this,"ui/radioButton.css");root.createChild("content").select=".dt-radio-button";root.createChild("content");this.addEventListener("click",radioClickHandler,false);},__proto__:HTMLLabelElement.prototype});function radioClickHandler(event)
{if(this.radioElement.checked||this.radioElement.disabled)
return;this.radioElement.checked=true;this.radioElement.dispatchEvent(new Event("change"));}
registerCustomElement("label","dt-checkbox",{createdCallback:function()
{this._root=WebInspector.createShadowRootWithCoreStyles(this,"ui/checkboxTextLabel.css");var checkboxElement=createElementWithClass("input","dt-checkbox-button");checkboxElement.type="checkbox";this._root.appendChild(checkboxElement);this.checkboxElement=checkboxElement;this.addEventListener("click",toggleCheckbox.bind(this));function toggleCheckbox(event)
{if(event.target!==checkboxElement&&event.target!==this){event.consume();checkboxElement.click();}}
this._root.createChild("content");},set backgroundColor(color)
{this.checkboxElement.classList.add("dt-checkbox-themed");this.checkboxElement.style.backgroundColor=color;},set checkColor(color)
{this.checkboxElement.classList.add("dt-checkbox-themed");var stylesheet=createElement("style");stylesheet.textContent="input.dt-checkbox-themed:checked:after { background-color: "+color+"}";this._root.appendChild(stylesheet);},set borderColor(color)
{this.checkboxElement.classList.add("dt-checkbox-themed");this.checkboxElement.style.borderColor=color;},__proto__:HTMLLabelElement.prototype});registerCustomElement("label","dt-icon-label",{createdCallback:function()
{var root=WebInspector.createShadowRootWithCoreStyles(this,"ui/smallIcon.css");this._iconElement=root.createChild("div");root.createChild("content");},set type(type)
{this._iconElement.className=type;},__proto__:HTMLLabelElement.prototype});registerCustomElement("div","dt-close-button",{createdCallback:function()
{var root=WebInspector.createShadowRootWithCoreStyles(this,"ui/closeButton.css");this._buttonElement=root.createChild("div","close-button");},set gray(gray)
{this._buttonElement.className=gray?"close-button-gray":"close-button";},__proto__:HTMLDivElement.prototype});})();WebInspector.StringFormatter=function()
{this._processors=[];this._regexes=[];}
WebInspector.StringFormatter.prototype={addProcessor:function(regex,handler)
{this._regexes.push(regex);this._processors.push(handler);},formatText:function(text)
{return this._runProcessor(0,text);},_runProcessor:function(processorIndex,text)
{if(processorIndex>=this._processors.length)
return createTextNode(text);var container=createDocumentFragment();var regex=this._regexes[processorIndex];var processor=this._processors[processorIndex];var items=text.replace(regex,"\0$1\0").split("\0");for(var i=0;i<items.length;++i){var processedNode=i%2?processor(items[i]):this._runProcessor(processorIndex+1,items[i]);container.appendChild(processedNode);}
return container;}}
WebInspector.ThemeSupport=function(setting)
{this._themeName=setting.get()||"default";this._themableProperties=new Set(["color","box-shadow","text-shadow","outline-color","background-image","background-color","border-left-color","border-right-color","border-top-color","border-bottom-color","-webkit-border-image"]);this._cachedThemePatches=new Map();this._setting=setting;}
WebInspector.ThemeSupport.prototype={hasTheme:function()
{return this._themeName!=="default";},injectHighlightStyleSheets:function(element)
{this._injectingStyleSheet=true;WebInspector.appendStyle(element,"ui/inspectorSyntaxHighlight.css");if(this._themeName==="dark")
WebInspector.appendStyle(element,"ui/inspectorSyntaxHighlightDark.css");this._injectingStyleSheet=false;},applyTheme:function(document)
{if(!this.hasTheme())
return;if(this._themeName==="dark")
document.body.classList.add("-theme-with-dark-background");var styleSheets=document.styleSheets;var result=[];for(var i=0;i<styleSheets.length;++i)
result.push(this._patchForTheme(styleSheets[i].href,styleSheets[i]));result.push("/*# sourceURL=inspector.css.theme */");var styleElement=createElement("style");styleElement.type="text/css";styleElement.textContent=result.join("\n");document.head.appendChild(styleElement);},themeStyleSheet:function(id,text)
{if(!this.hasTheme()||this._injectingStyleSheet)
return"";var patch=this._cachedThemePatches.get(id);if(!patch){var styleElement=createElement("style");styleElement.type="text/css";styleElement.textContent=text;document.body.appendChild(styleElement);patch=this._patchForTheme(id,styleElement.sheet);document.body.removeChild(styleElement);}
return patch;},_patchForTheme:function(id,styleSheet)
{var cached=this._cachedThemePatches.get(id);if(cached)
return cached;try{var rules=styleSheet.cssRules;var result=[];for(var j=0;j<rules.length;++j){if(rules[j]instanceof CSSImportRule){result.push(this._patchForTheme(rules[j].styleSheet.href,rules[j].styleSheet));continue;}
var output=[];var style=rules[j].style;var selectorText=rules[j].selectorText;for(var i=0;style&&i<style.length;++i)
this._patchProperty(selectorText,style,style[i],output);if(output.length)
result.push(rules[j].selectorText+"{"+output.join("")+"}");}
var fullText=result.join("\n");this._cachedThemePatches.set(id,fullText);return fullText;}catch(e){this._setting.set("default");return"";}},_patchProperty:function(selectorText,style,name,output)
{if(!this._themableProperties.has(name))
return;var value=style.getPropertyValue(name);if(!value||value==="none"||value==="inherit"||value==="initial"||value==="transparent")
return;if(name==="background-image"&&value.indexOf("gradient")===-1)
return;var isSelection=selectorText.indexOf(".-theme-selection-color")!==-1;if(selectorText.indexOf("-theme-")!==-1&&!isSelection)
return;if(name==="-webkit-border-image"){output.push("-webkit-filter: invert(100%)");return;}
isSelection=isSelection||selectorText.indexOf("selected")!==-1||selectorText.indexOf(".selection")!==-1;var isBackground=name.indexOf("background")===0||name.indexOf("border")===0;var isForeground=name.indexOf("background")===-1;var colorRegex=/((?:rgb|hsl)a?\([^)]+\)|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}|\b\w+\b(?!-))/g;output.push(name);output.push(":");var items=value.replace(colorRegex,"\0$1\0").split("\0");for(var i=0;i<items.length;++i)
output.push(this._patchColor(items[i],isSelection,isBackground,isForeground));if(style.getPropertyPriority(name))
output.push(" !important");output.push(";");},_patchColor:function(text,isSelection,isBackground,isForeground)
{var color=WebInspector.Color.parse(text);if(!color)
return text;var hsla=color.hsla();this._patchHSLA(hsla,isSelection,isBackground,isForeground);var rgba=[];WebInspector.Color.hsl2rgb(hsla,rgba);var outColor=new WebInspector.Color(rgba,color.format());var outText=outColor.asString(null);if(!outText)
outText=outColor.asString(outColor.hasAlpha()?WebInspector.Color.Format.RGBA:WebInspector.Color.Format.RGB);return outText||text;},_patchHSLA:function(hsla,isSelection,isBackground,isForeground)
{var hue=hsla[0];var sat=hsla[1];var lit=hsla[2];var alpha=hsla[3]
switch(this._themeName){case"dark":if(isSelection)
hue=(hue+0.5)%1;var minCap=isBackground?0.14:0;var maxCap=isForeground?0.9:1;lit=1-lit;if(lit<minCap*2)
lit=minCap+lit/2;else if(lit>2*maxCap-1)
lit=maxCap-1/2+lit/2;break;}
hsla[0]=Number.constrain(hue,0,1);hsla[1]=Number.constrain(sat,0,1);hsla[2]=Number.constrain(lit,0,1);hsla[3]=Number.constrain(alpha,0,1);}}
WebInspector.uiLabelForPriority=function(priority)
{var labelMap=WebInspector.uiLabelForPriority._priorityToUILabel;if(!labelMap){labelMap=new Map([[NetworkAgent.ResourcePriority.VeryLow,WebInspector.UIString("Lowest")],[NetworkAgent.ResourcePriority.Low,WebInspector.UIString("Low")],[NetworkAgent.ResourcePriority.Medium,WebInspector.UIString("Medium")],[NetworkAgent.ResourcePriority.High,WebInspector.UIString("High")],[NetworkAgent.ResourcePriority.VeryHigh,WebInspector.UIString("Highest")]]);WebInspector.uiLabelForPriority._priorityToUILabel=labelMap;}
return labelMap.get(priority)||WebInspector.UIString("Unknown");}
WebInspector.themeSupport;;WebInspector.ViewportControl=function(provider)
{this.element=createElement("div");this.element.style.overflow="auto";this._topGapElement=this.element.createChild("div");this._topGapElement.textContent=".";this._topGapElement.style.height="0px";this._topGapElement.style.color="transparent";this._contentElement=this.element.createChild("div");this._bottomGapElement=this.element.createChild("div");this._bottomGapElement.textContent=".";this._bottomGapElement.style.height="0px";this._bottomGapElement.style.color="transparent";this._provider=provider;this.element.addEventListener("scroll",this._onScroll.bind(this),false);this.element.addEventListener("copy",this._onCopy.bind(this),false);this.element.addEventListener("dragstart",this._onDragStart.bind(this),false);this._firstVisibleIndex=0;this._lastVisibleIndex=-1;this._renderedItems=[];this._anchorSelection=null;this._headSelection=null;this._stickToBottom=false;this._scrolledToBottom=true;}
WebInspector.ViewportControl.Provider=function()
{}
WebInspector.ViewportControl.Provider.prototype={fastHeight:function(index){return 0;},itemCount:function(){return 0;},minimumRowHeight:function(){return 0;},itemElement:function(index){return null;}}
WebInspector.ViewportElement=function(){}
WebInspector.ViewportElement.prototype={willHide:function(){},wasShown:function(){},element:function(){},}
WebInspector.StaticViewportElement=function(element)
{this._element=element;}
WebInspector.StaticViewportElement.prototype={willHide:function(){},wasShown:function(){},element:function()
{return this._element;},}
WebInspector.ViewportControl.prototype={scrolledToBottom:function()
{return this._scrolledToBottom;},setStickToBottom:function(value)
{this._stickToBottom=value;},_onCopy:function(event)
{var text=this._selectedText();if(!text)
return;event.preventDefault();event.clipboardData.setData("text/plain",text);},_onDragStart:function(event)
{var text=this._selectedText();if(!text)
return false;event.dataTransfer.clearData();event.dataTransfer.setData("text/plain",text);event.dataTransfer.effectAllowed="copy";return true;},contentElement:function()
{return this._contentElement;},invalidate:function()
{delete this._cumulativeHeights;delete this._cachedProviderElements;this.refresh();},_providerElement:function(index)
{if(!this._cachedProviderElements)
this._cachedProviderElements=new Array(this._provider.itemCount());var element=this._cachedProviderElements[index];if(!element){element=this._provider.itemElement(index);this._cachedProviderElements[index]=element;}
return element;},_rebuildCumulativeHeightsIfNeeded:function()
{if(this._cumulativeHeights)
return;var itemCount=this._provider.itemCount();if(!itemCount)
return;var firstVisibleIndex=this._firstVisibleIndex;var lastVisibleIndex=this._lastVisibleIndex;var height=0;this._cumulativeHeights=new Int32Array(itemCount);for(var i=0;i<itemCount;++i){if(firstVisibleIndex<=i&&i<=lastVisibleIndex)
height+=this._renderedItems[i-firstVisibleIndex].element().offsetHeight;else
height+=this._provider.fastHeight(i);this._cumulativeHeights[i]=height;}},_cachedItemHeight:function(index)
{return index===0?this._cumulativeHeights[0]:this._cumulativeHeights[index]-this._cumulativeHeights[index-1];},_isSelectionBackwards:function(selection)
{if(!selection||!selection.rangeCount)
return false;var range=document.createRange();range.setStart(selection.anchorNode,selection.anchorOffset);range.setEnd(selection.focusNode,selection.focusOffset);return range.collapsed;},_createSelectionModel:function(itemIndex,node,offset)
{return{item:itemIndex,node:node,offset:offset};},_updateSelectionModel:function(selection)
{if(!selection||!selection.rangeCount||selection.isCollapsed){this._headSelection=null;this._anchorSelection=null;return false;}
var firstSelected=Number.MAX_VALUE;var lastSelected=-1;var range=selection.getRangeAt(0);var hasVisibleSelection=false;for(var i=0;i<this._renderedItems.length;++i){if(range.intersectsNode(this._renderedItems[i].element())){var index=i+this._firstVisibleIndex;firstSelected=Math.min(firstSelected,index);lastSelected=Math.max(lastSelected,index);hasVisibleSelection=true;}}
if(hasVisibleSelection){firstSelected=this._createSelectionModel(firstSelected,(range.startContainer),range.startOffset);lastSelected=this._createSelectionModel(lastSelected,(range.endContainer),range.endOffset);}
var topOverlap=range.intersectsNode(this._topGapElement)&&this._topGapElement._active;var bottomOverlap=range.intersectsNode(this._bottomGapElement)&&this._bottomGapElement._active;if(!topOverlap&&!bottomOverlap&&!hasVisibleSelection){this._headSelection=null;this._anchorSelection=null;return false;}
if(!this._anchorSelection||!this._headSelection){this._anchorSelection=this._createSelectionModel(0,this.element,0);this._headSelection=this._createSelectionModel(this._provider.itemCount()-1,this.element,this.element.children.length);this._selectionIsBackward=false;}
var isBackward=this._isSelectionBackwards(selection);var startSelection=this._selectionIsBackward?this._headSelection:this._anchorSelection;var endSelection=this._selectionIsBackward?this._anchorSelection:this._headSelection;if(topOverlap&&bottomOverlap&&hasVisibleSelection){firstSelected=firstSelected.item<startSelection.item?firstSelected:startSelection;lastSelected=lastSelected.item>endSelection.item?lastSelected:endSelection;}else if(!hasVisibleSelection){firstSelected=startSelection;lastSelected=endSelection;}else if(topOverlap)
firstSelected=isBackward?this._headSelection:this._anchorSelection;else if(bottomOverlap)
lastSelected=isBackward?this._anchorSelection:this._headSelection;if(isBackward){this._anchorSelection=lastSelected;this._headSelection=firstSelected;}else{this._anchorSelection=firstSelected;this._headSelection=lastSelected;}
this._selectionIsBackward=isBackward;return true;},_restoreSelection:function(selection)
{var anchorElement=null;var anchorOffset;if(this._firstVisibleIndex<=this._anchorSelection.item&&this._anchorSelection.item<=this._lastVisibleIndex){anchorElement=this._anchorSelection.node;anchorOffset=this._anchorSelection.offset;}else{if(this._anchorSelection.item<this._firstVisibleIndex)
anchorElement=this._topGapElement;else if(this._anchorSelection.item>this._lastVisibleIndex)
anchorElement=this._bottomGapElement;anchorOffset=this._selectionIsBackward?1:0;}
var headElement=null;var headOffset;if(this._firstVisibleIndex<=this._headSelection.item&&this._headSelection.item<=this._lastVisibleIndex){headElement=this._headSelection.node;headOffset=this._headSelection.offset;}else{if(this._headSelection.item<this._firstVisibleIndex)
headElement=this._topGapElement;else if(this._headSelection.item>this._lastVisibleIndex)
headElement=this._bottomGapElement;headOffset=this._selectionIsBackward?0:1;}
selection.setBaseAndExtent(anchorElement,anchorOffset,headElement,headOffset);},refresh:function()
{if(!this._visibleHeight())
return;var itemCount=this._provider.itemCount();if(!itemCount){for(var i=0;i<this._renderedItems.length;++i)
this._renderedItems[i].willHide();this._renderedItems=[];this._contentElement.removeChildren();this._topGapElement.style.height="0px";this._bottomGapElement.style.height="0px";this._firstVisibleIndex=-1;this._lastVisibleIndex=-1;return;}
var selection=this.element.getComponentSelection();var shouldRestoreSelection=this._updateSelectionModel(selection);var visibleFrom=this.element.scrollTop;var visibleHeight=this._visibleHeight();this._scrolledToBottom=this.element.isScrolledToBottom();var isInvalidating=!this._cumulativeHeights;if(this._cumulativeHeights&&itemCount!==this._cumulativeHeights.length)
delete this._cumulativeHeights;for(var i=0;i<this._renderedItems.length;++i){if(this._cumulativeHeights&&Math.abs(this._cachedItemHeight(this._firstVisibleIndex+i)-this._renderedItems[i].element().offsetHeight)>1)
delete this._cumulativeHeights;}
this._rebuildCumulativeHeightsIfNeeded();var oldFirstVisibleIndex=this._firstVisibleIndex;var oldLastVisibleIndex=this._lastVisibleIndex;var shouldStickToBottom=this._stickToBottom&&this._scrolledToBottom;if(shouldStickToBottom){this._lastVisibleIndex=itemCount-1;this._firstVisibleIndex=Math.max(itemCount-Math.ceil(visibleHeight/this._provider.minimumRowHeight()),0);}else{this._firstVisibleIndex=Math.max(Array.prototype.lowerBound.call(this._cumulativeHeights,visibleFrom+1),0);this._lastVisibleIndex=this._firstVisibleIndex+Math.ceil(visibleHeight/this._provider.minimumRowHeight())-1;this._lastVisibleIndex=Math.min(this._lastVisibleIndex,itemCount-1);}
var topGapHeight=this._cumulativeHeights[this._firstVisibleIndex-1]||0;var bottomGapHeight=this._cumulativeHeights[this._cumulativeHeights.length-1]-this._cumulativeHeights[this._lastVisibleIndex];function prepare()
{this._topGapElement.style.height=topGapHeight+"px";this._bottomGapElement.style.height=bottomGapHeight+"px";this._topGapElement._active=!!topGapHeight;this._bottomGapElement._active=!!bottomGapHeight;this._contentElement.style.setProperty("height","10000000px");}
if(isInvalidating)
this._fullViewportUpdate(prepare.bind(this));else
this._partialViewportUpdate(oldFirstVisibleIndex,oldLastVisibleIndex,prepare.bind(this));this._contentElement.style.removeProperty("height");if(shouldRestoreSelection)
this._restoreSelection(selection);if(shouldStickToBottom)
this.element.scrollTop=this.element.scrollHeight;},_fullViewportUpdate:function(prepare)
{for(var i=0;i<this._renderedItems.length;++i)
this._renderedItems[i].willHide();prepare();this._renderedItems=[];this._contentElement.removeChildren();for(var i=this._firstVisibleIndex;i<=this._lastVisibleIndex;++i){var viewportElement=this._providerElement(i);this._contentElement.appendChild(viewportElement.element());this._renderedItems.push(viewportElement);}
for(var i=0;i<this._renderedItems.length;++i)
this._renderedItems[i].wasShown();},_partialViewportUpdate:function(oldFirstVisibleIndex,oldLastVisibleIndex,prepare)
{var willBeHidden=[];for(var i=0;i<this._renderedItems.length;++i){var index=oldFirstVisibleIndex+i;if(index<this._firstVisibleIndex||this._lastVisibleIndex<index)
willBeHidden.push(this._renderedItems[i]);}
for(var i=0;i<willBeHidden.length;++i)
willBeHidden[i].willHide();prepare();for(var i=0;i<willBeHidden.length;++i)
willBeHidden[i].element().remove();this._renderedItems=[];var anchor=this._contentElement.firstChild;var wasShown=[];for(var i=this._firstVisibleIndex;i<=this._lastVisibleIndex;++i){var viewportElement=this._providerElement(i);var element=viewportElement.element();if(element!==anchor){this._contentElement.insertBefore(element,anchor);wasShown.push(viewportElement);}else{anchor=anchor.nextSibling;}
this._renderedItems.push(viewportElement);}
for(var i=0;i<wasShown.length;++i)
wasShown[i].wasShown();},_selectedText:function()
{this._updateSelectionModel(this.element.getComponentSelection());if(!this._headSelection||!this._anchorSelection)
return null;var startSelection=null;var endSelection=null;if(this._selectionIsBackward){startSelection=this._headSelection;endSelection=this._anchorSelection;}else{startSelection=this._anchorSelection;endSelection=this._headSelection;}
var textLines=[];for(var i=startSelection.item;i<=endSelection.item;++i)
textLines.push(this._providerElement(i).element().deepTextContent());var endSelectionElement=this._providerElement(endSelection.item).element();if(endSelection.node&&endSelection.node.isSelfOrDescendant(endSelectionElement)){var itemTextOffset=this._textOffsetInNode(endSelectionElement,endSelection.node,endSelection.offset);textLines[textLines.length-1]=textLines.peekLast().substring(0,itemTextOffset);}
var startSelectionElement=this._providerElement(startSelection.item).element();if(startSelection.node&&startSelection.node.isSelfOrDescendant(startSelectionElement)){var itemTextOffset=this._textOffsetInNode(startSelectionElement,startSelection.node,startSelection.offset);textLines[0]=textLines[0].substring(itemTextOffset);}
return textLines.join("\n");},_textOffsetInNode:function(itemElement,container,offset)
{var chars=0;var node=itemElement;while((node=node.traverseNextTextNode())&&node!==container)
chars+=node.textContent.length;return chars+offset;},_onScroll:function(event)
{this.refresh();},firstVisibleIndex:function()
{return this._firstVisibleIndex;},lastVisibleIndex:function()
{return this._lastVisibleIndex;},renderedElementAt:function(index)
{if(index<this._firstVisibleIndex)
return null;if(index>this._lastVisibleIndex)
return null;return this._renderedItems[index-this._firstVisibleIndex].element();},scrollItemIntoView:function(index,makeLast)
{if(index>this._firstVisibleIndex&&index<this._lastVisibleIndex)
return;if(makeLast)
this.forceScrollItemToBeLast(index);else if(index<=this._firstVisibleIndex)
this.forceScrollItemToBeFirst(index);else if(index>=this._lastVisibleIndex)
this.forceScrollItemToBeLast(index);},forceScrollItemToBeFirst:function(index)
{this._rebuildCumulativeHeightsIfNeeded();this.element.scrollTop=index>0?this._cumulativeHeights[index-1]:0;this.refresh();},forceScrollItemToBeLast:function(index)
{this._rebuildCumulativeHeightsIfNeeded();this.element.scrollTop=this._cumulativeHeights[index]-this._visibleHeight();this.refresh();},_visibleHeight:function()
{return this.element.offsetHeight;}};WebInspector.ZoomManager=function(window,frontendHost)
{this._frontendHost=frontendHost;this._zoomFactor=this._frontendHost.zoomFactor();window.addEventListener("resize",this._onWindowResize.bind(this),true);};WebInspector.ZoomManager.Events={ZoomChanged:"ZoomChanged"};WebInspector.ZoomManager.prototype={zoomFactor:function()
{return this._zoomFactor;},cssToDIP:function(value)
{return value*this._zoomFactor;},dipToCSS:function(valueDIP)
{return valueDIP/this._zoomFactor;},_onWindowResize:function()
{var oldZoomFactor=this._zoomFactor;this._zoomFactor=this._frontendHost.zoomFactor();if(oldZoomFactor!==this._zoomFactor)
this.dispatchEventToListeners(WebInspector.ZoomManager.Events.ZoomChanged,{from:oldZoomFactor,to:this._zoomFactor});},__proto__:WebInspector.Object.prototype};WebInspector.zoomManager;;WebInspector.ThrottledWidget=function()
{WebInspector.Widget.call(this);this._updateThrottler=new WebInspector.Throttler(100);this._updateWhenVisible=false;}
WebInspector.ThrottledWidget.prototype={doUpdate:function()
{return Promise.resolve();},update:function()
{this._updateWhenVisible=!this.isShowing();if(this._updateWhenVisible)
return;this._updateThrottler.schedule(innerUpdate.bind(this));function innerUpdate()
{if(this.isShowing()){return this.doUpdate();}else{this._updateWhenVisible=true;return Promise.resolve();}}},wasShown:function()
{WebInspector.Widget.prototype.wasShown.call(this);if(this._updateWhenVisible)
this.update();},__proto__:WebInspector.Widget.prototype};function InspectorBackendClass()
{this._agentPrototypes={};this._dispatcherPrototypes={};this._initialized=false;this._initProtocolAgentsConstructor();}
InspectorBackendClass._DevToolsErrorCode=-32000;InspectorBackendClass.DevToolsStubErrorCode=-32015;InspectorBackendClass.reportProtocolError=function(error,messageObject)
{console.error(error+": "+JSON.stringify(messageObject));}
InspectorBackendClass.prototype={isInitialized:function()
{return this._initialized;},_initProtocolAgentsConstructor:function()
{window.Protocol={};window.Protocol.Agents=function(agentsMap){this._agentsMap=agentsMap;};},_addAgentGetterMethodToProtocolAgentsPrototype:function(domain)
{var upperCaseLength=0;while(upperCaseLength<domain.length&&domain[upperCaseLength].toLowerCase()!==domain[upperCaseLength])
++upperCaseLength;var methodName=domain.substr(0,upperCaseLength).toLowerCase()+domain.slice(upperCaseLength)+"Agent";function agentGetter()
{return this._agentsMap[domain];}
window.Protocol.Agents.prototype[methodName]=agentGetter;function registerDispatcher(dispatcher)
{this.registerDispatcher(domain,dispatcher)}
window.Protocol.Agents.prototype["register"+domain+"Dispatcher"]=registerDispatcher;},_agentPrototype:function(domain)
{if(!this._agentPrototypes[domain]){this._agentPrototypes[domain]=new InspectorBackendClass.AgentPrototype(domain);this._addAgentGetterMethodToProtocolAgentsPrototype(domain);}
return this._agentPrototypes[domain];},_dispatcherPrototype:function(domain)
{if(!this._dispatcherPrototypes[domain])
this._dispatcherPrototypes[domain]=new InspectorBackendClass.DispatcherPrototype();return this._dispatcherPrototypes[domain];},registerCommand:function(method,signature,replyArgs,hasErrorData)
{var domainAndMethod=method.split(".");this._agentPrototype(domainAndMethod[0]).registerCommand(domainAndMethod[1],signature,replyArgs,hasErrorData);this._initialized=true;},registerEnum:function(type,values)
{var domainAndMethod=type.split(".");var agentName=domainAndMethod[0]+"Agent";if(!window[agentName])
window[agentName]={};window[agentName][domainAndMethod[1]]=values;this._initialized=true;},registerEvent:function(eventName,params)
{var domain=eventName.split(".")[0];this._dispatcherPrototype(domain).registerEvent(eventName,params);this._initialized=true;},wrapClientCallback:function(clientCallback,errorPrefix,constructor,defaultValue)
{function callbackWrapper(error,value)
{if(error){console.error(errorPrefix+error);clientCallback(defaultValue);return;}
if(constructor)
clientCallback(new constructor(value));else
clientCallback(value);}
return callbackWrapper;}}
InspectorBackendClass.Connection=function()
{this._lastMessageId=1;this._pendingResponsesCount=0;this._agents={};this._dispatchers={};this._callbacks={};this._initialize(InspectorBackend._agentPrototypes,InspectorBackend._dispatcherPrototypes);this._isConnected=true;}
InspectorBackendClass.Connection.Events={Disconnected:"Disconnected",}
InspectorBackendClass.Connection.prototype={_initialize:function(agentPrototypes,dispatcherPrototypes)
{for(var domain in agentPrototypes){this._agents[domain]=Object.create(agentPrototypes[domain]);this._agents[domain].setConnection(this);}
for(var domain in dispatcherPrototypes)
this._dispatchers[domain]=Object.create(dispatcherPrototypes[domain]);},nextMessageId:function()
{return this._lastMessageId++;},agent:function(domain)
{return this._agents[domain];},agentsMap:function()
{return this._agents;},_wrapCallbackAndSendMessageObject:function(domain,method,params,callback)
{if(!this._isConnected&&callback){this._dispatchConnectionErrorResponse(domain,method,callback);return;}
var messageObject={};var messageId=this.nextMessageId();messageObject.id=messageId;messageObject.method=method;if(params)
messageObject.params=params;var wrappedCallback=this._wrap(callback,domain,method);if(InspectorBackendClass.Options.dumpInspectorProtocolMessages)
this._dumpProtocolMessage("frontend: "+JSON.stringify(messageObject));this.sendMessage(messageObject);++this._pendingResponsesCount;this._callbacks[messageId]=wrappedCallback;},_wrap:function(callback,domain,method)
{if(!callback)
callback=function(){};callback.methodName=method;callback.domain=domain;if(InspectorBackendClass.Options.dumpInspectorTimeStats)
callback.sendRequestTime=Date.now();return callback;},sendMessage:function(messageObject)
{throw"Not implemented";},dispatch:function(message)
{if(InspectorBackendClass.Options.dumpInspectorProtocolMessages)
this._dumpProtocolMessage("backend: "+((typeof message==="string")?message:JSON.stringify(message)));var messageObject=((typeof message==="string")?JSON.parse(message):message);if("id"in messageObject){var callback=this._callbacks[messageObject.id];if(!callback){InspectorBackendClass.reportProtocolError("Protocol Error: the message with wrong id",messageObject);return;}
var processingStartTime;if(InspectorBackendClass.Options.dumpInspectorTimeStats)
processingStartTime=Date.now();this.agent(callback.domain).dispatchResponse(messageObject,callback.methodName,callback);--this._pendingResponsesCount;delete this._callbacks[messageObject.id];if(InspectorBackendClass.Options.dumpInspectorTimeStats)
console.log("time-stats: "+callback.methodName+" = "+(processingStartTime-callback.sendRequestTime)+" + "+(Date.now()-processingStartTime));if(this._scripts&&!this._pendingResponsesCount)
this.runAfterPendingDispatches();return;}else{var method=messageObject.method.split(".");var domainName=method[0];if(!(domainName in this._dispatchers)){InspectorBackendClass.reportProtocolError("Protocol Error: the message "+messageObject.method+" is for non-existing domain '"+domainName+"'",messageObject);return;}
this._dispatchers[domainName].dispatch(method[1],messageObject);}},registerDispatcher:function(domain,dispatcher)
{if(!this._dispatchers[domain])
return;this._dispatchers[domain].setDomainDispatcher(dispatcher);},runAfterPendingDispatches:function(script)
{if(!this._scripts)
this._scripts=[];if(script)
this._scripts.push(script);setTimeout(function(){if(!this._pendingResponsesCount)
this._executeAfterPendingDispatches();else
this.runAfterPendingDispatches();}.bind(this),0);},_executeAfterPendingDispatches:function()
{if(!this._pendingResponsesCount){var scripts=this._scripts;this._scripts=[];for(var id=0;id<scripts.length;++id)
scripts[id].call(this);}},_dumpProtocolMessage:function(message)
{console.log(message);},connectionClosed:function(reason)
{this._isConnected=false;this._runPendingCallbacks();this.dispatchEventToListeners(InspectorBackendClass.Connection.Events.Disconnected,{reason:reason});},_runPendingCallbacks:function()
{var keys=Object.keys(this._callbacks).map(function(num){return parseInt(num,10);});for(var i=0;i<keys.length;++i){var callback=this._callbacks[keys[i]];this._dispatchConnectionErrorResponse(callback.domain,callback.methodName,callback);}
this._callbacks={};},_dispatchConnectionErrorResponse:function(domain,methodName,callback)
{var error={message:"Connection is closed, can't dispatch pending "+methodName,code:InspectorBackendClass._DevToolsErrorCode,data:null};var messageObject={error:error};setTimeout(InspectorBackendClass.AgentPrototype.prototype.dispatchResponse.bind(this.agent(domain),messageObject,methodName,callback),0);},isClosed:function()
{return!this._isConnected;},suppressErrorsForDomains:function(domains)
{domains.forEach(function(domain){this._agents[domain].suppressErrorLogging();},this);},__proto__:WebInspector.Object.prototype}
InspectorBackendClass.AgentPrototype=function(domain)
{this._replyArgs={};this._hasErrorData={};this._domain=domain;this._suppressErrorLogging=false;}
InspectorBackendClass.AgentPrototype.prototype={setConnection:function(connection)
{this._connection=connection;},registerCommand:function(methodName,signature,replyArgs,hasErrorData)
{var domainAndMethod=this._domain+"."+methodName;function sendMessagePromise(vararg)
{var params=Array.prototype.slice.call(arguments);return InspectorBackendClass.AgentPrototype.prototype._sendMessageToBackendPromise.call(this,domainAndMethod,signature,params);}
this[methodName]=sendMessagePromise;function invoke(vararg)
{var params=[domainAndMethod].concat(Array.prototype.slice.call(arguments));InspectorBackendClass.AgentPrototype.prototype._invoke.apply(this,params);}
this["invoke_"+methodName]=invoke;this._replyArgs[domainAndMethod]=replyArgs;if(hasErrorData)
this._hasErrorData[domainAndMethod]=true;},_prepareParameters:function(method,signature,args,allowExtraUndefinedArg,errorCallback)
{var params={};var hasParams=false;for(var i=0;i<signature.length;++i){var param=signature[i];var paramName=param["name"];var typeName=param["type"];var optionalFlag=param["optional"];if(!args.length&&!optionalFlag){errorCallback("Protocol Error: Invalid number of arguments for method '"+method+"' call. It must have the following arguments '"+JSON.stringify(signature)+"'.");return null;}
var value=args.shift();if(optionalFlag&&typeof value==="undefined")
continue;if(typeof value!==typeName){errorCallback("Protocol Error: Invalid type of argument '"+paramName+"' for method '"+method+"' call. It must be '"+typeName+"' but it is '"+typeof value+"'.");return null;}
params[paramName]=value;hasParams=true;}
if(args.length===1&&(!allowExtraUndefinedArg||(typeof args[0]!=="undefined"))){errorCallback("Protocol Error: Optional callback argument for method '"+method+"' call must be a function but its type is '"+typeof args[0]+"'.");return null;}
if(args.length>1){errorCallback("Protocol Error: Extra "+args.length+" arguments in a call to method '"+method+"'.");return null;}
return hasParams?params:null},_sendMessageToBackendPromise:function(method,signature,args)
{var errorMessage;function onError(message)
{console.error(message);errorMessage=message;}
var userCallback=(args.length&&typeof args.peekLast()==="function")?args.pop():null;var params=this._prepareParameters(method,signature,args,!userCallback,onError);if(errorMessage)
return Promise.reject(new Error(errorMessage));else
return new Promise(promiseAction.bind(this));function promiseAction(resolve,reject)
{function callback(vararg)
{var result=userCallback?userCallback.apply(null,arguments):undefined;resolve(result);}
this._connection._wrapCallbackAndSendMessageObject(this._domain,method,params,callback);}},_invoke:function(method,args,callback)
{this._connection._wrapCallbackAndSendMessageObject(this._domain,method,args,callback);},dispatchResponse:function(messageObject,methodName,callback)
{if(messageObject.error&&messageObject.error.code!==InspectorBackendClass._DevToolsErrorCode&&messageObject.error.code!==InspectorBackendClass.DevToolsStubErrorCode&&!InspectorBackendClass.Options.suppressRequestErrors&&!this._suppressErrorLogging){var id=InspectorBackendClass.Options.dumpInspectorProtocolMessages?" with id = "+messageObject.id:"";console.error("Request "+methodName+id+" failed. "+JSON.stringify(messageObject.error));}
var argumentsArray=[];argumentsArray[0]=messageObject.error?messageObject.error.message:null;if(this._hasErrorData[methodName])
argumentsArray[1]=messageObject.error?messageObject.error.data:null;if(messageObject.result){var paramNames=this._replyArgs[methodName]||[];for(var i=0;i<paramNames.length;++i)
argumentsArray.push(messageObject.result[paramNames[i]]);}
callback.apply(null,argumentsArray);},suppressErrorLogging:function()
{this._suppressErrorLogging=true;}}
InspectorBackendClass.DispatcherPrototype=function()
{this._eventArgs={};this._dispatcher=null;}
InspectorBackendClass.DispatcherPrototype.prototype={registerEvent:function(eventName,params)
{this._eventArgs[eventName]=params;},setDomainDispatcher:function(dispatcher)
{this._dispatcher=dispatcher;},dispatch:function(functionName,messageObject)
{if(!this._dispatcher)
return;if(!(functionName in this._dispatcher)){InspectorBackendClass.reportProtocolError("Protocol Error: Attempted to dispatch an unimplemented method '"+messageObject.method+"'",messageObject);return;}
if(!this._eventArgs[messageObject.method]){InspectorBackendClass.reportProtocolError("Protocol Error: Attempted to dispatch an unspecified method '"+messageObject.method+"'",messageObject);return;}
var params=[];if(messageObject.params){var paramNames=this._eventArgs[messageObject.method];for(var i=0;i<paramNames.length;++i)
params.push(messageObject.params[paramNames[i]]);}
var processingStartTime;if(InspectorBackendClass.Options.dumpInspectorTimeStats)
processingStartTime=Date.now();this._dispatcher[functionName].apply(this._dispatcher,params);if(InspectorBackendClass.Options.dumpInspectorTimeStats)
console.log("time-stats: "+messageObject.method+" = "+(Date.now()-processingStartTime));}}
InspectorBackendClass.Options={dumpInspectorTimeStats:false,dumpInspectorProtocolMessages:false,suppressRequestErrors:false}
InspectorBackend=new InspectorBackendClass();;InspectorBackend.registerEvent("Inspector.evaluateForTestInFrontend",["testCallId","script"]);InspectorBackend.registerEvent("Inspector.inspect",["object","hints"]);InspectorBackend.registerEvent("Inspector.detached",["reason"]);InspectorBackend.registerEvent("Inspector.targetCrashed",[]);InspectorBackend.registerCommand("Inspector.enable",[],[],false);InspectorBackend.registerCommand("Inspector.disable",[],[],false);InspectorBackend.registerEnum("Memory.PressureLevel",{Moderate:"moderate",Critical:"critical"});InspectorBackend.registerCommand("Memory.getDOMCounters",[],["documents","nodes","jsEventListeners"],false);InspectorBackend.registerCommand("Memory.setPressureNotificationsSuppressed",[{"name":"suppressed","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Memory.simulatePressureNotification",[{"name":"level","type":"string","optional":false}],[],false);InspectorBackend.registerEnum("Page.ResourceType",{Document:"Document",Stylesheet:"Stylesheet",Image:"Image",Media:"Media",Font:"Font",Script:"Script",TextTrack:"TextTrack",XHR:"XHR",Fetch:"Fetch",EventSource:"EventSource",WebSocket:"WebSocket",Manifest:"Manifest",Other:"Other"});InspectorBackend.registerEnum("Page.DialogType",{Alert:"alert",Confirm:"confirm",Prompt:"prompt",Beforeunload:"beforeunload"});InspectorBackend.registerEvent("Page.domContentEventFired",["timestamp"]);InspectorBackend.registerEvent("Page.loadEventFired",["timestamp"]);InspectorBackend.registerEvent("Page.frameAttached",["frameId","parentFrameId"]);InspectorBackend.registerEvent("Page.frameNavigated",["frame"]);InspectorBackend.registerEvent("Page.frameDetached",["frameId"]);InspectorBackend.registerEvent("Page.frameStartedLoading",["frameId"]);InspectorBackend.registerEvent("Page.frameStoppedLoading",["frameId"]);InspectorBackend.registerEvent("Page.frameScheduledNavigation",["frameId","delay"]);InspectorBackend.registerEvent("Page.frameClearedScheduledNavigation",["frameId"]);InspectorBackend.registerEvent("Page.frameResized",[]);InspectorBackend.registerEvent("Page.javascriptDialogOpening",["message","type"]);InspectorBackend.registerEvent("Page.javascriptDialogClosed",["result"]);InspectorBackend.registerEvent("Page.screencastFrame",["data","metadata","sessionId"]);InspectorBackend.registerEvent("Page.screencastVisibilityChanged",["visible"]);InspectorBackend.registerEvent("Page.colorPicked",["color"]);InspectorBackend.registerEvent("Page.interstitialShown",[]);InspectorBackend.registerEvent("Page.interstitialHidden",[]);InspectorBackend.registerCommand("Page.enable",[],[],false);InspectorBackend.registerCommand("Page.disable",[],[],false);InspectorBackend.registerCommand("Page.addScriptToEvaluateOnLoad",[{"name":"scriptSource","type":"string","optional":false}],["identifier"],false);InspectorBackend.registerCommand("Page.removeScriptToEvaluateOnLoad",[{"name":"identifier","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Page.reload",[{"name":"ignoreCache","type":"boolean","optional":true},{"name":"scriptToEvaluateOnLoad","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Page.navigate",[{"name":"url","type":"string","optional":false}],["frameId"],false);InspectorBackend.registerCommand("Page.getNavigationHistory",[],["currentIndex","entries"],false);InspectorBackend.registerCommand("Page.navigateToHistoryEntry",[{"name":"entryId","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Page.getCookies",[],["cookies"],false);InspectorBackend.registerCommand("Page.deleteCookie",[{"name":"cookieName","type":"string","optional":false},{"name":"url","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Page.getResourceTree",[],["frameTree"],false);InspectorBackend.registerCommand("Page.getResourceContent",[{"name":"frameId","type":"string","optional":false},{"name":"url","type":"string","optional":false}],["content","base64Encoded"],false);InspectorBackend.registerCommand("Page.searchInResource",[{"name":"frameId","type":"string","optional":false},{"name":"url","type":"string","optional":false},{"name":"query","type":"string","optional":false},{"name":"caseSensitive","type":"boolean","optional":true},{"name":"isRegex","type":"boolean","optional":true}],["result"],false);InspectorBackend.registerCommand("Page.setDocumentContent",[{"name":"frameId","type":"string","optional":false},{"name":"html","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Page.setDeviceMetricsOverride",[{"name":"width","type":"number","optional":false},{"name":"height","type":"number","optional":false},{"name":"deviceScaleFactor","type":"number","optional":false},{"name":"mobile","type":"boolean","optional":false},{"name":"fitWindow","type":"boolean","optional":false},{"name":"scale","type":"number","optional":true},{"name":"offsetX","type":"number","optional":true},{"name":"offsetY","type":"number","optional":true},{"name":"screenWidth","type":"number","optional":true},{"name":"screenHeight","type":"number","optional":true},{"name":"positionX","type":"number","optional":true},{"name":"positionY","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("Page.clearDeviceMetricsOverride",[],[],false);InspectorBackend.registerCommand("Page.setGeolocationOverride",[{"name":"latitude","type":"number","optional":true},{"name":"longitude","type":"number","optional":true},{"name":"accuracy","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("Page.clearGeolocationOverride",[],[],false);InspectorBackend.registerCommand("Page.setDeviceOrientationOverride",[{"name":"alpha","type":"number","optional":false},{"name":"beta","type":"number","optional":false},{"name":"gamma","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Page.clearDeviceOrientationOverride",[],[],false);InspectorBackend.registerCommand("Page.setTouchEmulationEnabled",[{"name":"enabled","type":"boolean","optional":false},{"name":"configuration","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Page.captureScreenshot",[],["data"],false);InspectorBackend.registerCommand("Page.startScreencast",[{"name":"format","type":"string","optional":true},{"name":"quality","type":"number","optional":true},{"name":"maxWidth","type":"number","optional":true},{"name":"maxHeight","type":"number","optional":true},{"name":"everyNthFrame","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("Page.stopScreencast",[],[],false);InspectorBackend.registerCommand("Page.screencastFrameAck",[{"name":"sessionId","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Page.handleJavaScriptDialog",[{"name":"accept","type":"boolean","optional":false},{"name":"promptText","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Page.setColorPickerEnabled",[{"name":"enabled","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Page.setOverlayMessage",[{"name":"message","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Rendering.setShowPaintRects",[{"name":"result","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Rendering.setShowDebugBorders",[{"name":"show","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Rendering.setShowFPSCounter",[{"name":"show","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Rendering.setShowScrollBottleneckRects",[{"name":"show","type":"boolean","optional":false}],[],false);InspectorBackend.registerEvent("Emulation.viewportChanged",["viewport"]);InspectorBackend.registerCommand("Emulation.setDeviceMetricsOverride",[{"name":"width","type":"number","optional":false},{"name":"height","type":"number","optional":false},{"name":"deviceScaleFactor","type":"number","optional":false},{"name":"mobile","type":"boolean","optional":false},{"name":"fitWindow","type":"boolean","optional":false},{"name":"scale","type":"number","optional":true},{"name":"offsetX","type":"number","optional":true},{"name":"offsetY","type":"number","optional":true},{"name":"screenWidth","type":"number","optional":true},{"name":"screenHeight","type":"number","optional":true},{"name":"positionX","type":"number","optional":true},{"name":"positionY","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("Emulation.clearDeviceMetricsOverride",[],[],false);InspectorBackend.registerCommand("Emulation.resetScrollAndPageScaleFactor",[],[],false);InspectorBackend.registerCommand("Emulation.setPageScaleFactor",[{"name":"pageScaleFactor","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Emulation.setScriptExecutionDisabled",[{"name":"value","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Emulation.setGeolocationOverride",[{"name":"latitude","type":"number","optional":true},{"name":"longitude","type":"number","optional":true},{"name":"accuracy","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("Emulation.clearGeolocationOverride",[],[],false);InspectorBackend.registerCommand("Emulation.setTouchEmulationEnabled",[{"name":"enabled","type":"boolean","optional":false},{"name":"configuration","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Emulation.setEmulatedMedia",[{"name":"media","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Emulation.setCPUThrottlingRate",[{"name":"rate","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Emulation.canEmulate",[],["result"],false);InspectorBackend.registerEnum("Runtime.RemoteObjectType",{Object:"object",Function:"function",Undefined:"undefined",String:"string",Number:"number",Boolean:"boolean",Symbol:"symbol"});InspectorBackend.registerEnum("Runtime.RemoteObjectSubtype",{Array:"array",Null:"null",Node:"node",Regexp:"regexp",Date:"date",Map:"map",Set:"set",Iterator:"iterator",Generator:"generator",Error:"error"});InspectorBackend.registerEnum("Runtime.ObjectPreviewType",{Object:"object",Function:"function",Undefined:"undefined",String:"string",Number:"number",Boolean:"boolean",Symbol:"symbol"});InspectorBackend.registerEnum("Runtime.ObjectPreviewSubtype",{Array:"array",Null:"null",Node:"node",Regexp:"regexp",Date:"date",Map:"map",Set:"set",Iterator:"iterator",Generator:"generator",Error:"error"});InspectorBackend.registerEnum("Runtime.PropertyPreviewType",{Object:"object",Function:"function",Undefined:"undefined",String:"string",Number:"number",Boolean:"boolean",Symbol:"symbol",Accessor:"accessor"});InspectorBackend.registerEnum("Runtime.PropertyPreviewSubtype",{Array:"array",Null:"null",Node:"node",Regexp:"regexp",Date:"date",Map:"map",Set:"set",Iterator:"iterator",Generator:"generator",Error:"error"});InspectorBackend.registerEnum("Runtime.CallArgumentType",{Object:"object",Function:"function",Undefined:"undefined",String:"string",Number:"number",Boolean:"boolean",Symbol:"symbol"});InspectorBackend.registerEvent("Runtime.executionContextCreated",["context"]);InspectorBackend.registerEvent("Runtime.executionContextDestroyed",["executionContextId"]);InspectorBackend.registerEvent("Runtime.executionContextsCleared",[]);InspectorBackend.registerCommand("Runtime.evaluate",[{"name":"expression","type":"string","optional":false},{"name":"objectGroup","type":"string","optional":true},{"name":"includeCommandLineAPI","type":"boolean","optional":true},{"name":"doNotPauseOnExceptionsAndMuteConsole","type":"boolean","optional":true},{"name":"contextId","type":"number","optional":true},{"name":"returnByValue","type":"boolean","optional":true},{"name":"generatePreview","type":"boolean","optional":true}],["result","wasThrown","exceptionDetails"],false);InspectorBackend.registerCommand("Runtime.callFunctionOn",[{"name":"objectId","type":"string","optional":false},{"name":"functionDeclaration","type":"string","optional":false},{"name":"arguments","type":"object","optional":true},{"name":"doNotPauseOnExceptionsAndMuteConsole","type":"boolean","optional":true},{"name":"returnByValue","type":"boolean","optional":true},{"name":"generatePreview","type":"boolean","optional":true}],["result","wasThrown"],false);InspectorBackend.registerCommand("Runtime.getProperties",[{"name":"objectId","type":"string","optional":false},{"name":"ownProperties","type":"boolean","optional":true},{"name":"accessorPropertiesOnly","type":"boolean","optional":true},{"name":"generatePreview","type":"boolean","optional":true}],["result","internalProperties","exceptionDetails"],false);InspectorBackend.registerCommand("Runtime.releaseObject",[{"name":"objectId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Runtime.releaseObjectGroup",[{"name":"objectGroup","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Runtime.run",[],[],false);InspectorBackend.registerCommand("Runtime.enable",[],[],false);InspectorBackend.registerCommand("Runtime.disable",[],[],false);InspectorBackend.registerCommand("Runtime.isRunRequired",[],["result"],false);InspectorBackend.registerCommand("Runtime.setCustomObjectFormatterEnabled",[{"name":"enabled","type":"boolean","optional":false}],[],false);InspectorBackend.registerEnum("Console.ConsoleMessageSource",{XML:"xml",Javascript:"javascript",Network:"network",ConsoleAPI:"console-api",Storage:"storage",Appcache:"appcache",Rendering:"rendering",Security:"security",Other:"other",Deprecation:"deprecation"});InspectorBackend.registerEnum("Console.ConsoleMessageLevel",{Log:"log",Warning:"warning",Error:"error",Debug:"debug",Info:"info",RevokedError:"revokedError"});InspectorBackend.registerEnum("Console.ConsoleMessageType",{Log:"log",Dir:"dir",DirXML:"dirxml",Table:"table",Trace:"trace",Clear:"clear",StartGroup:"startGroup",StartGroupCollapsed:"startGroupCollapsed",EndGroup:"endGroup",Assert:"assert",Profile:"profile",ProfileEnd:"profileEnd"});InspectorBackend.registerEvent("Console.messageAdded",["message"]);InspectorBackend.registerEvent("Console.messageRepeatCountUpdated",["count","timestamp"]);InspectorBackend.registerEvent("Console.messagesCleared",[]);InspectorBackend.registerCommand("Console.enable",[],[],false);InspectorBackend.registerCommand("Console.disable",[],[],false);InspectorBackend.registerCommand("Console.clearMessages",[],[],false);InspectorBackend.registerEnum("Security.SecurityState",{Unknown:"unknown",Neutral:"neutral",Insecure:"insecure",Warning:"warning",Secure:"secure",Info:"info"});InspectorBackend.registerEvent("Security.securityStateChanged",["securityState","explanations","mixedContentStatus","schemeIsCryptographic"]);InspectorBackend.registerCommand("Security.enable",[],[],false);InspectorBackend.registerCommand("Security.disable",[],[],false);InspectorBackend.registerEnum("Network.ResourcePriority",{VeryLow:"VeryLow",Low:"Low",Medium:"Medium",High:"High",VeryHigh:"VeryHigh"});InspectorBackend.registerEnum("Network.RequestMixedContentType",{Blockable:"blockable",OptionallyBlockable:"optionally-blockable",None:"none"});InspectorBackend.registerEnum("Network.BlockedReason",{Csp:"csp",MixedContent:"mixed-content",Origin:"origin",Inspector:"inspector",Other:"other"});InspectorBackend.registerEnum("Network.InitiatorType",{Parser:"parser",Script:"script",Other:"other"});InspectorBackend.registerEvent("Network.requestWillBeSent",["requestId","frameId","loaderId","documentURL","request","timestamp","wallTime","initiator","redirectResponse","type"]);InspectorBackend.registerEvent("Network.requestServedFromCache",["requestId"]);InspectorBackend.registerEvent("Network.responseReceived",["requestId","frameId","loaderId","timestamp","type","response"]);InspectorBackend.registerEvent("Network.dataReceived",["requestId","timestamp","dataLength","encodedDataLength"]);InspectorBackend.registerEvent("Network.loadingFinished",["requestId","timestamp","encodedDataLength"]);InspectorBackend.registerEvent("Network.loadingFailed",["requestId","timestamp","type","errorText","canceled","blockedReason"]);InspectorBackend.registerEvent("Network.webSocketWillSendHandshakeRequest",["requestId","timestamp","wallTime","request"]);InspectorBackend.registerEvent("Network.webSocketHandshakeResponseReceived",["requestId","timestamp","response"]);InspectorBackend.registerEvent("Network.webSocketCreated",["requestId","url"]);InspectorBackend.registerEvent("Network.webSocketClosed",["requestId","timestamp"]);InspectorBackend.registerEvent("Network.webSocketFrameReceived",["requestId","timestamp","response"]);InspectorBackend.registerEvent("Network.webSocketFrameError",["requestId","timestamp","errorMessage"]);InspectorBackend.registerEvent("Network.webSocketFrameSent",["requestId","timestamp","response"]);InspectorBackend.registerEvent("Network.eventSourceMessageReceived",["requestId","timestamp","eventName","eventId","data"]);InspectorBackend.registerCommand("Network.enable",[],[],false);InspectorBackend.registerCommand("Network.disable",[],[],false);InspectorBackend.registerCommand("Network.setUserAgentOverride",[{"name":"userAgent","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Network.setExtraHTTPHeaders",[{"name":"headers","type":"object","optional":false}],[],false);InspectorBackend.registerCommand("Network.getResponseBody",[{"name":"requestId","type":"string","optional":false}],["body","base64Encoded"],false);InspectorBackend.registerCommand("Network.addBlockedURL",[{"name":"url","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Network.removeBlockedURL",[{"name":"url","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Network.replayXHR",[{"name":"requestId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Network.setMonitoringXHREnabled",[{"name":"enabled","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Network.canClearBrowserCache",[],["result"],false);InspectorBackend.registerCommand("Network.clearBrowserCache",[],[],false);InspectorBackend.registerCommand("Network.canClearBrowserCookies",[],["result"],false);InspectorBackend.registerCommand("Network.clearBrowserCookies",[],[],false);InspectorBackend.registerCommand("Network.getCookies",[],["cookies"],false);InspectorBackend.registerCommand("Network.deleteCookie",[{"name":"cookieName","type":"string","optional":false},{"name":"url","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Network.canEmulateNetworkConditions",[],["result"],false);InspectorBackend.registerCommand("Network.emulateNetworkConditions",[{"name":"offline","type":"boolean","optional":false},{"name":"latency","type":"number","optional":false},{"name":"downloadThroughput","type":"number","optional":false},{"name":"uploadThroughput","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Network.setCacheDisabled",[{"name":"cacheDisabled","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Network.setDataSizeLimitsForTest",[{"name":"maxTotalSize","type":"number","optional":false},{"name":"maxResourceSize","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Network.getCertificateDetails",[{"name":"certificateId","type":"number","optional":false}],["result"],false);InspectorBackend.registerCommand("Network.showCertificateViewer",[{"name":"certificateId","type":"number","optional":false}],[],false);InspectorBackend.registerEvent("Database.addDatabase",["database"]);InspectorBackend.registerCommand("Database.enable",[],[],false);InspectorBackend.registerCommand("Database.disable",[],[],false);InspectorBackend.registerCommand("Database.getDatabaseTableNames",[{"name":"databaseId","type":"string","optional":false}],["tableNames"],false);InspectorBackend.registerCommand("Database.executeSQL",[{"name":"databaseId","type":"string","optional":false},{"name":"query","type":"string","optional":false}],["columnNames","values","sqlError"],false);InspectorBackend.registerEnum("IndexedDB.KeyType",{Number:"number",String:"string",Date:"date",Array:"array"});InspectorBackend.registerEnum("IndexedDB.KeyPathType",{Null:"null",String:"string",Array:"array"});InspectorBackend.registerCommand("IndexedDB.enable",[],[],false);InspectorBackend.registerCommand("IndexedDB.disable",[],[],false);InspectorBackend.registerCommand("IndexedDB.requestDatabaseNames",[{"name":"securityOrigin","type":"string","optional":false}],["databaseNames"],false);InspectorBackend.registerCommand("IndexedDB.requestDatabase",[{"name":"securityOrigin","type":"string","optional":false},{"name":"databaseName","type":"string","optional":false}],["databaseWithObjectStores"],false);InspectorBackend.registerCommand("IndexedDB.requestData",[{"name":"securityOrigin","type":"string","optional":false},{"name":"databaseName","type":"string","optional":false},{"name":"objectStoreName","type":"string","optional":false},{"name":"indexName","type":"string","optional":false},{"name":"skipCount","type":"number","optional":false},{"name":"pageSize","type":"number","optional":false},{"name":"keyRange","type":"object","optional":true}],["objectStoreDataEntries","hasMore"],false);InspectorBackend.registerCommand("IndexedDB.clearObjectStore",[{"name":"securityOrigin","type":"string","optional":false},{"name":"databaseName","type":"string","optional":false},{"name":"objectStoreName","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("CacheStorage.requestCacheNames",[{"name":"securityOrigin","type":"string","optional":false}],["caches"],false);InspectorBackend.registerCommand("CacheStorage.requestEntries",[{"name":"cacheId","type":"string","optional":false},{"name":"skipCount","type":"number","optional":false},{"name":"pageSize","type":"number","optional":false}],["cacheDataEntries","hasMore"],false);InspectorBackend.registerCommand("CacheStorage.deleteCache",[{"name":"cacheId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("CacheStorage.deleteEntry",[{"name":"cacheId","type":"string","optional":false},{"name":"request","type":"string","optional":false}],[],false);InspectorBackend.registerEvent("DOMStorage.domStorageItemsCleared",["storageId"]);InspectorBackend.registerEvent("DOMStorage.domStorageItemRemoved",["storageId","key"]);InspectorBackend.registerEvent("DOMStorage.domStorageItemAdded",["storageId","key","newValue"]);InspectorBackend.registerEvent("DOMStorage.domStorageItemUpdated",["storageId","key","oldValue","newValue"]);InspectorBackend.registerCommand("DOMStorage.enable",[],[],false);InspectorBackend.registerCommand("DOMStorage.disable",[],[],false);InspectorBackend.registerCommand("DOMStorage.getDOMStorageItems",[{"name":"storageId","type":"object","optional":false}],["entries"],false);InspectorBackend.registerCommand("DOMStorage.setDOMStorageItem",[{"name":"storageId","type":"object","optional":false},{"name":"key","type":"string","optional":false},{"name":"value","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMStorage.removeDOMStorageItem",[{"name":"storageId","type":"object","optional":false},{"name":"key","type":"string","optional":false}],[],false);InspectorBackend.registerEvent("ApplicationCache.applicationCacheStatusUpdated",["frameId","manifestURL","status"]);InspectorBackend.registerEvent("ApplicationCache.networkStateUpdated",["isNowOnline"]);InspectorBackend.registerCommand("ApplicationCache.getFramesWithManifests",[],["frameIds"],false);InspectorBackend.registerCommand("ApplicationCache.enable",[],[],false);InspectorBackend.registerCommand("ApplicationCache.getManifestForFrame",[{"name":"frameId","type":"string","optional":false}],["manifestURL"],false);InspectorBackend.registerCommand("ApplicationCache.getApplicationCacheForFrame",[{"name":"frameId","type":"string","optional":false}],["applicationCache"],false);InspectorBackend.registerCommand("FileSystem.enable",[],[],false);InspectorBackend.registerCommand("FileSystem.disable",[],[],false);InspectorBackend.registerCommand("FileSystem.requestFileSystemRoot",[{"name":"origin","type":"string","optional":false},{"name":"type","type":"string","optional":false}],["errorCode","root"],false);InspectorBackend.registerCommand("FileSystem.requestDirectoryContent",[{"name":"url","type":"string","optional":false}],["errorCode","entries"],false);InspectorBackend.registerCommand("FileSystem.requestMetadata",[{"name":"url","type":"string","optional":false}],["errorCode","metadata"],false);InspectorBackend.registerCommand("FileSystem.requestFileContent",[{"name":"url","type":"string","optional":false},{"name":"readAsText","type":"boolean","optional":false},{"name":"start","type":"number","optional":true},{"name":"end","type":"number","optional":true},{"name":"charset","type":"string","optional":true}],["errorCode","content","charset"],false);InspectorBackend.registerCommand("FileSystem.deleteEntry",[{"name":"url","type":"string","optional":false}],["errorCode"],false);InspectorBackend.registerEnum("DOM.PseudoType",{FirstLine:"first-line",FirstLetter:"first-letter",Before:"before",After:"after",Backdrop:"backdrop",Selection:"selection",FirstLineInherited:"first-line-inherited",Scrollbar:"scrollbar",ScrollbarThumb:"scrollbar-thumb",ScrollbarButton:"scrollbar-button",ScrollbarTrack:"scrollbar-track",ScrollbarTrackPiece:"scrollbar-track-piece",ScrollbarCorner:"scrollbar-corner",Resizer:"resizer",InputListButton:"input-list-button"});InspectorBackend.registerEnum("DOM.ShadowRootType",{UserAgent:"user-agent",Open:"open",Closed:"closed"});InspectorBackend.registerEnum("DOM.InspectMode",{SearchForNode:"searchForNode",SearchForUAShadowDOM:"searchForUAShadowDOM",ShowLayoutEditor:"showLayoutEditor",None:"none"});InspectorBackend.registerEvent("DOM.documentUpdated",[]);InspectorBackend.registerEvent("DOM.inspectNodeRequested",["backendNodeId"]);InspectorBackend.registerEvent("DOM.setChildNodes",["parentId","nodes"]);InspectorBackend.registerEvent("DOM.attributeModified",["nodeId","name","value"]);InspectorBackend.registerEvent("DOM.attributeRemoved",["nodeId","name"]);InspectorBackend.registerEvent("DOM.inlineStyleInvalidated",["nodeIds"]);InspectorBackend.registerEvent("DOM.characterDataModified",["nodeId","characterData"]);InspectorBackend.registerEvent("DOM.childNodeCountUpdated",["nodeId","childNodeCount"]);InspectorBackend.registerEvent("DOM.childNodeInserted",["parentNodeId","previousNodeId","node"]);InspectorBackend.registerEvent("DOM.childNodeRemoved",["parentNodeId","nodeId"]);InspectorBackend.registerEvent("DOM.shadowRootPushed",["hostId","root"]);InspectorBackend.registerEvent("DOM.shadowRootPopped",["hostId","rootId"]);InspectorBackend.registerEvent("DOM.pseudoElementAdded",["parentId","pseudoElement"]);InspectorBackend.registerEvent("DOM.pseudoElementRemoved",["parentId","pseudoElementId"]);InspectorBackend.registerEvent("DOM.distributedNodesUpdated",["insertionPointId","distributedNodes"]);InspectorBackend.registerEvent("DOM.nodeHighlightRequested",["nodeId"]);InspectorBackend.registerCommand("DOM.enable",[],[],false);InspectorBackend.registerCommand("DOM.disable",[],[],false);InspectorBackend.registerCommand("DOM.getDocument",[],["root"],false);InspectorBackend.registerCommand("DOM.requestChildNodes",[{"name":"nodeId","type":"number","optional":false},{"name":"depth","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("DOM.querySelector",[{"name":"nodeId","type":"number","optional":false},{"name":"selector","type":"string","optional":false}],["nodeId"],false);InspectorBackend.registerCommand("DOM.querySelectorAll",[{"name":"nodeId","type":"number","optional":false},{"name":"selector","type":"string","optional":false}],["nodeIds"],false);InspectorBackend.registerCommand("DOM.setNodeName",[{"name":"nodeId","type":"number","optional":false},{"name":"name","type":"string","optional":false}],["nodeId"],false);InspectorBackend.registerCommand("DOM.setNodeValue",[{"name":"nodeId","type":"number","optional":false},{"name":"value","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOM.removeNode",[{"name":"nodeId","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("DOM.setAttributeValue",[{"name":"nodeId","type":"number","optional":false},{"name":"name","type":"string","optional":false},{"name":"value","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOM.setAttributesAsText",[{"name":"nodeId","type":"number","optional":false},{"name":"text","type":"string","optional":false},{"name":"name","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("DOM.removeAttribute",[{"name":"nodeId","type":"number","optional":false},{"name":"name","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOM.getOuterHTML",[{"name":"nodeId","type":"number","optional":false}],["outerHTML"],false);InspectorBackend.registerCommand("DOM.setOuterHTML",[{"name":"nodeId","type":"number","optional":false},{"name":"outerHTML","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOM.performSearch",[{"name":"query","type":"string","optional":false},{"name":"includeUserAgentShadowDOM","type":"boolean","optional":true}],["searchId","resultCount"],false);InspectorBackend.registerCommand("DOM.getSearchResults",[{"name":"searchId","type":"string","optional":false},{"name":"fromIndex","type":"number","optional":false},{"name":"toIndex","type":"number","optional":false}],["nodeIds"],false);InspectorBackend.registerCommand("DOM.discardSearchResults",[{"name":"searchId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOM.requestNode",[{"name":"objectId","type":"string","optional":false}],["nodeId"],false);InspectorBackend.registerCommand("DOM.setInspectMode",[{"name":"mode","type":"string","optional":false},{"name":"highlightConfig","type":"object","optional":true}],[],false);InspectorBackend.registerCommand("DOM.highlightRect",[{"name":"x","type":"number","optional":false},{"name":"y","type":"number","optional":false},{"name":"width","type":"number","optional":false},{"name":"height","type":"number","optional":false},{"name":"color","type":"object","optional":true},{"name":"outlineColor","type":"object","optional":true}],[],false);InspectorBackend.registerCommand("DOM.highlightQuad",[{"name":"quad","type":"object","optional":false},{"name":"color","type":"object","optional":true},{"name":"outlineColor","type":"object","optional":true}],[],false);InspectorBackend.registerCommand("DOM.highlightNode",[{"name":"highlightConfig","type":"object","optional":false},{"name":"nodeId","type":"number","optional":true},{"name":"backendNodeId","type":"number","optional":true},{"name":"objectId","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("DOM.hideHighlight",[],[],false);InspectorBackend.registerCommand("DOM.highlightFrame",[{"name":"frameId","type":"string","optional":false},{"name":"contentColor","type":"object","optional":true},{"name":"contentOutlineColor","type":"object","optional":true}],[],false);InspectorBackend.registerCommand("DOM.pushNodeByPathToFrontend",[{"name":"path","type":"string","optional":false}],["nodeId"],false);InspectorBackend.registerCommand("DOM.pushNodesByBackendIdsToFrontend",[{"name":"backendNodeIds","type":"object","optional":false}],["nodeIds"],false);InspectorBackend.registerCommand("DOM.setInspectedNode",[{"name":"nodeId","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("DOM.resolveNode",[{"name":"nodeId","type":"number","optional":false},{"name":"objectGroup","type":"string","optional":true}],["object"],false);InspectorBackend.registerCommand("DOM.getAttributes",[{"name":"nodeId","type":"number","optional":false}],["attributes"],false);InspectorBackend.registerCommand("DOM.copyTo",[{"name":"nodeId","type":"number","optional":false},{"name":"targetNodeId","type":"number","optional":false},{"name":"insertBeforeNodeId","type":"number","optional":true}],["nodeId"],false);InspectorBackend.registerCommand("DOM.moveTo",[{"name":"nodeId","type":"number","optional":false},{"name":"targetNodeId","type":"number","optional":false},{"name":"insertBeforeNodeId","type":"number","optional":true}],["nodeId"],false);InspectorBackend.registerCommand("DOM.undo",[],[],false);InspectorBackend.registerCommand("DOM.redo",[],[],false);InspectorBackend.registerCommand("DOM.markUndoableState",[],[],false);InspectorBackend.registerCommand("DOM.focus",[{"name":"nodeId","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("DOM.setFileInputFiles",[{"name":"nodeId","type":"number","optional":false},{"name":"files","type":"object","optional":false}],[],false);InspectorBackend.registerCommand("DOM.getBoxModel",[{"name":"nodeId","type":"number","optional":false}],["model"],false);InspectorBackend.registerCommand("DOM.getNodeForLocation",[{"name":"x","type":"number","optional":false},{"name":"y","type":"number","optional":false}],["nodeId"],false);InspectorBackend.registerCommand("DOM.getRelayoutBoundary",[{"name":"nodeId","type":"number","optional":false}],["nodeId"],false);InspectorBackend.registerCommand("DOM.getHighlightObjectForTest",[{"name":"nodeId","type":"number","optional":false}],["highlight"],false);InspectorBackend.registerEnum("CSS.StyleSheetOrigin",{Injected:"injected",UserAgent:"user-agent",Inspector:"inspector",Regular:"regular"});InspectorBackend.registerEnum("CSS.CSSMediaSource",{MediaRule:"mediaRule",ImportRule:"importRule",LinkedSheet:"linkedSheet",InlineSheet:"inlineSheet"});InspectorBackend.registerEvent("CSS.mediaQueryResultChanged",[]);InspectorBackend.registerEvent("CSS.styleSheetChanged",["styleSheetId"]);InspectorBackend.registerEvent("CSS.styleSheetAdded",["header"]);InspectorBackend.registerEvent("CSS.styleSheetRemoved",["styleSheetId"]);InspectorBackend.registerEvent("CSS.layoutEditorChange",["styleSheetId","changeRange"]);InspectorBackend.registerCommand("CSS.enable",[],[],false);InspectorBackend.registerCommand("CSS.disable",[],[],false);InspectorBackend.registerCommand("CSS.getMatchedStylesForNode",[{"name":"nodeId","type":"number","optional":false}],["inlineStyle","attributesStyle","matchedCSSRules","pseudoElements","inherited"],false);InspectorBackend.registerCommand("CSS.getInlineStylesForNode",[{"name":"nodeId","type":"number","optional":false}],["inlineStyle","attributesStyle"],false);InspectorBackend.registerCommand("CSS.getComputedStyleForNode",[{"name":"nodeId","type":"number","optional":false}],["computedStyle"],false);InspectorBackend.registerCommand("CSS.getPlatformFontsForNode",[{"name":"nodeId","type":"number","optional":false}],["fonts"],false);InspectorBackend.registerCommand("CSS.getCSSAnimationsForNode",[{"name":"nodeId","type":"number","optional":false}],["cssKeyframesRules"],false);InspectorBackend.registerCommand("CSS.getStyleSheetText",[{"name":"styleSheetId","type":"string","optional":false}],["text"],false);InspectorBackend.registerCommand("CSS.setStyleSheetText",[{"name":"styleSheetId","type":"string","optional":false},{"name":"text","type":"string","optional":false}],["sourceMapURL"],false);InspectorBackend.registerCommand("CSS.setRuleSelector",[{"name":"styleSheetId","type":"string","optional":false},{"name":"range","type":"object","optional":false},{"name":"selector","type":"string","optional":false}],["selectorList"],false);InspectorBackend.registerCommand("CSS.setStyleText",[{"name":"styleSheetId","type":"string","optional":false},{"name":"range","type":"object","optional":false},{"name":"text","type":"string","optional":false}],["style"],false);InspectorBackend.registerCommand("CSS.setMediaText",[{"name":"styleSheetId","type":"string","optional":false},{"name":"range","type":"object","optional":false},{"name":"text","type":"string","optional":false}],["media"],false);InspectorBackend.registerCommand("CSS.createStyleSheet",[{"name":"frameId","type":"string","optional":false}],["styleSheetId"],false);InspectorBackend.registerCommand("CSS.addRule",[{"name":"styleSheetId","type":"string","optional":false},{"name":"ruleText","type":"string","optional":false},{"name":"location","type":"object","optional":false}],["rule"],false);InspectorBackend.registerCommand("CSS.forcePseudoState",[{"name":"nodeId","type":"number","optional":false},{"name":"forcedPseudoClasses","type":"object","optional":false}],[],false);InspectorBackend.registerCommand("CSS.getMediaQueries",[],["medias"],false);InspectorBackend.registerCommand("CSS.setEffectivePropertyValueForNode",[{"name":"nodeId","type":"number","optional":false},{"name":"propertyName","type":"string","optional":false},{"name":"value","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("CSS.getBackgroundColors",[{"name":"nodeId","type":"number","optional":false}],["backgroundColors"],false);InspectorBackend.registerCommand("IO.read",[{"name":"handle","type":"string","optional":false},{"name":"offset","type":"number","optional":true},{"name":"size","type":"number","optional":true}],["data","eof"],false);InspectorBackend.registerCommand("IO.close",[{"name":"handle","type":"string","optional":false}],[],false);InspectorBackend.registerEvent("Timeline.eventRecorded",["record"]);InspectorBackend.registerCommand("Timeline.enable",[],[],false);InspectorBackend.registerCommand("Timeline.disable",[],[],false);InspectorBackend.registerCommand("Timeline.start",[{"name":"maxCallStackDepth","type":"number","optional":true},{"name":"bufferEvents","type":"boolean","optional":true},{"name":"liveEvents","type":"string","optional":true},{"name":"includeCounters","type":"boolean","optional":true},{"name":"includeGPUEvents","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("Timeline.stop",[],[],false);InspectorBackend.registerEnum("Debugger.GeneratorObjectDetailsStatus",{Running:"running",Suspended:"suspended",Closed:"closed"});InspectorBackend.registerEnum("Debugger.ScopeType",{Global:"global",Local:"local",With:"with",Closure:"closure",Catch:"catch",Block:"block",Script:"script"});InspectorBackend.registerEnum("Debugger.PromiseDetailsStatus",{Pending:"pending",Resolved:"resolved",Rejected:"rejected"});InspectorBackend.registerEvent("Debugger.globalObjectCleared",[]);InspectorBackend.registerEvent("Debugger.scriptParsed",["scriptId","url","startLine","startColumn","endLine","endColumn","executionContextId","isContentScript","isInternalScript","isLiveEdit","sourceMapURL","hasSourceURL"]);InspectorBackend.registerEvent("Debugger.scriptFailedToParse",["scriptId","url","startLine","startColumn","endLine","endColumn","executionContextId","isContentScript","isInternalScript","sourceMapURL","hasSourceURL"]);InspectorBackend.registerEvent("Debugger.breakpointResolved",["breakpointId","location"]);InspectorBackend.registerEvent("Debugger.paused",["callFrames","reason","data","hitBreakpoints","asyncStackTrace"]);InspectorBackend.registerEvent("Debugger.resumed",[]);InspectorBackend.registerEvent("Debugger.promiseUpdated",["eventType","promise"]);InspectorBackend.registerEvent("Debugger.asyncOperationStarted",["operation"]);InspectorBackend.registerEvent("Debugger.asyncOperationCompleted",["id"]);InspectorBackend.registerCommand("Debugger.enable",[],[],false);InspectorBackend.registerCommand("Debugger.disable",[],[],false);InspectorBackend.registerCommand("Debugger.setBreakpointsActive",[{"name":"active","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Debugger.setSkipAllPauses",[{"name":"skipped","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Debugger.setBreakpointByUrl",[{"name":"lineNumber","type":"number","optional":false},{"name":"url","type":"string","optional":true},{"name":"urlRegex","type":"string","optional":true},{"name":"columnNumber","type":"number","optional":true},{"name":"condition","type":"string","optional":true}],["breakpointId","locations"],false);InspectorBackend.registerCommand("Debugger.setBreakpoint",[{"name":"location","type":"object","optional":false},{"name":"condition","type":"string","optional":true}],["breakpointId","actualLocation"],false);InspectorBackend.registerCommand("Debugger.removeBreakpoint",[{"name":"breakpointId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Debugger.continueToLocation",[{"name":"location","type":"object","optional":false},{"name":"interstatementLocation","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("Debugger.stepOver",[],[],false);InspectorBackend.registerCommand("Debugger.stepInto",[],[],false);InspectorBackend.registerCommand("Debugger.stepOut",[],[],false);InspectorBackend.registerCommand("Debugger.pause",[],[],false);InspectorBackend.registerCommand("Debugger.resume",[],[],false);InspectorBackend.registerCommand("Debugger.stepIntoAsync",[],[],false);InspectorBackend.registerCommand("Debugger.searchInContent",[{"name":"scriptId","type":"string","optional":false},{"name":"query","type":"string","optional":false},{"name":"caseSensitive","type":"boolean","optional":true},{"name":"isRegex","type":"boolean","optional":true}],["result"],false);InspectorBackend.registerCommand("Debugger.canSetScriptSource",[],["result"],false);InspectorBackend.registerCommand("Debugger.setScriptSource",[{"name":"scriptId","type":"string","optional":false},{"name":"scriptSource","type":"string","optional":false},{"name":"preview","type":"boolean","optional":true}],["callFrames","stackChanged","asyncStackTrace"],true);InspectorBackend.registerCommand("Debugger.restartFrame",[{"name":"callFrameId","type":"string","optional":false}],["callFrames","asyncStackTrace"],false);InspectorBackend.registerCommand("Debugger.getScriptSource",[{"name":"scriptId","type":"string","optional":false}],["scriptSource"],false);InspectorBackend.registerCommand("Debugger.getFunctionDetails",[{"name":"functionId","type":"string","optional":false}],["details"],false);InspectorBackend.registerCommand("Debugger.getGeneratorObjectDetails",[{"name":"objectId","type":"string","optional":false}],["details"],false);InspectorBackend.registerCommand("Debugger.getCollectionEntries",[{"name":"objectId","type":"string","optional":false}],["entries"],false);InspectorBackend.registerCommand("Debugger.setPauseOnExceptions",[{"name":"state","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Debugger.evaluateOnCallFrame",[{"name":"callFrameId","type":"string","optional":false},{"name":"expression","type":"string","optional":false},{"name":"objectGroup","type":"string","optional":true},{"name":"includeCommandLineAPI","type":"boolean","optional":true},{"name":"doNotPauseOnExceptionsAndMuteConsole","type":"boolean","optional":true},{"name":"returnByValue","type":"boolean","optional":true},{"name":"generatePreview","type":"boolean","optional":true}],["result","wasThrown","exceptionDetails"],false);InspectorBackend.registerCommand("Debugger.compileScript",[{"name":"expression","type":"string","optional":false},{"name":"sourceURL","type":"string","optional":false},{"name":"persistScript","type":"boolean","optional":false},{"name":"executionContextId","type":"number","optional":false}],["scriptId","exceptionDetails"],false);InspectorBackend.registerCommand("Debugger.runScript",[{"name":"scriptId","type":"string","optional":false},{"name":"executionContextId","type":"number","optional":false},{"name":"objectGroup","type":"string","optional":true},{"name":"doNotPauseOnExceptionsAndMuteConsole","type":"boolean","optional":true}],["result","exceptionDetails"],false);InspectorBackend.registerCommand("Debugger.setVariableValue",[{"name":"scopeNumber","type":"number","optional":false},{"name":"variableName","type":"string","optional":false},{"name":"newValue","type":"object","optional":false},{"name":"callFrameId","type":"string","optional":true},{"name":"functionObjectId","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Debugger.getStepInPositions",[{"name":"callFrameId","type":"string","optional":false}],["stepInPositions"],false);InspectorBackend.registerCommand("Debugger.getBacktrace",[],["callFrames","asyncStackTrace"],false);InspectorBackend.registerCommand("Debugger.skipStackFrames",[{"name":"script","type":"string","optional":true},{"name":"skipContentScripts","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("Debugger.setAsyncCallStackDepth",[{"name":"maxDepth","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Debugger.enablePromiseTracker",[{"name":"captureStacks","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("Debugger.disablePromiseTracker",[],[],false);InspectorBackend.registerCommand("Debugger.getPromiseById",[{"name":"promiseId","type":"number","optional":false},{"name":"objectGroup","type":"string","optional":true}],["promise"],false);InspectorBackend.registerCommand("Debugger.flushAsyncOperationEvents",[],[],false);InspectorBackend.registerCommand("Debugger.setAsyncOperationBreakpoint",[{"name":"operationId","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Debugger.removeAsyncOperationBreakpoint",[{"name":"operationId","type":"number","optional":false}],[],false);InspectorBackend.registerEnum("DOMDebugger.DOMBreakpointType",{SubtreeModified:"subtree-modified",AttributeModified:"attribute-modified",NodeRemoved:"node-removed"});InspectorBackend.registerCommand("DOMDebugger.setDOMBreakpoint",[{"name":"nodeId","type":"number","optional":false},{"name":"type","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMDebugger.removeDOMBreakpoint",[{"name":"nodeId","type":"number","optional":false},{"name":"type","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMDebugger.setEventListenerBreakpoint",[{"name":"eventName","type":"string","optional":false},{"name":"targetName","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("DOMDebugger.removeEventListenerBreakpoint",[{"name":"eventName","type":"string","optional":false},{"name":"targetName","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("DOMDebugger.setInstrumentationBreakpoint",[{"name":"eventName","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMDebugger.removeInstrumentationBreakpoint",[{"name":"eventName","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMDebugger.setXHRBreakpoint",[{"name":"url","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMDebugger.removeXHRBreakpoint",[{"name":"url","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMDebugger.getEventListeners",[{"name":"objectId","type":"string","optional":false}],["listeners"],false);InspectorBackend.registerEvent("Profiler.consoleProfileStarted",["id","location","title"]);InspectorBackend.registerEvent("Profiler.consoleProfileFinished",["id","location","profile","title"]);InspectorBackend.registerCommand("Profiler.enable",[],[],false);InspectorBackend.registerCommand("Profiler.disable",[],[],false);InspectorBackend.registerCommand("Profiler.setSamplingInterval",[{"name":"interval","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Profiler.start",[],[],false);InspectorBackend.registerCommand("Profiler.stop",[],["profile"],false);InspectorBackend.registerEvent("HeapProfiler.addHeapSnapshotChunk",["chunk"]);InspectorBackend.registerEvent("HeapProfiler.resetProfiles",[]);InspectorBackend.registerEvent("HeapProfiler.reportHeapSnapshotProgress",["done","total","finished"]);InspectorBackend.registerEvent("HeapProfiler.lastSeenObjectId",["lastSeenObjectId","timestamp"]);InspectorBackend.registerEvent("HeapProfiler.heapStatsUpdate",["statsUpdate"]);InspectorBackend.registerCommand("HeapProfiler.enable",[],[],false);InspectorBackend.registerCommand("HeapProfiler.disable",[],[],false);InspectorBackend.registerCommand("HeapProfiler.startTrackingHeapObjects",[{"name":"trackAllocations","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("HeapProfiler.stopTrackingHeapObjects",[{"name":"reportProgress","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("HeapProfiler.takeHeapSnapshot",[{"name":"reportProgress","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("HeapProfiler.collectGarbage",[],[],false);InspectorBackend.registerCommand("HeapProfiler.getObjectByHeapObjectId",[{"name":"objectId","type":"string","optional":false},{"name":"objectGroup","type":"string","optional":true}],["result"],false);InspectorBackend.registerCommand("HeapProfiler.addInspectedHeapObject",[{"name":"heapObjectId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("HeapProfiler.getHeapObjectId",[{"name":"objectId","type":"string","optional":false}],["heapSnapshotObjectId"],false);InspectorBackend.registerEvent("Worker.workerCreated",["workerId","url","inspectorConnected"]);InspectorBackend.registerEvent("Worker.workerTerminated",["workerId"]);InspectorBackend.registerEvent("Worker.dispatchMessageFromWorker",["workerId","message"]);InspectorBackend.registerCommand("Worker.enable",[],[],false);InspectorBackend.registerCommand("Worker.disable",[],[],false);InspectorBackend.registerCommand("Worker.sendMessageToWorker",[{"name":"workerId","type":"string","optional":false},{"name":"message","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Worker.connectToWorker",[{"name":"workerId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Worker.disconnectFromWorker",[{"name":"workerId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Worker.setAutoconnectToWorkers",[{"name":"value","type":"boolean","optional":false}],[],false);InspectorBackend.registerEnum("ServiceWorker.ServiceWorkerVersionRunningStatus",{Stopped:"stopped",Starting:"starting",Running:"running",Stopping:"stopping"});InspectorBackend.registerEnum("ServiceWorker.ServiceWorkerVersionStatus",{New:"new",Installing:"installing",Installed:"installed",Activating:"activating",Activated:"activated",Redundant:"redundant"});InspectorBackend.registerEvent("ServiceWorker.workerCreated",["workerId","url","versionId"]);InspectorBackend.registerEvent("ServiceWorker.workerTerminated",["workerId"]);InspectorBackend.registerEvent("ServiceWorker.dispatchMessage",["workerId","message"]);InspectorBackend.registerEvent("ServiceWorker.workerRegistrationUpdated",["registrations"]);InspectorBackend.registerEvent("ServiceWorker.workerVersionUpdated",["versions"]);InspectorBackend.registerEvent("ServiceWorker.workerErrorReported",["errorMessage"]);InspectorBackend.registerEvent("ServiceWorker.debugOnStartUpdated",["debugOnStart"]);InspectorBackend.registerCommand("ServiceWorker.enable",[],[],false);InspectorBackend.registerCommand("ServiceWorker.disable",[],[],false);InspectorBackend.registerCommand("ServiceWorker.sendMessage",[{"name":"workerId","type":"string","optional":false},{"name":"message","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("ServiceWorker.stop",[{"name":"workerId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("ServiceWorker.unregister",[{"name":"scopeURL","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("ServiceWorker.updateRegistration",[{"name":"scopeURL","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("ServiceWorker.startWorker",[{"name":"scopeURL","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("ServiceWorker.stopWorker",[{"name":"versionId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("ServiceWorker.inspectWorker",[{"name":"versionId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("ServiceWorker.setDebugOnStart",[{"name":"debugOnStart","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("ServiceWorker.setForceUpdateOnPageLoad",[{"name":"registrationId","type":"string","optional":false},{"name":"forceUpdateOnPageLoad","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("ServiceWorker.deliverPushMessage",[{"name":"origin","type":"string","optional":false},{"name":"registrationId","type":"string","optional":false},{"name":"data","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("ServiceWorker.getTargetInfo",[{"name":"targetId","type":"string","optional":false}],["targetInfo"],false);InspectorBackend.registerCommand("ServiceWorker.activateTarget",[{"name":"targetId","type":"string","optional":false}],[],false);InspectorBackend.registerEnum("Input.TouchPointState",{TouchPressed:"touchPressed",TouchReleased:"touchReleased",TouchMoved:"touchMoved",TouchStationary:"touchStationary",TouchCancelled:"touchCancelled"});InspectorBackend.registerEnum("Input.GestureSourceType",{Default:"default",Touch:"touch",Mouse:"mouse"});InspectorBackend.registerCommand("Input.dispatchKeyEvent",[{"name":"type","type":"string","optional":false},{"name":"modifiers","type":"number","optional":true},{"name":"timestamp","type":"number","optional":true},{"name":"text","type":"string","optional":true},{"name":"unmodifiedText","type":"string","optional":true},{"name":"keyIdentifier","type":"string","optional":true},{"name":"code","type":"string","optional":true},{"name":"key","type":"string","optional":true},{"name":"windowsVirtualKeyCode","type":"number","optional":true},{"name":"nativeVirtualKeyCode","type":"number","optional":true},{"name":"autoRepeat","type":"boolean","optional":true},{"name":"isKeypad","type":"boolean","optional":true},{"name":"isSystemKey","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("Input.dispatchMouseEvent",[{"name":"type","type":"string","optional":false},{"name":"x","type":"number","optional":false},{"name":"y","type":"number","optional":false},{"name":"modifiers","type":"number","optional":true},{"name":"timestamp","type":"number","optional":true},{"name":"button","type":"string","optional":true},{"name":"clickCount","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("Input.dispatchTouchEvent",[{"name":"type","type":"string","optional":false},{"name":"touchPoints","type":"object","optional":false},{"name":"modifiers","type":"number","optional":true},{"name":"timestamp","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("Input.emulateTouchFromMouseEvent",[{"name":"type","type":"string","optional":false},{"name":"x","type":"number","optional":false},{"name":"y","type":"number","optional":false},{"name":"timestamp","type":"number","optional":false},{"name":"button","type":"string","optional":false},{"name":"deltaX","type":"number","optional":true},{"name":"deltaY","type":"number","optional":true},{"name":"modifiers","type":"number","optional":true},{"name":"clickCount","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("Input.synthesizePinchGesture",[{"name":"x","type":"number","optional":false},{"name":"y","type":"number","optional":false},{"name":"scaleFactor","type":"number","optional":false},{"name":"relativeSpeed","type":"number","optional":true},{"name":"gestureSourceType","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Input.synthesizeScrollGesture",[{"name":"x","type":"number","optional":false},{"name":"y","type":"number","optional":false},{"name":"xDistance","type":"number","optional":true},{"name":"yDistance","type":"number","optional":true},{"name":"xOverscroll","type":"number","optional":true},{"name":"yOverscroll","type":"number","optional":true},{"name":"preventFling","type":"boolean","optional":true},{"name":"speed","type":"number","optional":true},{"name":"gestureSourceType","type":"string","optional":true},{"name":"repeatCount","type":"number","optional":true},{"name":"repeatDelayMs","type":"number","optional":true},{"name":"interactionMarkerName","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Input.synthesizeTapGesture",[{"name":"x","type":"number","optional":false},{"name":"y","type":"number","optional":false},{"name":"duration","type":"number","optional":true},{"name":"tapCount","type":"number","optional":true},{"name":"gestureSourceType","type":"string","optional":true}],[],false);InspectorBackend.registerEnum("LayerTree.ScrollRectType",{RepaintsOnScroll:"RepaintsOnScroll",TouchEventHandler:"TouchEventHandler",WheelEventHandler:"WheelEventHandler"});InspectorBackend.registerEvent("LayerTree.layerTreeDidChange",["layers"]);InspectorBackend.registerEvent("LayerTree.layerPainted",["layerId","clip"]);InspectorBackend.registerCommand("LayerTree.enable",[],[],false);InspectorBackend.registerCommand("LayerTree.disable",[],[],false);InspectorBackend.registerCommand("LayerTree.compositingReasons",[{"name":"layerId","type":"string","optional":false}],["compositingReasons"],false);InspectorBackend.registerCommand("LayerTree.makeSnapshot",[{"name":"layerId","type":"string","optional":false}],["snapshotId"],false);InspectorBackend.registerCommand("LayerTree.loadSnapshot",[{"name":"tiles","type":"object","optional":false}],["snapshotId"],false);InspectorBackend.registerCommand("LayerTree.releaseSnapshot",[{"name":"snapshotId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("LayerTree.profileSnapshot",[{"name":"snapshotId","type":"string","optional":false},{"name":"minRepeatCount","type":"number","optional":true},{"name":"minDuration","type":"number","optional":true},{"name":"clipRect","type":"object","optional":true}],["timings"],false);InspectorBackend.registerCommand("LayerTree.replaySnapshot",[{"name":"snapshotId","type":"string","optional":false},{"name":"fromStep","type":"number","optional":true},{"name":"toStep","type":"number","optional":true},{"name":"scale","type":"number","optional":true}],["dataURL"],false);InspectorBackend.registerCommand("LayerTree.snapshotCommandLog",[{"name":"snapshotId","type":"string","optional":false}],["commandLog"],false);InspectorBackend.registerCommand("DeviceOrientation.setDeviceOrientationOverride",[{"name":"alpha","type":"number","optional":false},{"name":"beta","type":"number","optional":false},{"name":"gamma","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("DeviceOrientation.clearDeviceOrientationOverride",[],[],false);InspectorBackend.registerEnum("ScreenOrientation.OrientationType",{PortraitPrimary:"portraitPrimary",PortraitSecondary:"portraitSecondary",LandscapePrimary:"landscapePrimary",LandscapeSecondary:"landscapeSecondary"});InspectorBackend.registerCommand("ScreenOrientation.setScreenOrientationOverride",[{"name":"angle","type":"number","optional":false},{"name":"type","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("ScreenOrientation.clearScreenOrientationOverride",[],[],false);InspectorBackend.registerEvent("Tracing.dataCollected",["value"]);InspectorBackend.registerEvent("Tracing.tracingComplete",["stream"]);InspectorBackend.registerEvent("Tracing.bufferUsage",["percentFull","eventCount","value"]);InspectorBackend.registerCommand("Tracing.start",[{"name":"categories","type":"string","optional":true},{"name":"options","type":"string","optional":true},{"name":"bufferUsageReportingInterval","type":"number","optional":true},{"name":"transferMode","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Tracing.end",[],[],false);InspectorBackend.registerCommand("Tracing.getCategories",[],["categories"],false);InspectorBackend.registerCommand("Tracing.requestMemoryDump",[],["dumpGuid","success"],false);InspectorBackend.registerEnum("Animation.AnimationType",{CSSTransition:"CSSTransition",CSSAnimation:"CSSAnimation",WebAnimation:"WebAnimation"});InspectorBackend.registerEvent("Animation.animationCreated",["id"]);InspectorBackend.registerEvent("Animation.animationStarted",["animation"]);InspectorBackend.registerEvent("Animation.animationCanceled",["id"]);InspectorBackend.registerCommand("Animation.enable",[],[],false);InspectorBackend.registerCommand("Animation.disable",[],[],false);InspectorBackend.registerCommand("Animation.getPlaybackRate",[],["playbackRate"],false);InspectorBackend.registerCommand("Animation.setPlaybackRate",[{"name":"playbackRate","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Animation.getCurrentTime",[{"name":"id","type":"string","optional":false}],["currentTime"],false);InspectorBackend.registerCommand("Animation.setPaused",[{"name":"animations","type":"object","optional":false},{"name":"paused","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Animation.setTiming",[{"name":"animationId","type":"string","optional":false},{"name":"duration","type":"number","optional":false},{"name":"delay","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Animation.seekAnimations",[{"name":"animations","type":"object","optional":false},{"name":"currentTime","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Animation.releaseAnimations",[{"name":"animations","type":"object","optional":false}],[],false);InspectorBackend.registerCommand("Animation.resolveAnimation",[{"name":"animationId","type":"string","optional":false}],["remoteObject"],false);InspectorBackend.registerEnum("Accessibility.AXValueType",{Boolean:"boolean",Tristate:"tristate",BooleanOrUndefined:"booleanOrUndefined",Idref:"idref",IdrefList:"idrefList",Integer:"integer",Node:"node",NodeList:"nodeList",Number:"number",String:"string",ComputedString:"computedString",Token:"token",TokenList:"tokenList",DomRelation:"domRelation",Role:"role",InternalRole:"internalRole",ValueUndefined:"valueUndefined"});InspectorBackend.registerEnum("Accessibility.AXValueSourceType",{Attribute:"attribute",Implicit:"implicit",Style:"style",Contents:"contents",Placeholder:"placeholder",RelatedElement:"relatedElement"});InspectorBackend.registerEnum("Accessibility.AXValueNativeSourceType",{Figcaption:"figcaption",Label:"label",Labelfor:"labelfor",Labelwrapped:"labelwrapped",Legend:"legend",Tablecaption:"tablecaption",Title:"title",Other:"other"});InspectorBackend.registerEnum("Accessibility.AXGlobalStates",{Disabled:"disabled",Hidden:"hidden",HiddenRoot:"hiddenRoot",Invalid:"invalid"});InspectorBackend.registerEnum("Accessibility.AXLiveRegionAttributes",{Live:"live",Atomic:"atomic",Relevant:"relevant",Busy:"busy",Root:"root"});InspectorBackend.registerEnum("Accessibility.AXWidgetAttributes",{Autocomplete:"autocomplete",Haspopup:"haspopup",Level:"level",Multiselectable:"multiselectable",Orientation:"orientation",Multiline:"multiline",Readonly:"readonly",Required:"required",Valuemin:"valuemin",Valuemax:"valuemax",Valuetext:"valuetext"});InspectorBackend.registerEnum("Accessibility.AXWidgetStates",{Checked:"checked",Expanded:"expanded",Pressed:"pressed",Selected:"selected"});InspectorBackend.registerEnum("Accessibility.AXRelationshipAttributes",{Activedescendant:"activedescendant",Flowto:"flowto",Controls:"controls",Describedby:"describedby",Labelledby:"labelledby",Owns:"owns"});InspectorBackend.registerCommand("Accessibility.getAXNode",[{"name":"nodeId","type":"number","optional":false}],["accessibilityNode"],false);;WebInspector.InspectorBackendHostedMode={};WebInspector.InspectorBackendHostedMode.loadFromJSONIfNeeded=function(jsonUrl)
{if(InspectorBackend.isInitialized())
return;var xhr=new XMLHttpRequest();xhr.open("GET",jsonUrl,false);xhr.send(null);var schema=JSON.parse(xhr.responseText);var code=WebInspector.InspectorBackendHostedMode.generateCommands(schema);eval(code);}
WebInspector.InspectorBackendHostedMode.generateCommands=function(schema)
{var jsTypes={integer:"number",array:"object"};var rawTypes={};var result=[];var domains=schema["domains"]||[];for(var i=0;i<domains.length;++i){var domain=domains[i];for(var j=0;domain.types&&j<domain.types.length;++j){var type=domain.types[j];rawTypes[domain.domain+"."+type.id]=jsTypes[type.type]||type.type;}}
function toUpperCase(groupIndex,group0,group1)
{return[group0,group1][groupIndex].toUpperCase();}
function generateEnum(enumName,items)
{var members=[];for(var m=0;m<items.length;++m){var value=items[m];var name=value.replace(/-(\w)/g,toUpperCase.bind(null,1)).toTitleCase();name=name.replace(/HTML|XML|WML|API/ig,toUpperCase.bind(null,0));members.push(name+": \""+value+"\"");}
return"InspectorBackend.registerEnum(\""+enumName+"\", {"+members.join(", ")+"});";}
for(var i=0;i<domains.length;++i){var domain=domains[i];var types=domain["types"]||[];for(var j=0;j<types.length;++j){var type=types[j];if((type["type"]==="string")&&type["enum"])
result.push(generateEnum(domain.domain+"."+type.id,type["enum"]));else if(type["type"]==="object"){var properties=type["properties"]||[];for(var k=0;k<properties.length;++k){var property=properties[k];if((property["type"]==="string")&&property["enum"])
result.push(generateEnum(domain.domain+"."+type.id+property["name"].toTitleCase(),property["enum"]));}}}
var commands=domain["commands"]||[];for(var j=0;j<commands.length;++j){var command=commands[j];var parameters=command["parameters"];var paramsText=[];for(var k=0;parameters&&k<parameters.length;++k){var parameter=parameters[k];var type;if(parameter.type)
type=jsTypes[parameter.type]||parameter.type;else{var ref=parameter["$ref"];if(ref.indexOf(".")!==-1)
type=rawTypes[ref];else
type=rawTypes[domain.domain+"."+ref];}
var text="{\"name\": \""+parameter.name+"\", \"type\": \""+type+"\", \"optional\": "+(parameter.optional?"true":"false")+"}";paramsText.push(text);}
var returnsText=[];var returns=command["returns"]||[];for(var k=0;k<returns.length;++k){var parameter=returns[k];returnsText.push("\""+parameter.name+"\"");}
var hasErrorData=String(Boolean(command.error));result.push("InspectorBackend.registerCommand(\""+domain.domain+"."+command.name+"\", ["+paramsText.join(", ")+"], ["+returnsText.join(", ")+"], "+hasErrorData+");");}
for(var j=0;domain.events&&j<domain.events.length;++j){var event=domain.events[j];var paramsText=[];for(var k=0;event.parameters&&k<event.parameters.length;++k){var parameter=event.parameters[k];paramsText.push("\""+parameter.name+"\"");}
result.push("InspectorBackend.registerEvent(\""+domain.domain+"."+event.name+"\", ["+paramsText.join(", ")+"]);");}}
return result.join("\n");}
WebInspector.InspectorBackendHostedMode.loadFromJSONIfNeeded("../protocol.json");;WebInspector.Target=function(targetManager,name,type,connection,parentTarget)
{Protocol.Agents.call(this,connection.agentsMap());this._targetManager=targetManager;this._name=name;this._type=type;this._connection=connection;this._parentTarget=parentTarget;connection.addEventListener(InspectorBackendClass.Connection.Events.Disconnected,this._onDisconnect,this);this._id=WebInspector.Target._nextId++;this._modelByConstructor=new Map();this.consoleModel=new WebInspector.ConsoleModel(this);this.networkManager=new WebInspector.NetworkManager(this);this.resourceTreeModel=new WebInspector.ResourceTreeModel(this);this.networkLog=new WebInspector.NetworkLog(this);this.runtimeModel=new WebInspector.RuntimeModel(this);if(this.hasJSContext())
new WebInspector.DebuggerModel(this);if(this._type===WebInspector.Target.Type.Page){new WebInspector.DOMModel(this);new WebInspector.CSSStyleModel(this);}
this.workerManager=!this.isDedicatedWorker()?new WebInspector.WorkerManager(this):null;this.cpuProfilerModel=new WebInspector.CPUProfilerModel(this);this.heapProfilerModel=new WebInspector.HeapProfilerModel(this);this.tracingManager=new WebInspector.TracingManager(this);if(this.isPage())
this.serviceWorkerManager=new WebInspector.ServiceWorkerManager(this);}
WebInspector.Target.Type={Page:1,DedicatedWorker:2,ServiceWorker:4}
WebInspector.Target._nextId=1;WebInspector.Target.prototype={id:function()
{return this._id;},name:function()
{return this._name;},targetManager:function()
{return this._targetManager;},decorateLabel:function(label)
{return this.isWorker()?"\u2699 "+label:label;},registerDispatcher:function(domain,dispatcher)
{this._connection.registerDispatcher(domain,dispatcher);},isPage:function()
{return this._type===WebInspector.Target.Type.Page;},isWorker:function()
{return this.isDedicatedWorker()||this.isServiceWorker();},isDedicatedWorker:function()
{return this._type===WebInspector.Target.Type.DedicatedWorker;},isServiceWorker:function()
{return this._type===WebInspector.Target.Type.ServiceWorker;},hasJSContext:function()
{return!this.isServiceWorker();},parentTarget:function()
{return this._parentTarget;},_onDisconnect:function()
{this._targetManager.removeTarget(this);this._dispose();},_dispose:function()
{this._targetManager.dispatchEventToListeners(WebInspector.TargetManager.Events.TargetDisposed,this);this.networkManager.dispose();this.cpuProfilerModel.dispose();WebInspector.ServiceWorkerCacheModel.fromTarget(this).dispose();if(this.workerManager)
this.workerManager.dispose();},isDetached:function()
{return this._connection.isClosed();},model:function(modelClass)
{return this._modelByConstructor.get(modelClass)||null;},__proto__:Protocol.Agents.prototype}
WebInspector.SDKObject=function(target)
{WebInspector.Object.call(this);this._target=target;}
WebInspector.SDKObject.prototype={target:function()
{return this._target;},__proto__:WebInspector.Object.prototype}
WebInspector.SDKModel=function(modelClass,target)
{WebInspector.SDKObject.call(this,target);target._modelByConstructor.set(modelClass,this);}
WebInspector.SDKModel.prototype={suspendModel:function()
{return Promise.resolve();},resumeModel:function()
{return Promise.resolve();},__proto__:WebInspector.SDKObject.prototype}
WebInspector.TargetManager=function()
{WebInspector.Object.call(this);this._targets=[];this._observers=[];this._observerTypeSymbol=Symbol("observerType");this._modelListeners={};this._isSuspended=false;}
WebInspector.TargetManager.Events={InspectedURLChanged:"InspectedURLChanged",MainFrameNavigated:"MainFrameNavigated",Load:"Load",PageReloadRequested:"PageReloadRequested",WillReloadPage:"WillReloadPage",TargetDisposed:"TargetDisposed",SuspendStateChanged:"SuspendStateChanged"}
WebInspector.TargetManager.prototype={suspendAllTargets:function()
{if(this._isSuspended)
return;this._isSuspended=true;this.dispatchEventToListeners(WebInspector.TargetManager.Events.SuspendStateChanged);for(var i=0;i<this._targets.length;++i){for(var model of this._targets[i]._modelByConstructor.values())
model.suspendModel();}},resumeAllTargets:function()
{if(!this._isSuspended)
throw new Error("Not suspended");this._isSuspended=false;this.dispatchEventToListeners(WebInspector.TargetManager.Events.SuspendStateChanged);var promises=[];for(var i=0;i<this._targets.length;++i){for(var model of this._targets[i]._modelByConstructor.values())
promises.push(model.resumeModel());}
return Promise.all(promises);},suspendAndResumeAllTargets:function()
{this.suspendAllTargets();this.resumeAllTargets();},allTargetsSuspended:function()
{return this._isSuspended;},inspectedPageURL:function()
{if(!this._targets.length)
return"";return this._targets[0].resourceTreeModel.inspectedPageURL();},inspectedPageDomain:function()
{if(!this._targets.length)
return"";return this._targets[0].resourceTreeModel.inspectedPageDomain();},_redispatchEvent:function(event)
{this.dispatchEventToListeners(event.type,event.data);},reloadPage:function(ignoreCache,injectedScript)
{if(this._targets.length)
this._targets[0].resourceTreeModel.reloadPage(ignoreCache,injectedScript);},addModelListener:function(modelClass,eventType,listener,thisObject)
{for(var i=0;i<this._targets.length;++i){var model=this._targets[i]._modelByConstructor.get(modelClass);if(model)
model.addEventListener(eventType,listener,thisObject);}
if(!this._modelListeners[eventType])
this._modelListeners[eventType]=[];this._modelListeners[eventType].push({modelClass:modelClass,thisObject:thisObject,listener:listener});},removeModelListener:function(modelClass,eventType,listener,thisObject)
{if(!this._modelListeners[eventType])
return;for(var i=0;i<this._targets.length;++i){var model=this._targets[i]._modelByConstructor.get(modelClass);if(model)
model.removeEventListener(eventType,listener,thisObject);}
var listeners=this._modelListeners[eventType];for(var i=0;i<listeners.length;++i){if(listeners[i].modelClass===modelClass&&listeners[i].listener===listener&&listeners[i].thisObject===thisObject)
listeners.splice(i--,1);}
if(!listeners.length)
delete this._modelListeners[eventType];},observeTargets:function(targetObserver,type)
{if(this._observerTypeSymbol in targetObserver)
throw new Error("Observer can only be registered once");targetObserver[this._observerTypeSymbol]=type||0x7fff;this.targets(type).forEach(targetObserver.targetAdded.bind(targetObserver));this._observers.push(targetObserver);},unobserveTargets:function(targetObserver)
{delete targetObserver[this._observerTypeSymbol];this._observers.remove(targetObserver);},createTarget:function(name,type,connection,parentTarget)
{var target=new WebInspector.Target(this,name,type,connection,parentTarget);this.addTarget(target);return target;},_observersByType:function(type)
{var result=[];for(var observer of this._observers){if(observer[this._observerTypeSymbol]&type)
result.push(observer);}
return result;},addTarget:function(target)
{this._targets.push(target);if(this._targets.length===1){target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged,this._redispatchEvent,this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._redispatchEvent,this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.Load,this._redispatchEvent,this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.PageReloadRequested,this._redispatchEvent,this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.WillReloadPage,this._redispatchEvent,this);}
var copy=this._observersByType(target._type);for(var i=0;i<copy.length;++i)
copy[i].targetAdded(target);for(var eventType in this._modelListeners){var listeners=this._modelListeners[eventType];for(var i=0;i<listeners.length;++i){var model=target._modelByConstructor.get(listeners[i].modelClass);if(model)
model.addEventListener(eventType,listeners[i].listener,listeners[i].thisObject);}}},removeTarget:function(target)
{this._targets.remove(target);if(this._targets.length===0){target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged,this._redispatchEvent,this);target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._redispatchEvent,this);target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.Load,this._redispatchEvent,this);target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.WillReloadPage,this._redispatchEvent,this);}
var copy=this._observersByType(target._type);for(var i=0;i<copy.length;++i)
copy[i].targetRemoved(target);for(var eventType in this._modelListeners){var listeners=this._modelListeners[eventType];for(var i=0;i<listeners.length;++i){var model=target._modelByConstructor.get(listeners[i].modelClass);if(model)
model.removeEventListener(eventType,listeners[i].listener,listeners[i].thisObject);}}},hasTargets:function(type)
{return!!this.targets(type).length;},targets:function(type)
{if(!type)
return this._targets.slice();var result=[];for(var target of this._targets){if(target._type&type)
result.push(target);}
return result;},targetsWithJSContext:function()
{var result=[];for(var target of this._targets){if(target.hasJSContext())
result.push(target);}
return result;},targetById:function(id)
{for(var i=0;i<this._targets.length;++i){if(this._targets[i].id()===id)
return this._targets[i];}
return null;},mainTarget:function()
{return this._targets[0]||null;},__proto__:WebInspector.Object.prototype}
WebInspector.TargetManager.Observer=function()
{}
WebInspector.TargetManager.Observer.prototype={targetAdded:function(target){},targetRemoved:function(target){},}
WebInspector.targetManager=new WebInspector.TargetManager();;WebInspector.ApplicationCacheModel=function(target)
{WebInspector.SDKObject.call(this,target);target.registerApplicationCacheDispatcher(new WebInspector.ApplicationCacheDispatcher(this));this._agent=target.applicationCacheAgent();this._agent.enable();target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated,this._frameNavigated,this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameDetached,this._frameDetached,this);this._statuses={};this._manifestURLsByFrame={};this._mainFrameNavigated();this._onLine=true;}
WebInspector.ApplicationCacheModel.EventTypes={FrameManifestStatusUpdated:"FrameManifestStatusUpdated",FrameManifestAdded:"FrameManifestAdded",FrameManifestRemoved:"FrameManifestRemoved",NetworkStateChanged:"NetworkStateChanged"}
WebInspector.ApplicationCacheModel.prototype={_frameNavigated:function(event)
{var frame=(event.data);if(frame.isMainFrame()){this._mainFrameNavigated();return;}
this._agent.getManifestForFrame(frame.id,this._manifestForFrameLoaded.bind(this,frame.id));},_frameDetached:function(event)
{var frame=(event.data);this._frameManifestRemoved(frame.id);},_mainFrameNavigated:function()
{this._agent.getFramesWithManifests(this._framesWithManifestsLoaded.bind(this));},_manifestForFrameLoaded:function(frameId,error,manifestURL)
{if(error){console.error(error);return;}
if(!manifestURL)
this._frameManifestRemoved(frameId);},_framesWithManifestsLoaded:function(error,framesWithManifests)
{if(error){console.error(error);return;}
for(var i=0;i<framesWithManifests.length;++i)
this._frameManifestUpdated(framesWithManifests[i].frameId,framesWithManifests[i].manifestURL,framesWithManifests[i].status);},_frameManifestUpdated:function(frameId,manifestURL,status)
{if(status===applicationCache.UNCACHED){this._frameManifestRemoved(frameId);return;}
if(!manifestURL)
return;if(this._manifestURLsByFrame[frameId]&&manifestURL!==this._manifestURLsByFrame[frameId])
this._frameManifestRemoved(frameId);var statusChanged=this._statuses[frameId]!==status;this._statuses[frameId]=status;if(!this._manifestURLsByFrame[frameId]){this._manifestURLsByFrame[frameId]=manifestURL;this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.EventTypes.FrameManifestAdded,frameId);}
if(statusChanged)
this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.EventTypes.FrameManifestStatusUpdated,frameId);},_frameManifestRemoved:function(frameId)
{if(!this._manifestURLsByFrame[frameId])
return;delete this._manifestURLsByFrame[frameId];delete this._statuses[frameId];this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.EventTypes.FrameManifestRemoved,frameId);},frameManifestURL:function(frameId)
{return this._manifestURLsByFrame[frameId]||"";},frameManifestStatus:function(frameId)
{return this._statuses[frameId]||applicationCache.UNCACHED;},get onLine()
{return this._onLine;},_statusUpdated:function(frameId,manifestURL,status)
{this._frameManifestUpdated(frameId,manifestURL,status);},requestApplicationCache:function(frameId,callback)
{function callbackWrapper(error,applicationCache)
{if(error){console.error(error);callback(null);return;}
callback(applicationCache);}
this._agent.getApplicationCacheForFrame(frameId,callbackWrapper);},_networkStateUpdated:function(isNowOnline)
{this._onLine=isNowOnline;this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.EventTypes.NetworkStateChanged,isNowOnline);},__proto__:WebInspector.SDKObject.prototype}
WebInspector.ApplicationCacheDispatcher=function(applicationCacheModel)
{this._applicationCacheModel=applicationCacheModel;}
WebInspector.ApplicationCacheDispatcher.prototype={applicationCacheStatusUpdated:function(frameId,manifestURL,status)
{this._applicationCacheModel._statusUpdated(frameId,manifestURL,status);},networkStateUpdated:function(isNowOnline)
{this._applicationCacheModel._networkStateUpdated(isNowOnline);}};WebInspector.ConsoleModel=function(target)
{WebInspector.SDKModel.call(this,WebInspector.ConsoleModel,target);this._messages=[];this._messageById=new Map();this._warnings=0;this._errors=0;this._revokedErrors=0;this._consoleAgent=target.consoleAgent();target.registerConsoleDispatcher(new WebInspector.ConsoleDispatcher(this));this._enableAgent();}
WebInspector.ConsoleModel.Events={ConsoleCleared:"ConsoleCleared",MessageAdded:"MessageAdded",MessageUpdated:"MessageUpdated",CommandEvaluated:"CommandEvaluated",}
WebInspector.ConsoleModel.prototype={_enableAgent:function()
{this._enablingConsole=true;function callback()
{delete this._enablingConsole;}
this._consoleAgent.enable(callback.bind(this));},addMessage:function(msg)
{if(this._isBlacklisted(msg))
return;if(msg.level===WebInspector.ConsoleMessage.MessageLevel.RevokedError&&msg._relatedMessageId){var relatedMessage=this._messageById.get(msg._relatedMessageId);if(!relatedMessage)
return;this._errors--;this._revokedErrors++;relatedMessage.level=WebInspector.ConsoleMessage.MessageLevel.RevokedError;this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.MessageUpdated,relatedMessage);return;}
this._messages.push(msg);if(msg._messageId)
this._messageById.set(msg._messageId,msg);this._incrementErrorWarningCount(msg);this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.MessageAdded,msg);},_incrementErrorWarningCount:function(msg)
{switch(msg.level){case WebInspector.ConsoleMessage.MessageLevel.Warning:this._warnings++;break;case WebInspector.ConsoleMessage.MessageLevel.Error:this._errors++;break;case WebInspector.ConsoleMessage.MessageLevel.RevokedError:this._revokedErrors++;break;}},_isBlacklisted:function(msg)
{if(msg.source!=WebInspector.ConsoleMessage.MessageSource.Network||msg.level!=WebInspector.ConsoleMessage.MessageLevel.Error||!msg.url||!msg.url.startsWith("chrome-extension"))
return false;if(msg.url.includes("://boadgeojelhgndaghljhdicfkmllpafd")||msg.url.includes("://dliochdbjfkdbacpmhlcpmleaejidimm")||msg.url.includes("://pkedcjkdefgpdelpbcmbmeomcjbeemfm")||msg.url.includes("://ekpaaapppgpmolpcldedioblbkmijaca"))
return true;return false;},messages:function()
{return this._messages;},requestClearMessages:function()
{this._consoleAgent.clearMessages();this._messagesCleared();},_messagesCleared:function()
{this._messages=[];this._messageById.clear();this._errors=0;this._revokedErrors=0;this._warnings=0;this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.ConsoleCleared);},errors:function()
{return this._errors;},revokedErrors:function()
{return this._revokedErrors;},warnings:function()
{return this._warnings;},__proto__:WebInspector.SDKModel.prototype}
WebInspector.ConsoleModel.evaluateCommandInConsole=function(executionContext,text,useCommandLineAPI)
{var target=executionContext.target();var commandMessage=new WebInspector.ConsoleMessage(target,WebInspector.ConsoleMessage.MessageSource.JS,null,text,WebInspector.ConsoleMessage.MessageType.Command);commandMessage.setExecutionContextId(executionContext.id);target.consoleModel.addMessage(commandMessage);function printResult(result,wasThrown,valueResult,exceptionDetails)
{if(!result)
return;WebInspector.console.showPromise().then(reportUponEvaluation);function reportUponEvaluation()
{target.consoleModel.dispatchEventToListeners(WebInspector.ConsoleModel.Events.CommandEvaluated,{result:result,wasThrown:wasThrown,text:text,commandMessage:commandMessage,exceptionDetails:exceptionDetails});}}
if(/^\s*\{/.test(text)&&/\}\s*$/.test(text))
text='('+text+')';executionContext.evaluate(text,"console",!!useCommandLineAPI,false,false,true,printResult);WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.ConsoleEvaluated);}
WebInspector.ConsoleModel.clearConsole=function()
{var targets=WebInspector.targetManager.targets();for(var i=0;i<targets.length;++i)
targets[i].consoleModel.requestClearMessages();}
WebInspector.ConsoleMessage=function(target,source,level,messageText,type,url,line,column,requestId,parameters,stackTrace,timestamp,executionContextId,asyncStackTrace,scriptId,messageId,relatedMessageId)
{this._target=target;this.source=source;this.level=level;this.messageText=messageText;this.type=type||WebInspector.ConsoleMessage.MessageType.Log;this.url=url||undefined;this.line=line||0;this.column=column||0;this.parameters=parameters;this.stackTrace=stackTrace;this.timestamp=timestamp||Date.now();this.executionContextId=executionContextId||0;this.asyncStackTrace=asyncStackTrace;this.scriptId=scriptId||null;this._messageId=messageId||0;this._relatedMessageId=relatedMessageId||0;this.request=requestId?target.networkLog.requestForId(requestId):null;if(this.request){var initiator=this.request.initiator();if(initiator){this.stackTrace=initiator.stackTrace||undefined;this.asyncStackTrace=initiator.asyncStackTrace;if(initiator.url){this.url=initiator.url;this.line=initiator.lineNumber||0;}}}}
WebInspector.ConsoleMessage.prototype={target:function()
{return this._target;},setOriginatingMessage:function(originatingMessage)
{this._originatingConsoleMessage=originatingMessage;this.executionContextId=originatingMessage.executionContextId;},setExecutionContextId:function(executionContextId)
{this.executionContextId=executionContextId;},originatingMessage:function()
{return this._originatingConsoleMessage;},isGroupMessage:function()
{return this.type===WebInspector.ConsoleMessage.MessageType.StartGroup||this.type===WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed||this.type===WebInspector.ConsoleMessage.MessageType.EndGroup;},isGroupStartMessage:function()
{return this.type===WebInspector.ConsoleMessage.MessageType.StartGroup||this.type===WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed;},isErrorOrWarning:function()
{return(this.level===WebInspector.ConsoleMessage.MessageLevel.Warning||this.level===WebInspector.ConsoleMessage.MessageLevel.Error);},isEqual:function(msg)
{if(!msg)
return false;if(this._messageId||msg._messageId)
return false;if(this._relatedMessageId||msg._relatedMessageId)
return false;if(!this._isEqualStackTraces(this.stackTrace,msg.stackTrace))
return false;var asyncTrace1=this.asyncStackTrace;var asyncTrace2=msg.asyncStackTrace;while(asyncTrace1||asyncTrace2){if(!asyncTrace1||!asyncTrace2)
return false;if(asyncTrace1.description!==asyncTrace2.description)
return false;if(!this._isEqualStackTraces(asyncTrace1.callFrames,asyncTrace2.callFrames))
return false;asyncTrace1=asyncTrace1.asyncStackTrace;asyncTrace2=asyncTrace2.asyncStackTrace;}
if(this.parameters){if(!msg.parameters||this.parameters.length!==msg.parameters.length)
return false;for(var i=0;i<msg.parameters.length;++i){if(this.parameters[i].type!==msg.parameters[i].type||msg.parameters[i].type==="object"||this.parameters[i].value!==msg.parameters[i].value)
return false;}}
return(this.target()===msg.target())&&(this.source===msg.source)&&(this.type===msg.type)&&(this.level===msg.level)&&(this.line===msg.line)&&(this.url===msg.url)&&(this.messageText===msg.messageText)&&(this.request===msg.request)&&(this.executionContextId===msg.executionContextId)&&(this.scriptId===msg.scriptId);},_isEqualStackTraces:function(stackTrace1,stackTrace2)
{stackTrace1=stackTrace1||[];stackTrace2=stackTrace2||[];if(stackTrace1.length!==stackTrace2.length)
return false;for(var i=0,n=stackTrace1.length;i<n;++i){if(stackTrace1[i].url!==stackTrace2[i].url||stackTrace1[i].functionName!==stackTrace2[i].functionName||stackTrace1[i].lineNumber!==stackTrace2[i].lineNumber||stackTrace1[i].columnNumber!==stackTrace2[i].columnNumber)
return false;}
return true;}}
WebInspector.ConsoleMessage.MessageSource={XML:"xml",JS:"javascript",Network:"network",ConsoleAPI:"console-api",Storage:"storage",AppCache:"appcache",Rendering:"rendering",CSS:"css",Security:"security",Other:"other",Deprecation:"deprecation"}
WebInspector.ConsoleMessage.MessageType={Log:"log",Dir:"dir",DirXML:"dirxml",Table:"table",Trace:"trace",Clear:"clear",StartGroup:"startGroup",StartGroupCollapsed:"startGroupCollapsed",EndGroup:"endGroup",Assert:"assert",Result:"result",Profile:"profile",ProfileEnd:"profileEnd",Command:"command"}
WebInspector.ConsoleMessage.MessageLevel={Log:"log",Info:"info",Warning:"warning",Error:"error",Debug:"debug",RevokedError:"revokedError"};WebInspector.ConsoleMessage.timestampComparator=function(a,b)
{return a.timestamp-b.timestamp;}
WebInspector.ConsoleDispatcher=function(console)
{this._console=console;}
WebInspector.ConsoleDispatcher.prototype={messageAdded:function(payload)
{var consoleMessage=new WebInspector.ConsoleMessage(this._console.target(),payload.source,payload.level,payload.text,payload.type,payload.url,payload.line,payload.column,payload.networkRequestId,payload.parameters,payload.stackTrace,payload.timestamp*1000,payload.executionContextId,payload.asyncStackTrace,payload.scriptId,payload.messageId,payload.relatedMessageId);this._console.addMessage(consoleMessage);},messageRepeatCountUpdated:function(count)
{},messagesCleared:function()
{if(!WebInspector.moduleSetting("preserveConsoleLog").get())
this._console._messagesCleared();}}
WebInspector.MultitargetConsoleModel=function()
{WebInspector.targetManager.observeTargets(this);WebInspector.targetManager.addModelListener(WebInspector.ConsoleModel,WebInspector.ConsoleModel.Events.MessageAdded,this._consoleMessageAdded,this);WebInspector.targetManager.addModelListener(WebInspector.ConsoleModel,WebInspector.ConsoleModel.Events.MessageUpdated,this._consoleMessageUpdated,this);WebInspector.targetManager.addModelListener(WebInspector.ConsoleModel,WebInspector.ConsoleModel.Events.CommandEvaluated,this._commandEvaluated,this);}
WebInspector.MultitargetConsoleModel.prototype={targetAdded:function(target)
{if(!this._mainTarget){this._mainTarget=target;target.consoleModel.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared,this._consoleCleared,this);}},targetRemoved:function(target)
{if(this._mainTarget===target){delete this._mainTarget;target.consoleModel.removeEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared,this._consoleCleared,this);}},messages:function()
{var targets=WebInspector.targetManager.targets();var result=[];for(var i=0;i<targets.length;++i)
result=result.concat(targets[i].consoleModel.messages());return result;},_consoleCleared:function()
{this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.ConsoleCleared);},_consoleMessageAdded:function(event)
{this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.MessageAdded,event.data);},_consoleMessageUpdated:function(event)
{this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.MessageUpdated,event.data);},_commandEvaluated:function(event)
{this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.CommandEvaluated,event.data);},__proto__:WebInspector.Object.prototype}
WebInspector.multitargetConsoleModel;;WebInspector.CompilerSourceMappingContentProvider=function(sourceURL,contentType)
{this._sourceURL=sourceURL;this._contentType=contentType;}
WebInspector.CompilerSourceMappingContentProvider.prototype={contentURL:function()
{return this._sourceURL;},contentType:function()
{return this._contentType;},requestContent:function(callback)
{WebInspector.multitargetNetworkManager.loadResource(this._sourceURL,contentLoaded.bind(this));function contentLoaded(statusCode,headers,content)
{if(statusCode>=400){console.error("Could not load content for "+this._sourceURL+" : "+"HTTP status code: "+statusCode);callback(null);return;}
callback(content);}},searchInContent:function(query,caseSensitive,isRegex,callback)
{this.requestContent(contentLoaded);function contentLoaded(content)
{if(typeof content!=="string"){callback([]);return;}
callback(WebInspector.ContentProvider.performSearchInContent(content,query,caseSensitive,isRegex));}}};WebInspector.CookieParser=function(target)
{this._target=target;}
WebInspector.CookieParser.KeyValue=function(key,value,position)
{this.key=key;this.value=value;this.position=position;}
WebInspector.CookieParser.prototype={cookies:function()
{return this._cookies;},parseCookie:function(cookieHeader)
{if(!this._initialize(cookieHeader))
return null;for(var kv=this._extractKeyValue();kv;kv=this._extractKeyValue()){if(kv.key.charAt(0)==="$"&&this._lastCookie)
this._lastCookie.addAttribute(kv.key.slice(1),kv.value);else if(kv.key.toLowerCase()!=="$version"&&typeof kv.value==="string")
this._addCookie(kv,WebInspector.Cookie.Type.Request);this._advanceAndCheckCookieDelimiter();}
this._flushCookie();return this._cookies;},parseSetCookie:function(setCookieHeader)
{if(!this._initialize(setCookieHeader))
return null;for(var kv=this._extractKeyValue();kv;kv=this._extractKeyValue()){if(this._lastCookie)
this._lastCookie.addAttribute(kv.key,kv.value);else
this._addCookie(kv,WebInspector.Cookie.Type.Response);if(this._advanceAndCheckCookieDelimiter())
this._flushCookie();}
this._flushCookie();return this._cookies;},_initialize:function(headerValue)
{this._input=headerValue;if(typeof headerValue!=="string")
return false;this._cookies=[];this._lastCookie=null;this._originalInputLength=this._input.length;return true;},_flushCookie:function()
{if(this._lastCookie)
this._lastCookie.setSize(this._originalInputLength-this._input.length-this._lastCookiePosition);this._lastCookie=null;},_extractKeyValue:function()
{if(!this._input||!this._input.length)
return null;var keyValueMatch=/^[ \t]*([^\s=;]+)[ \t]*(?:=[ \t]*([^;\n]*))?/.exec(this._input);if(!keyValueMatch){console.log("Failed parsing cookie header before: "+this._input);return null;}
var result=new WebInspector.CookieParser.KeyValue(keyValueMatch[1],keyValueMatch[2]&&keyValueMatch[2].trim(),this._originalInputLength-this._input.length);this._input=this._input.slice(keyValueMatch[0].length);return result;},_advanceAndCheckCookieDelimiter:function()
{var match=/^\s*[\n;]\s*/.exec(this._input);if(!match)
return false;this._input=this._input.slice(match[0].length);return match[0].match("\n")!==null;},_addCookie:function(keyValue,type)
{if(this._lastCookie)
this._lastCookie.setSize(keyValue.position-this._lastCookiePosition);this._lastCookie=typeof keyValue.value==="string"?new WebInspector.Cookie(this._target,keyValue.key,keyValue.value,type):new WebInspector.Cookie(this._target,"",keyValue.key,type);this._lastCookiePosition=keyValue.position;this._cookies.push(this._lastCookie);}};WebInspector.CookieParser.parseCookie=function(target,header)
{return(new WebInspector.CookieParser(target)).parseCookie(header);}
WebInspector.CookieParser.parseSetCookie=function(target,header)
{return(new WebInspector.CookieParser(target)).parseSetCookie(header);}
WebInspector.Cookie=function(target,name,value,type)
{this._target=target;this._name=name;this._value=value;this._type=type;this._attributes={};}
WebInspector.Cookie.prototype={name:function()
{return this._name;},value:function()
{return this._value;},type:function()
{return this._type;},httpOnly:function()
{return"httponly"in this._attributes;},secure:function()
{return"secure"in this._attributes;},firstPartyOnly:function()
{return"first-party-only"in this._attributes;},session:function()
{return!("expires"in this._attributes||"max-age"in this._attributes);},path:function()
{return this._attributes["path"];},port:function()
{return this._attributes["port"];},domain:function()
{return this._attributes["domain"];},expires:function()
{return this._attributes["expires"];},maxAge:function()
{return this._attributes["max-age"];},size:function()
{return this._size;},setSize:function(size)
{this._size=size;},expiresDate:function(requestDate)
{if(this.maxAge()){var targetDate=requestDate===null?new Date():requestDate;return new Date(targetDate.getTime()+1000*this.maxAge());}
if(this.expires())
return new Date(this.expires());return null;},attributes:function()
{return this._attributes;},addAttribute:function(key,value)
{this._attributes[key.toLowerCase()]=value;},remove:function(callback)
{this._target.networkAgent().deleteCookie(this.name(),(this.secure()?"https://":"http://")+this.domain()+this.path(),callback);}}
WebInspector.Cookie.Type={Request:0,Response:1};WebInspector.Cookies={}
WebInspector.Cookies.getCookiesAsync=function(callback)
{var allCookies=[];function mycallback(target,error,cookies)
{if(error){console.error(error);return;}
for(var i=0;i<cookies.length;++i)
allCookies.push(WebInspector.Cookies._parseProtocolCookie(target,cookies[i]));}
var barrier=new CallbackBarrier();for(var target of WebInspector.targetManager.targets(WebInspector.Target.Type.Page))
target.networkAgent().getCookies(barrier.createCallback(mycallback.bind(null,target)));barrier.callWhenDone(callback.bind(null,allCookies));}
WebInspector.Cookies._parseProtocolCookie=function(target,protocolCookie)
{var cookie=new WebInspector.Cookie(target,protocolCookie.name,protocolCookie.value,null);cookie.addAttribute("domain",protocolCookie["domain"]);cookie.addAttribute("path",protocolCookie["path"]);cookie.addAttribute("port",protocolCookie["port"]);if(protocolCookie["expires"])
cookie.addAttribute("expires",protocolCookie["expires"]);if(protocolCookie["httpOnly"])
cookie.addAttribute("httpOnly");if(protocolCookie["secure"])
cookie.addAttribute("secure");if(protocolCookie["firstPartyOnly"])
cookie.addAttribute("first-party-only");cookie.setSize(protocolCookie["size"]);return cookie;}
WebInspector.Cookies.cookieMatchesResourceURL=function(cookie,resourceURL)
{var url=resourceURL.asParsedURL();if(!url||!WebInspector.Cookies.cookieDomainMatchesResourceDomain(cookie.domain(),url.host))
return false;return(url.path.startsWith(cookie.path())&&(!cookie.port()||url.port==cookie.port())&&(!cookie.secure()||url.scheme==="https"));}
WebInspector.Cookies.cookieDomainMatchesResourceDomain=function(cookieDomain,resourceDomain)
{if(cookieDomain.charAt(0)!=='.')
return resourceDomain===cookieDomain;return!!resourceDomain.match(new RegExp("^([^\\.]+\\.)*"+cookieDomain.substring(1).escapeForRegExp()+"$","i"));};WebInspector.CPUProfileDataModel=function(profile)
{this.profileHead=profile.head;this.samples=profile.samples;this.timestamps=profile.timestamps;this.profileStartTime=profile.startTime*1000;this.profileEndTime=profile.endTime*1000;this._assignParentsInProfile();if(this.samples){this._normalizeTimestamps();this._buildIdToNodeMap();this._fixMissingSamples();}
if(!WebInspector.moduleSetting("showNativeFunctionsInJSProfile").get())
this._filterNativeFrames();this._assignDepthsInProfile();this._calculateTimes(profile);}
WebInspector.CPUProfileDataModel.prototype={_calculateTimes:function(profile)
{function totalHitCount(node){var result=node.hitCount;for(var i=0;i<node.children.length;i++)
result+=totalHitCount(node.children[i]);return result;}
profile.totalHitCount=totalHitCount(profile.head);var duration=this.profileEndTime-this.profileStartTime;var samplingInterval=duration/profile.totalHitCount;this.samplingInterval=samplingInterval;function calculateTimesForNode(node){node.selfTime=node.hitCount*samplingInterval;var totalHitCount=node.hitCount;for(var i=0;i<node.children.length;i++)
totalHitCount+=calculateTimesForNode(node.children[i]);node.totalTime=totalHitCount*samplingInterval;return totalHitCount;}
calculateTimesForNode(profile.head);},_filterNativeFrames:function()
{if(this.samples){for(var i=0;i<this.samples.length;++i){var node=this.nodeByIndex(i);while(isNativeNode(node))
node=node.parent;this.samples[i]=node.id;}}
processSubtree(this.profileHead);function isNativeNode(node)
{return!!node.url&&node.url.startsWith("native ");}
function processSubtree(node)
{var nativeChildren=[];var children=node.children;for(var i=0,j=0;i<children.length;++i){var child=children[i];if(isNativeNode(child)){nativeChildren.push(child);}else{children[j++]=child;processSubtree(child);}}
children.length=j;nativeChildren.forEach(mergeChildren.bind(null,node));}
function mergeChildren(node,nativeNode)
{node.hitCount+=nativeNode.hitCount;for(var i=0;i<nativeNode.children.length;++i){var child=nativeNode.children[i];if(isNativeNode(child)){mergeChildren(node,child);}else{node.children.push(child);child.parent=node;processSubtree(child);}}}},_assignParentsInProfile:function()
{var head=this.profileHead;head.parent=null;var nodesToTraverse=[head];while(nodesToTraverse.length){var parent=nodesToTraverse.pop();var children=parent.children;var length=children.length;for(var i=0;i<length;++i){var child=children[i];child.parent=parent;if(child.children.length)
nodesToTraverse.push(child);}}},_assignDepthsInProfile:function()
{var head=this.profileHead;head.depth=-1;this.maxDepth=0;var nodesToTraverse=[head];while(nodesToTraverse.length){var parent=nodesToTraverse.pop();var depth=parent.depth+1;if(depth>this.maxDepth)
this.maxDepth=depth;var children=parent.children;var length=children.length;for(var i=0;i<length;++i){var child=children[i];child.depth=depth;if(child.children.length)
nodesToTraverse.push(child);}}},_normalizeTimestamps:function()
{var timestamps=this.timestamps;if(!timestamps){var profileStartTime=this.profileStartTime;var interval=(this.profileEndTime-profileStartTime)/this.samples.length;timestamps=new Float64Array(this.samples.length+1);for(var i=0;i<timestamps.length;++i)
timestamps[i]=profileStartTime+i*interval;this.timestamps=timestamps;return;}
for(var i=0;i<timestamps.length;++i)
timestamps[i]/=1000;var averageSample=(timestamps.peekLast()-timestamps[0])/(timestamps.length-1);this.timestamps.push(timestamps.peekLast()+averageSample);this.profileStartTime=timestamps[0];this.profileEndTime=timestamps.peekLast();},_buildIdToNodeMap:function()
{this._idToNode={};var idToNode=this._idToNode;var stack=[this.profileHead];while(stack.length){var node=stack.pop();idToNode[node.id]=node;for(var i=0;i<node.children.length;i++)
stack.push(node.children[i]);}
var topLevelNodes=this.profileHead.children;for(var i=0;i<topLevelNodes.length&&!(this.gcNode&&this.programNode&&this.idleNode);i++){var node=topLevelNodes[i];if(node.functionName==="(garbage collector)")
this.gcNode=node;else if(node.functionName==="(program)")
this.programNode=node;else if(node.functionName==="(idle)")
this.idleNode=node;}},_fixMissingSamples:function()
{var samples=this.samples;var samplesCount=samples.length;if(!this.programNode||samplesCount<3)
return;var idToNode=this._idToNode;var programNodeId=this.programNode.id;var gcNodeId=this.gcNode?this.gcNode.id:-1;var idleNodeId=this.idleNode?this.idleNode.id:-1;var prevNodeId=samples[0];var nodeId=samples[1];for(var sampleIndex=1;sampleIndex<samplesCount-1;sampleIndex++){var nextNodeId=samples[sampleIndex+1];if(nodeId===programNodeId&&!isSystemNode(prevNodeId)&&!isSystemNode(nextNodeId)&&bottomNode(idToNode[prevNodeId])===bottomNode(idToNode[nextNodeId])){samples[sampleIndex]=prevNodeId;}
prevNodeId=nodeId;nodeId=nextNodeId;}
function bottomNode(node)
{while(node.parent)
node=node.parent;return node;}
function isSystemNode(nodeId)
{return nodeId===programNodeId||nodeId===gcNodeId||nodeId===idleNodeId;}},forEachFrame:function(openFrameCallback,closeFrameCallback,startTime,stopTime)
{if(!this.profileHead)
return;startTime=startTime||0;stopTime=stopTime||Infinity;var samples=this.samples;var timestamps=this.timestamps;var idToNode=this._idToNode;var gcNode=this.gcNode;var samplesCount=samples.length;var startIndex=timestamps.lowerBound(startTime);var stackTop=0;var stackNodes=[];var prevId=this.profileHead.id;var sampleTime=timestamps[samplesCount];var gcParentNode=null;if(!this._stackStartTimes)
this._stackStartTimes=new Float64Array(this.maxDepth+2);var stackStartTimes=this._stackStartTimes;if(!this._stackChildrenDuration)
this._stackChildrenDuration=new Float64Array(this.maxDepth+2);var stackChildrenDuration=this._stackChildrenDuration;for(var sampleIndex=startIndex;sampleIndex<samplesCount;sampleIndex++){sampleTime=timestamps[sampleIndex];if(sampleTime>=stopTime)
break;var id=samples[sampleIndex];if(id===prevId)
continue;var node=idToNode[id];var prevNode=idToNode[prevId];if(node===gcNode){gcParentNode=prevNode;openFrameCallback(gcParentNode.depth+1,gcNode,sampleTime);stackStartTimes[++stackTop]=sampleTime;stackChildrenDuration[stackTop]=0;prevId=id;continue;}
if(prevNode===gcNode){var start=stackStartTimes[stackTop];var duration=sampleTime-start;stackChildrenDuration[stackTop-1]+=duration;closeFrameCallback(gcParentNode.depth+1,gcNode,start,duration,duration-stackChildrenDuration[stackTop]);--stackTop;prevNode=gcParentNode;prevId=prevNode.id;gcParentNode=null;}
while(node.depth>prevNode.depth){stackNodes.push(node);node=node.parent;}
while(prevNode!==node){var start=stackStartTimes[stackTop];var duration=sampleTime-start;stackChildrenDuration[stackTop-1]+=duration;closeFrameCallback(prevNode.depth,prevNode,start,duration,duration-stackChildrenDuration[stackTop]);--stackTop;if(node.depth===prevNode.depth){stackNodes.push(node);node=node.parent;}
prevNode=prevNode.parent;}
while(stackNodes.length){node=stackNodes.pop();openFrameCallback(node.depth,node,sampleTime);stackStartTimes[++stackTop]=sampleTime;stackChildrenDuration[stackTop]=0;}
prevId=id;}
if(idToNode[prevId]===gcNode){var start=stackStartTimes[stackTop];var duration=sampleTime-start;stackChildrenDuration[stackTop-1]+=duration;closeFrameCallback(gcParentNode.depth+1,node,start,duration,duration-stackChildrenDuration[stackTop]);--stackTop;}
for(var node=idToNode[prevId];node.parent;node=node.parent){var start=stackStartTimes[stackTop];var duration=sampleTime-start;stackChildrenDuration[stackTop-1]+=duration;closeFrameCallback(node.depth,node,start,duration,duration-stackChildrenDuration[stackTop]);--stackTop;}},nodeByIndex:function(index)
{return this._idToNode[this.samples[index]];}};WebInspector.CPUProfilerModel=function(target)
{WebInspector.SDKModel.call(this,WebInspector.CPUProfilerModel,target);this._isRecording=false;target.registerProfilerDispatcher(this);target.profilerAgent().enable();this._configureCpuProfilerSamplingInterval();WebInspector.moduleSetting("highResolutionCpuProfiling").addChangeListener(this._configureCpuProfilerSamplingInterval,this);}
WebInspector.CPUProfilerModel.EventTypes={ConsoleProfileStarted:Symbol("ConsoleProfileStarted"),ConsoleProfileFinished:Symbol("ConsoleProfileFinished")};WebInspector.CPUProfilerModel.EventData;WebInspector.CPUProfilerModel.prototype={_configureCpuProfilerSamplingInterval:function()
{var intervalUs=WebInspector.moduleSetting("highResolutionCpuProfiling").get()?100:1000;this.target().profilerAgent().setSamplingInterval(intervalUs);},consoleProfileStarted:function(id,scriptLocation,title)
{this._dispatchProfileEvent(WebInspector.CPUProfilerModel.EventTypes.ConsoleProfileStarted,id,scriptLocation,title);},consoleProfileFinished:function(id,scriptLocation,cpuProfile,title)
{this._dispatchProfileEvent(WebInspector.CPUProfilerModel.EventTypes.ConsoleProfileFinished,id,scriptLocation,title,cpuProfile);},_dispatchProfileEvent:function(eventName,id,scriptLocation,title,cpuProfile)
{self.runtime.loadModulePromise("profiler").then(_=>{var debuggerModel=(WebInspector.DebuggerModel.fromTarget(this.target()));var debuggerLocation=WebInspector.DebuggerModel.Location.fromPayload(debuggerModel,scriptLocation);var globalId=this.target().id()+"."+id;var data=({id:globalId,scriptLocation:debuggerLocation,cpuProfile:cpuProfile,title:title});this.dispatchEventToListeners(eventName,data);});},isRecordingProfile:function()
{return this._isRecording;},startRecording:function()
{this._isRecording=true;this.target().profilerAgent().start();WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.ProfilesCPUProfileTaken);},stopRecording:function()
{function extractProfile(error,profile)
{return!error&&profile?profile:null;}
this._isRecording=false;return this.target().profilerAgent().stop(extractProfile);},dispose:function()
{WebInspector.moduleSetting("highResolutionCpuProfiling").removeChangeListener(this._configureCpuProfilerSamplingInterval,this);},__proto__:WebInspector.SDKModel.prototype};WebInspector.CSSMetadata=function(properties)
{this._values=([]);this._longhands={};this._shorthands={};for(var i=0;i<properties.length;++i){var property=properties[i];if(typeof property==="string"){this._values.push(property);continue;}
var propertyName=property.name;if(!CSS.supports(propertyName,"initial"))
continue;this._values.push(propertyName);var longhands=properties[i].longhands;if(longhands){this._longhands[propertyName]=longhands;for(var j=0;j<longhands.length;++j){var longhandName=longhands[j];var shorthands=this._shorthands[longhandName];if(!shorthands){shorthands=[];this._shorthands[longhandName]=shorthands;}
shorthands.push(propertyName);}}}
this._values.sort();}
WebInspector.CSSMetadata.cssPropertiesMetainfo=new WebInspector.CSSMetadata([]);WebInspector.CSSMetadata.isColorAwareProperty=function(propertyName)
{return!!WebInspector.CSSMetadata._colorAwareProperties[propertyName.toLowerCase()];}
WebInspector.CSSMetadata.isLengthProperty=function(propertyName)
{if(propertyName==="line-height")
return false;if(!WebInspector.CSSMetadata._distancePropertiesKeySet)
WebInspector.CSSMetadata._distancePropertiesKeySet=WebInspector.CSSMetadata._distanceProperties.keySet();return WebInspector.CSSMetadata._distancePropertiesKeySet[propertyName]||propertyName.startsWith("margin")||propertyName.startsWith("padding")||propertyName.indexOf("width")!==-1||propertyName.indexOf("height")!==-1;}
WebInspector.CSSMetadata.isBezierAwareProperty=function(propertyName)
{return!!WebInspector.CSSMetadata._bezierAwareProperties[propertyName.toLowerCase()];}
WebInspector.CSSMetadata.InheritedProperties=["azimuth","border-collapse","border-spacing","caption-side","color","cursor","direction","elevation","empty-cells","font-family","font-size","font-style","font-variant","font-weight","font","letter-spacing","line-height","list-style-image","list-style-position","list-style-type","list-style","orphans","overflow-wrap","pitch-range","pitch","quotes","resize","richness","speak-header","speak-numeral","speak-punctuation","speak","speech-rate","stress","text-align","text-indent","text-transform","text-shadow","-webkit-user-select","visibility","voice-family","volume","white-space","widows","word-spacing","word-wrap","zoom"].keySet();WebInspector.CSSMetadata.NonStandardInheritedProperties=["-webkit-font-smoothing"].keySet();WebInspector.CSSMetadata.canonicalPropertyName=function(name)
{if(!name||name.length<9||name.charAt(0)!=="-")
return name.toLowerCase();var match=name.match(/(?:-webkit-)(.+)/);var propertiesSet=WebInspector.CSSMetadata.cssPropertiesMetainfoKeySet();var hasSupportedProperties=WebInspector.CSSMetadata.cssPropertiesMetainfo._values.length>0;if(!match||(hasSupportedProperties&&!propertiesSet.hasOwnProperty(match[1].toLowerCase())))
return name.toLowerCase();return match[1].toLowerCase();}
WebInspector.CSSMetadata.isPropertyInherited=function(propertyName)
{return!!(WebInspector.CSSMetadata.InheritedProperties[WebInspector.CSSMetadata.canonicalPropertyName(propertyName)]||WebInspector.CSSMetadata.NonStandardInheritedProperties[propertyName.toLowerCase()]);}
WebInspector.CSSMetadata._distanceProperties=['background-position','border-spacing','bottom','font-size','height','left','letter-spacing','max-height','max-width','min-height','min-width','right','text-indent','top','width','word-spacing'];WebInspector.CSSMetadata._bezierAwareProperties=["animation","animation-timing-function","transition","transition-timing-function","-webkit-animation","-webkit-animation-timing-function","-webkit-transition","-webkit-transition-timing-function"].keySet();WebInspector.CSSMetadata._colorAwareProperties=["background","background-color","background-image","border","border-color","border-top","border-right","border-bottom","border-left","border-top-color","border-right-color","border-bottom-color","border-left-color","box-shadow","color","fill","outline","outline-color","stroke","text-shadow","-webkit-box-shadow","-webkit-column-rule-color","-webkit-text-decoration-color","-webkit-text-emphasis","-webkit-text-emphasis-color"].keySet();WebInspector.CSSMetadata._propertyDataMap={"table-layout":{values:["auto","fixed"]},"visibility":{values:["hidden","visible","collapse"]},"background-repeat":{values:["repeat","repeat-x","repeat-y","no-repeat","space","round"]},"content":{values:["list-item","close-quote","no-close-quote","no-open-quote","open-quote"]},"list-style-image":{values:["none"]},"clear":{values:["none","left","right","both"]},"overflow-x":{values:["hidden","auto","visible","overlay","scroll"]},"stroke-linejoin":{values:["round","miter","bevel"]},"baseline-shift":{values:["baseline","sub","super"]},"border-bottom-width":{values:["medium","thick","thin"]},"margin-top-collapse":{values:["collapse","separate","discard"]},"max-height":{values:["none"]},"box-orient":{values:["horizontal","vertical","inline-axis","block-axis"],},"font-stretch":{values:["normal","wider","narrower","ultra-condensed","extra-condensed","condensed","semi-condensed","semi-expanded","expanded","extra-expanded","ultra-expanded"]},"-webkit-background-composite":{values:["highlight","clear","copy","source-over","source-in","source-out","source-atop","destination-over","destination-in","destination-out","destination-atop","xor","plus-darker","plus-lighter"]},"border-left-width":{values:["medium","thick","thin"]},"box-shadow":{values:["inset","none"]},"writing-mode":{values:["horizontal-tb","vertical-rl","vertical-lr"]},"-webkit-writing-mode":{values:["lr","rl","tb","lr-tb","rl-tb","tb-rl","horizontal-tb","vertical-rl","vertical-lr","horizontal-bt"]},"border-collapse":{values:["collapse","separate"]},"page-break-inside":{values:["auto","avoid"]},"border-top-width":{values:["medium","thick","thin"]},"outline-color":{values:["invert"]},"outline-style":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"cursor":{values:["none","copy","auto","crosshair","default","pointer","move","vertical-text","cell","context-menu","alias","progress","no-drop","not-allowed","-webkit-zoom-in","-webkit-zoom-out","e-resize","ne-resize","nw-resize","n-resize","se-resize","sw-resize","s-resize","w-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","col-resize","row-resize","text","wait","help","all-scroll","-webkit-grab","-webkit-grabbing"]},"border-width":{values:["medium","thick","thin"]},"border-style":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"size":{values:["a3","a4","a5","b4","b5","landscape","ledger","legal","letter","portrait"]},"background-size":{values:["contain","cover"]},"direction":{values:["ltr","rtl"]},"enable-background":{values:["accumulate","new"]},"float":{values:["none","left","right"]},"overflow-y":{values:["hidden","auto","visible","overlay","scroll"]},"margin-bottom-collapse":{values:["collapse","separate","discard"]},"box-reflect":{values:["left","right","above","below"]},"overflow":{values:["hidden","auto","visible","overlay","scroll"]},"text-rendering":{values:["auto","optimizeSpeed","optimizeLegibility","geometricPrecision"]},"text-align":{values:["-webkit-auto","start","end","left","right","center","justify","-webkit-left","-webkit-right","-webkit-center"]},"list-style-position":{values:["outside","inside","hanging"]},"margin-bottom":{values:["auto"]},"color-interpolation":{values:["linearrgb"]},"background-origin":{values:["border-box","content-box","padding-box"]},"word-wrap":{values:["normal","break-word"]},"font-weight":{values:["normal","bold","bolder","lighter","100","200","300","400","500","600","700","800","900"]},"margin-before-collapse":{values:["collapse","separate","discard"]},"text-transform":{values:["none","capitalize","uppercase","lowercase"]},"border-right-style":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"border-left-style":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"-webkit-text-emphasis":{values:["circle","filled","open","dot","double-circle","triangle","sesame"]},"font-style":{values:["italic","oblique","normal"]},"speak":{values:["none","normal","spell-out","digits","literal-punctuation","no-punctuation"]},"color-rendering":{values:["auto","optimizeSpeed","optimizeQuality"]},"list-style-type":{values:["none","inline","disc","circle","square","decimal","decimal-leading-zero","arabic-indic","binary","bengali","cambodian","khmer","devanagari","gujarati","gurmukhi","kannada","lower-hexadecimal","lao","malayalam","mongolian","myanmar","octal","oriya","persian","urdu","telugu","tibetan","thai","upper-hexadecimal","lower-roman","upper-roman","lower-greek","lower-alpha","lower-latin","upper-alpha","upper-latin","afar","ethiopic-halehame-aa-et","ethiopic-halehame-aa-er","amharic","ethiopic-halehame-am-et","amharic-abegede","ethiopic-abegede-am-et","cjk-earthly-branch","cjk-heavenly-stem","ethiopic","ethiopic-halehame-gez","ethiopic-abegede","ethiopic-abegede-gez","hangul-consonant","hangul","lower-norwegian","oromo","ethiopic-halehame-om-et","sidama","ethiopic-halehame-sid-et","somali","ethiopic-halehame-so-et","tigre","ethiopic-halehame-tig","tigrinya-er","ethiopic-halehame-ti-er","tigrinya-er-abegede","ethiopic-abegede-ti-er","tigrinya-et","ethiopic-halehame-ti-et","tigrinya-et-abegede","ethiopic-abegede-ti-et","upper-greek","upper-norwegian","asterisks","footnotes","hebrew","armenian","lower-armenian","upper-armenian","georgian","cjk-ideographic","hiragana","katakana","hiragana-iroha","katakana-iroha"]},"text-combine-upright":{values:["none","all"]},"-webkit-text-combine":{values:["none","horizontal"]},"text-orientation":{values:["mixed","upright","sideways"]},"outline":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"font":{values:["caption","icon","menu","message-box","small-caption","-webkit-mini-control","-webkit-small-control","-webkit-control","status-bar","italic","oblique","small-caps","normal","bold","bolder","lighter","100","200","300","400","500","600","700","800","900","xx-small","x-small","small","medium","large","x-large","xx-large","-webkit-xxx-large","smaller","larger","serif","sans-serif","cursive","fantasy","monospace","-webkit-body","-webkit-pictograph"]},"dominant-baseline":{values:["middle","auto","central","text-before-edge","text-after-edge","ideographic","alphabetic","hanging","mathematical","use-script","no-change","reset-size"]},"display":{values:["none","inline","block","list-item","run-in","inline-block","table","inline-table","table-row-group","table-header-group","table-footer-group","table-row","table-column-group","table-column","table-cell","table-caption","-webkit-box","-webkit-inline-box","flex","inline-flex","grid","inline-grid"]},"-webkit-text-emphasis-position":{values:["over","under"]},"image-rendering":{values:["auto","optimizeSpeed","optimizeQuality","pixelated"]},"alignment-baseline":{values:["baseline","middle","auto","before-edge","after-edge","central","text-before-edge","text-after-edge","ideographic","alphabetic","hanging","mathematical"]},"outline-width":{values:["medium","thick","thin"]},"box-align":{values:["baseline","center","stretch","start","end"]},"border-right-width":{values:["medium","thick","thin"]},"border-top-style":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"line-height":{values:["normal"]},"text-overflow":{values:["clip","ellipsis"]},"overflow-wrap":{values:["normal","break-word"]},"box-direction":{values:["normal","reverse"]},"margin-after-collapse":{values:["collapse","separate","discard"]},"page-break-before":{values:["left","right","auto","always","avoid"]},"border-image":{values:["repeat","stretch"]},"text-decoration":{values:["blink","line-through","overline","underline"]},"position":{values:["absolute","fixed","relative","static"]},"font-family":{values:["serif","sans-serif","cursive","fantasy","monospace","-webkit-body","-webkit-pictograph"]},"text-overflow-mode":{values:["clip","ellipsis"]},"border-bottom-style":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"unicode-bidi":{values:["normal","bidi-override","embed","isolate","isolate-override","plaintext"]},"clip-rule":{values:["nonzero","evenodd"]},"margin-left":{values:["auto"]},"margin-top":{values:["auto"]},"zoom":{values:["normal","document","reset"]},"max-width":{values:["none"]},"caption-side":{values:["top","bottom"]},"empty-cells":{values:["hide","show"]},"pointer-events":{values:["none","all","auto","visible","visiblepainted","visiblefill","visiblestroke","painted","fill","stroke","bounding-box"]},"letter-spacing":{values:["normal"]},"background-clip":{values:["border-box","content-box","padding-box"]},"-webkit-font-smoothing":{values:["none","auto","antialiased","subpixel-antialiased"]},"border":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"font-size":{values:["xx-small","x-small","small","medium","large","x-large","xx-large","-webkit-xxx-large","smaller","larger"]},"font-variant":{values:["small-caps","normal"]},"vertical-align":{values:["baseline","middle","sub","super","text-top","text-bottom","top","bottom","-webkit-baseline-middle"]},"white-space":{values:["normal","nowrap","pre","pre-line","pre-wrap"]},"box-lines":{values:["single","multiple"]},"page-break-after":{values:["left","right","auto","always","avoid"]},"clip-path":{values:["none"]},"margin":{values:["auto"]},"margin-right":{values:["auto"]},"word-break":{values:["normal","break-all","break-word"]},"word-spacing":{values:["normal"]},"-webkit-text-emphasis-style":{values:["circle","filled","open","dot","double-circle","triangle","sesame"]},"transform":{values:["scale","scaleX","scaleY","scale3d","rotate","rotateX","rotateY","rotateZ","rotate3d","skew","skewX","skewY","translate","translateX","translateY","translateZ","translate3d","matrix","matrix3d","perspective"]},"image-resolution":{values:["from-image","snap"]},"box-sizing":{values:["content-box","border-box"]},"clip":{values:["auto"]},"resize":{values:["none","both","horizontal","vertical"]},"align-content":{values:["flex-start","flex-end","center","space-between","space-around","stretch"]},"align-items":{values:["flex-start","flex-end","center","baseline","stretch"]},"align-self":{values:["auto","flex-start","flex-end","center","baseline","stretch"]},"flex-direction":{values:["row","row-reverse","column","column-reverse"]},"justify-content":{values:["flex-start","flex-end","center","space-between","space-around"]},"flex-wrap":{values:["nowrap","wrap","wrap-reverse"]},"perspective":{values:["none"]},"perspective-origin":{values:["left","center","right","top","bottom"]},"transform-origin":{values:["left","center","right","top","bottom"]},"transform-style":{values:["flat","preserve-3d"]},"transition-timing-function":{values:["ease","linear","ease-in","ease-out","ease-in-out","step-start","step-end","steps","cubic-bezier"]},"animation-timing-function":{values:["ease","linear","ease-in","ease-out","ease-in-out","step-start","step-end","steps","cubic-bezier"]},"animation-direction":{values:["normal","reverse","alternate","alternate-reverse"]},"animation-play-state":{values:["running","paused"]},"animation-fill-mode":{values:["none","forwards","backwards","both"]},"-webkit-backface-visibility":{values:["visible","hidden"]},"-webkit-box-decoration-break":{values:["slice","clone"]},"-webkit-column-break-after":{values:["auto","always","avoid","left","right","page","column","avoid-page","avoid-column"]},"-webkit-column-break-before":{values:["auto","always","avoid","left","right","page","column","avoid-page","avoid-column"]},"-webkit-column-break-inside":{values:["auto","avoid","avoid-page","avoid-column"]},"-webkit-column-span":{values:["none","all"]},"-webkit-column-count":{values:["auto"]},"-webkit-column-gap":{values:["normal"]},"-webkit-filter":{values:["url","blur","brightness","contrast","drop-shadow","grayscale","hue-rotate","invert","opacity","saturate","sepia"]},"-webkit-line-break":{values:["auto","loose","normal","strict"]},"text-align-last":{values:["auto","start","end","left","right","center","justify"]},"-webkit-text-decoration-line":{values:["none","underline","overline","line-through","blink"]},"-webkit-text-decoration-style":{values:["solid","double","dotted","dashed","wavy"]},"-webkit-text-decoration-skip":{values:["none","objects","spaces","ink","edges","box-decoration"]},"mix-blend-mode":{values:["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity","unset"]},"background-blend-mode":{values:["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity","unset"]},}
WebInspector.CSSMetadata.keywordsForProperty=function(propertyName)
{var acceptedKeywords=["inherit","initial"];var descriptor=WebInspector.CSSMetadata.descriptor(propertyName);if(descriptor&&descriptor.values)
acceptedKeywords.push.apply(acceptedKeywords,descriptor.values);if(WebInspector.CSSMetadata.isColorAwareProperty(propertyName)){acceptedKeywords.push("currentColor");for(var color in WebInspector.Color.Nicknames)
acceptedKeywords.push(color);}
return new WebInspector.CSSMetadata(acceptedKeywords);}
WebInspector.CSSMetadata.descriptor=function(propertyName)
{if(!propertyName)
return null;var unprefixedName=propertyName.replace(/^-webkit-/,"");propertyName=propertyName.toLowerCase();var entry=WebInspector.CSSMetadata._propertyDataMap[propertyName];if(!entry&&unprefixedName!==propertyName)
entry=WebInspector.CSSMetadata._propertyDataMap[unprefixedName];return entry||null;}
WebInspector.CSSMetadata.initializeWithSupportedProperties=function(properties)
{WebInspector.CSSMetadata.cssPropertiesMetainfo=new WebInspector.CSSMetadata(properties);}
WebInspector.CSSMetadata.cssPropertiesMetainfoKeySet=function()
{if(!WebInspector.CSSMetadata._cssPropertiesMetainfoKeySet)
WebInspector.CSSMetadata._cssPropertiesMetainfoKeySet=WebInspector.CSSMetadata.cssPropertiesMetainfo.keySet();return WebInspector.CSSMetadata._cssPropertiesMetainfoKeySet;}
WebInspector.CSSMetadata.Weight={"align-content":57,"align-items":129,"align-self":55,"animation":175,"animation-delay":114,"animation-direction":113,"animation-duration":137,"animation-fill-mode":132,"animation-iteration-count":124,"animation-name":139,"animation-play-state":104,"animation-timing-function":141,"backface-visibility":123,"background":260,"background-attachment":119,"background-clip":165,"background-color":259,"background-image":246,"background-origin":107,"background-position":237,"background-position-x":108,"background-position-y":93,"background-repeat":234,"background-size":203,"border":263,"border-bottom":233,"border-bottom-color":190,"border-bottom-left-radius":186,"border-bottom-right-radius":185,"border-bottom-style":150,"border-bottom-width":179,"border-collapse":209,"border-color":226,"border-image":89,"border-image-outset":50,"border-image-repeat":49,"border-image-slice":58,"border-image-source":32,"border-image-width":52,"border-left":221,"border-left-color":174,"border-left-style":142,"border-left-width":172,"border-radius":224,"border-right":223,"border-right-color":182,"border-right-style":130,"border-right-width":178,"border-spacing":198,"border-style":206,"border-top":231,"border-top-color":192,"border-top-left-radius":187,"border-top-right-radius":189,"border-top-style":152,"border-top-width":180,"border-width":214,"bottom":227,"box-shadow":213,"box-sizing":216,"caption-side":96,"clear":229,"clip":173,"clip-rule":5,"color":256,"content":219,"counter-increment":111,"counter-reset":110,"cursor":250,"direction":176,"display":262,"empty-cells":99,"fill":140,"fill-opacity":82,"fill-rule":22,"filter":160,"flex":133,"flex-basis":66,"flex-direction":85,"flex-flow":94,"flex-grow":112,"flex-shrink":61,"flex-wrap":68,"float":252,"font":211,"font-family":254,"font-kerning":18,"font-size":264,"font-stretch":77,"font-style":220,"font-variant":161,"font-weight":257,"height":266,"image-rendering":90,"justify-content":127,"left":248,"letter-spacing":188,"line-height":244,"list-style":215,"list-style-image":145,"list-style-position":149,"list-style-type":199,"margin":267,"margin-bottom":241,"margin-left":243,"margin-right":238,"margin-top":253,"mask":20,"max-height":205,"max-width":225,"min-height":217,"min-width":218,"object-fit":33,"opacity":251,"order":117,"orphans":146,"outline":222,"outline-color":153,"outline-offset":147,"outline-style":151,"outline-width":148,"overflow":255,"overflow-wrap":105,"overflow-x":184,"overflow-y":196,"padding":265,"padding-bottom":230,"padding-left":235,"padding-right":232,"padding-top":240,"page":8,"page-break-after":120,"page-break-before":69,"page-break-inside":121,"perspective":92,"perspective-origin":103,"pointer-events":183,"position":261,"quotes":158,"resize":168,"right":245,"shape-rendering":38,"size":64,"speak":118,"src":170,"stop-color":42,"stop-opacity":31,"stroke":98,"stroke-dasharray":36,"stroke-dashoffset":3,"stroke-linecap":30,"stroke-linejoin":21,"stroke-miterlimit":12,"stroke-opacity":34,"stroke-width":87,"table-layout":171,"tab-size":46,"text-align":260,"text-anchor":35,"text-decoration":247,"text-indent":207,"text-overflow":204,"text-rendering":155,"text-shadow":208,"text-transform":202,"top":258,"touch-action":80,"transform":181,"transform-origin":162,"transform-style":86,"transition":193,"transition-delay":134,"transition-duration":135,"transition-property":131,"transition-timing-function":122,"unicode-bidi":156,"unicode-range":136,"vertical-align":236,"visibility":242,"-webkit-appearance":191,"-webkit-backface-visibility":154,"-webkit-background-clip":164,"-webkit-background-origin":40,"-webkit-background-size":163,"-webkit-border-end":9,"-webkit-border-horizontal-spacing":81,"-webkit-border-image":75,"-webkit-border-radius":212,"-webkit-border-start":10,"-webkit-border-start-color":16,"-webkit-border-start-width":13,"-webkit-border-vertical-spacing":43,"-webkit-box-align":101,"-webkit-box-direction":51,"-webkit-box-flex":128,"-webkit-box-lines":2,"-webkit-box-ordinal-group":91,"-webkit-box-orient":144,"-webkit-box-pack":106,"-webkit-box-reflect":39,"-webkit-box-shadow":210,"-webkit-column-break-inside":60,"-webkit-column-count":84,"-webkit-column-gap":76,"-webkit-column-rule":25,"-webkit-column-rule-color":23,"-webkit-columns":44,"-webkit-column-span":29,"-webkit-column-width":47,"-webkit-filter":159,"-webkit-font-feature-settings":59,"-webkit-font-smoothing":177,"-webkit-highlight":1,"-webkit-line-break":45,"-webkit-line-clamp":126,"-webkit-margin-after":67,"-webkit-margin-before":70,"-webkit-margin-collapse":14,"-webkit-margin-end":65,"-webkit-margin-start":100,"-webkit-margin-top-collapse":78,"-webkit-mask":19,"-webkit-mask-box-image":72,"-webkit-mask-image":88,"-webkit-mask-position":54,"-webkit-mask-repeat":63,"-webkit-mask-size":79,"-webkit-padding-after":15,"-webkit-padding-before":28,"-webkit-padding-end":48,"-webkit-padding-start":73,"-webkit-print-color-adjust":83,"-webkit-rtl-ordering":7,"-webkit-tap-highlight-color":169,"-webkit-text-emphasis-color":11,"-webkit-text-fill-color":71,"-webkit-text-security":17,"-webkit-text-stroke":56,"-webkit-text-stroke-color":37,"-webkit-text-stroke-width":53,"-webkit-user-drag":95,"-webkit-user-modify":62,"-webkit-user-select":194,"-webkit-writing-mode":4,"white-space":228,"widows":115,"width":268,"will-change":74,"word-break":166,"word-spacing":157,"word-wrap":197,"writing-mode":41,"z-index":239,"zoom":200};WebInspector.CSSMetadata.prototype={startsWith:function(prefix)
{var firstIndex=this._firstIndexOfPrefix(prefix);if(firstIndex===-1)
return[];var results=[];while(firstIndex<this._values.length&&this._values[firstIndex].startsWith(prefix))
results.push(this._values[firstIndex++]);return results;},mostUsedOf:function(properties)
{var maxWeight=0;var index=0;for(var i=0;i<properties.length;i++){var weight=WebInspector.CSSMetadata.Weight[properties[i]];if(!weight)
weight=WebInspector.CSSMetadata.Weight[WebInspector.CSSMetadata.canonicalPropertyName(properties[i])];if(weight>maxWeight){maxWeight=weight;index=i;}}
return index;},_firstIndexOfPrefix:function(prefix)
{if(!this._values.length)
return-1;if(!prefix)
return 0;var maxIndex=this._values.length-1;var minIndex=0;var foundIndex;do{var middleIndex=(maxIndex+minIndex)>>1;if(this._values[middleIndex].startsWith(prefix)){foundIndex=middleIndex;break;}
if(this._values[middleIndex]<prefix)
minIndex=middleIndex+1;else
maxIndex=middleIndex-1;}while(minIndex<=maxIndex);if(foundIndex===undefined)
return-1;while(foundIndex&&this._values[foundIndex-1].startsWith(prefix))
foundIndex--;return foundIndex;},keySet:function()
{if(!this._keySet)
this._keySet=this._values.keySet();return this._keySet;},next:function(str,prefix)
{return this._closest(str,prefix,1);},previous:function(str,prefix)
{return this._closest(str,prefix,-1);},_closest:function(str,prefix,shift)
{if(!str)
return"";var index=this._values.indexOf(str);if(index===-1)
return"";if(!prefix){index=(index+this._values.length+shift)%this._values.length;return this._values[index];}
var propertiesWithPrefix=this.startsWith(prefix);var j=propertiesWithPrefix.indexOf(str);j=(j+propertiesWithPrefix.length+shift)%propertiesWithPrefix.length;return propertiesWithPrefix[j];},longhands:function(shorthand)
{return this._longhands[shorthand];},shorthands:function(longhand)
{return this._shorthands[longhand];}}
WebInspector.CSSMetadata.initializeWithSupportedProperties([]);;WebInspector.CSSParser=function()
{this._worker=new WorkerRuntime.Worker("script_formatter_worker");this._worker.onmessage=this._onRuleChunk.bind(this);this._rules=[];}
WebInspector.CSSParser.Events={RulesParsed:"RulesParsed"}
WebInspector.CSSParser.prototype={fetchAndParse:function(styleSheetHeader,callback)
{this._lock();this._finishedCallback=callback;styleSheetHeader.requestContent(this._innerParse.bind(this));},parse:function(text,callback)
{this._lock();this._finishedCallback=callback;this._innerParse(text);},parsePromise:function(text)
{return new Promise(promiseConstructor.bind(this));function promiseConstructor(succ,fail)
{this.parse(text,succ);}},dispose:function()
{if(this._worker){this._worker.terminate();delete this._worker;}},rules:function()
{return this._rules;},_lock:function()
{console.assert(!this._parsingStyleSheet,"Received request to parse stylesheet before previous was completed.");this._parsingStyleSheet=true;},_unlock:function()
{delete this._parsingStyleSheet;},_innerParse:function(text)
{this._rules=[];this._worker.postMessage({method:"parseCSS",params:{content:text}});},_onRuleChunk:function(event)
{var data=(event.data);var chunk=data.chunk;for(var i=0;i<chunk.length;++i)
this._rules.push(chunk[i]);if(data.isLastChunk)
this._onFinishedParsing();this.dispatchEventToListeners(WebInspector.CSSParser.Events.RulesParsed);},_onFinishedParsing:function()
{this._unlock();if(this._finishedCallback)
this._finishedCallback(this._rules);},__proto__:WebInspector.Object.prototype,}
WebInspector.CSSParser.DataChunk;WebInspector.CSSParser.StyleRule;WebInspector.CSSParser.AtRule;WebInspector.CSSParser.Rule;WebInspector.CSSParser.Range;WebInspector.CSSParser.Property=function()
{this.name;this.nameRange;this.value;this.valueRange;this.range;this.disabled;};WebInspector.CSSStyleModel=function(target)
{WebInspector.SDKModel.call(this,WebInspector.CSSStyleModel,target);this._domModel=WebInspector.DOMModel.fromTarget(target);this._agent=target.cssAgent();this._styleLoader=new WebInspector.CSSStyleModel.ComputedStyleLoader(this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._mainFrameNavigated,this);target.registerCSSDispatcher(new WebInspector.CSSDispatcher(this));this._agent.enable().then(this._wasEnabled.bind(this));this._styleSheetIdToHeader=new Map();this._styleSheetIdsForURL=new Map();}
WebInspector.CSSStyleModel.parseRuleMatchArrayPayload=function(cssModel,matchArray)
{if(!matchArray)
return[];var result=[];for(var i=0;i<matchArray.length;++i)
result.push(new WebInspector.CSSRule(cssModel,matchArray[i].rule,matchArray[i].matchingSelectors));return result;}
WebInspector.CSSStyleModel.Events={LayoutEditorChange:"LayoutEditorChange",MediaQueryResultChanged:"MediaQueryResultChanged",ModelWasEnabled:"ModelWasEnabled",PseudoStateForced:"PseudoStateForced",StyleSheetAdded:"StyleSheetAdded",StyleSheetChanged:"StyleSheetChanged",StyleSheetRemoved:"StyleSheetRemoved"}
WebInspector.CSSStyleModel.MediaTypes=["all","braille","embossed","handheld","print","projection","screen","speech","tty","tv"];WebInspector.CSSStyleModel.PseudoStateMarker="pseudo-state-marker";WebInspector.CSSStyleModel.prototype={mediaQueriesPromise:function()
{function parsePayload(error,payload)
{return!error&&payload?WebInspector.CSSMedia.parseMediaArrayPayload(this,payload):[];}
return this._agent.getMediaQueries(parsePayload.bind(this));},isEnabled:function()
{return this._isEnabled;},_wasEnabled:function(error)
{if(error){console.error("Failed to enabled CSS agent: "+error);return;}
this._isEnabled=true;this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.ModelWasEnabled);},matchedStylesPromise:function(nodeId)
{function callback(error,inlinePayload,attributesPayload,matchedPayload,pseudoPayload,inheritedPayload)
{if(error)
return null;var node=this._domModel.nodeForId(nodeId);if(!node)
return null;return new WebInspector.CSSStyleModel.MatchedStyleResult(this,node,inlinePayload,attributesPayload,matchedPayload,pseudoPayload,inheritedPayload);}
return this._agent.getMatchedStylesForNode(nodeId,callback.bind(this));},computedStylePromise:function(nodeId)
{return this._styleLoader.computedStylePromise(nodeId);},backgroundColorsPromise:function(nodeId)
{function backgroundColorsCallback(error,backgroundColors){return!error&&backgroundColors?backgroundColors:null;}
return this._agent.getBackgroundColors(nodeId,backgroundColorsCallback);},platformFontsPromise:function(nodeId)
{function platformFontsCallback(error,fonts)
{return!error&&fonts?fonts:null;}
return this._agent.getPlatformFontsForNode(nodeId,platformFontsCallback);},allStyleSheets:function()
{var values=this._styleSheetIdToHeader.valuesArray();function styleSheetComparator(a,b)
{if(a.sourceURL<b.sourceURL)
return-1;else if(a.sourceURL>b.sourceURL)
return 1;return a.startLine-b.startLine||a.startColumn-b.startColumn;}
values.sort(styleSheetComparator);return values;},inlineStylesPromise:function(nodeId)
{function callback(error,inlinePayload,attributesStylePayload)
{if(error||!inlinePayload)
return null;var inlineStyle=inlinePayload?new WebInspector.CSSStyleDeclaration(this,null,inlinePayload,WebInspector.CSSStyleDeclaration.Type.Inline):null;var attributesStyle=attributesStylePayload?new WebInspector.CSSStyleDeclaration(this,null,attributesStylePayload,WebInspector.CSSStyleDeclaration.Type.Attributes):null;return new WebInspector.CSSStyleModel.InlineStyleResult(inlineStyle,attributesStyle);}
return this._agent.getInlineStylesForNode(nodeId,callback.bind(this));},forcePseudoState:function(node,pseudoClass,enable)
{var pseudoClasses=node.marker(WebInspector.CSSStyleModel.PseudoStateMarker)||[];if(enable){if(pseudoClasses.indexOf(pseudoClass)>=0)
return false;pseudoClasses.push(pseudoClass);node.setMarker(WebInspector.CSSStyleModel.PseudoStateMarker,pseudoClasses);}else{if(pseudoClasses.indexOf(pseudoClass)<0)
return false;pseudoClasses.remove(pseudoClass);if(!pseudoClasses.length)
node.setMarker(WebInspector.CSSStyleModel.PseudoStateMarker,null);}
this._agent.forcePseudoState(node.id,pseudoClasses);this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.PseudoStateForced,{node:node,pseudoClass:pseudoClass,enable:enable});return true;},pseudoState:function(node)
{return node.marker(WebInspector.CSSStyleModel.PseudoStateMarker)||[];},setMediaText:function(media,newMediaText,userCallback)
{function parsePayload(error,mediaPayload)
{if(!mediaPayload)
return null;this._domModel.markUndoableState();this._fireStyleSheetChanged(media.parentStyleSheetId);return WebInspector.CSSMedia.parsePayload(this,mediaPayload);}
console.assert(!!media.parentStyleSheetId);WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.StyleRuleEdited);this._agent.setMediaText(media.parentStyleSheetId,media.range,newMediaText,parsePayload.bind(this)).catchException(null).then(userCallback);},_computeMatchingSelectors:function(nodeId,selectors)
{var ownerDocumentId=this._ownerDocumentId(nodeId);if(!ownerDocumentId||!selectors)
return Promise.resolve((null));var matchingSelectors=[];var allSelectorsBarrier=new CallbackBarrier();for(var i=0;i<selectors.length;++i){var boundCallback=allSelectorsBarrier.createCallback(selectorQueried.bind(null,i,nodeId,matchingSelectors));this._domModel.querySelectorAll(ownerDocumentId,selectors[i].text,boundCallback);}
return new Promise(promiseConstructor);function promiseConstructor(resolve)
{allSelectorsBarrier.callWhenDone(function(){resolve(matchingSelectors);});}
function selectorQueried(index,nodeId,matchingSelectors,matchingNodeIds)
{if(!matchingNodeIds)
return;if(matchingNodeIds.indexOf(nodeId)!==-1)
matchingSelectors.push(index);}},addRule:function(styleSheetId,node,ruleText,ruleLocation,userCallback)
{this._agent.addRule(styleSheetId,ruleText,ruleLocation,parsePayload.bind(this)).then(onRuleParsed.bind(this)).catchException(null).then(userCallback);function parsePayload(error,rulePayload)
{if(error||!rulePayload)
return null;this._domModel.markUndoableState();this._fireStyleSheetChanged(styleSheetId);return new WebInspector.CSSRule(this,rulePayload);}
function onRuleParsed(rule)
{if(!rule)
return Promise.resolve((null));return this._computeMatchingSelectors(node.id,rule.selectors).then(updateMatchingSelectors.bind(null,rule));}
function updateMatchingSelectors(rule,matchingSelectors)
{if(!matchingSelectors)
return null;rule.matchingSelectors=matchingSelectors;return rule;}},requestViaInspectorStylesheet:function(node,userCallback)
{var frameId=node.frameId()||this.target().resourceTreeModel.mainFrame.id;var headers=this._styleSheetIdToHeader.valuesArray();for(var i=0;i<headers.length;++i){var styleSheetHeader=headers[i];if(styleSheetHeader.frameId===frameId&&styleSheetHeader.isViaInspector()){userCallback(styleSheetHeader);return;}}
function innerCallback(error,styleSheetId)
{return!error&&styleSheetId?this._styleSheetIdToHeader.get(styleSheetId)||null:null;}
this._agent.createStyleSheet(frameId,innerCallback.bind(this)).catchException(null).then(userCallback)},mediaQueryResultChanged:function()
{this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged);},styleSheetHeaderForId:function(id)
{return this._styleSheetIdToHeader.get(id)||null;},styleSheetHeaders:function()
{return this._styleSheetIdToHeader.valuesArray();},_ownerDocumentId:function(nodeId)
{var node=this._domModel.nodeForId(nodeId);if(!node)
return null;return node.ownerDocument?node.ownerDocument.id:null;},_fireStyleSheetChanged:function(styleSheetId)
{this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetChanged,{styleSheetId:styleSheetId});},_styleSheetAdded:function(header)
{console.assert(!this._styleSheetIdToHeader.get(header.styleSheetId));var styleSheetHeader=new WebInspector.CSSStyleSheetHeader(this,header);this._styleSheetIdToHeader.set(header.styleSheetId,styleSheetHeader);var url=styleSheetHeader.resourceURL();if(!this._styleSheetIdsForURL.get(url))
this._styleSheetIdsForURL.set(url,{});var frameIdToStyleSheetIds=this._styleSheetIdsForURL.get(url);var styleSheetIds=frameIdToStyleSheetIds[styleSheetHeader.frameId];if(!styleSheetIds){styleSheetIds=[];frameIdToStyleSheetIds[styleSheetHeader.frameId]=styleSheetIds;}
styleSheetIds.push(styleSheetHeader.id);this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetAdded,styleSheetHeader);},_styleSheetRemoved:function(id)
{var header=this._styleSheetIdToHeader.get(id);console.assert(header);if(!header)
return;this._styleSheetIdToHeader.remove(id);var url=header.resourceURL();var frameIdToStyleSheetIds=(this._styleSheetIdsForURL.get(url));console.assert(frameIdToStyleSheetIds,"No frameId to styleSheetId map is available for given style sheet URL.");frameIdToStyleSheetIds[header.frameId].remove(id);if(!frameIdToStyleSheetIds[header.frameId].length){delete frameIdToStyleSheetIds[header.frameId];if(!Object.keys(frameIdToStyleSheetIds).length)
this._styleSheetIdsForURL.remove(url);}
this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,header);},styleSheetIdsForURL:function(url)
{var frameIdToStyleSheetIds=this._styleSheetIdsForURL.get(url);if(!frameIdToStyleSheetIds)
return[];var result=[];for(var frameId in frameIdToStyleSheetIds)
result=result.concat(frameIdToStyleSheetIds[frameId]);return result;},setStyleSheetText:function(styleSheetId,newText,majorChange)
{var header=this._styleSheetIdToHeader.get(styleSheetId);console.assert(header);return header._setContentPromise(newText).then(callback.bind(this));function callback(error)
{if(error)
return error;if(majorChange)
this._domModel.markUndoableState();this._fireStyleSheetChanged(styleSheetId);return null;}},_mainFrameNavigated:function()
{this._resetStyleSheets();},_resetStyleSheets:function()
{var headers=this._styleSheetIdToHeader.valuesArray();this._styleSheetIdsForURL.clear();this._styleSheetIdToHeader.clear();for(var i=0;i<headers.length;++i)
this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,headers[i]);},suspendModel:function()
{this._isEnabled=false;return this._agent.disable().then(this._resetStyleSheets.bind(this));},resumeModel:function()
{return this._agent.enable().then(this._wasEnabled.bind(this));},_layoutEditorChange:function(id,range)
{this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.LayoutEditorChange,{id:id,range:range});},setEffectivePropertyValueForNode:function(nodeId,name,value)
{this._agent.setEffectivePropertyValueForNode(nodeId,name,value);},__proto__:WebInspector.SDKModel.prototype}
WebInspector.CSSLocation=function(header,lineNumber,columnNumber)
{WebInspector.SDKObject.call(this,header.target());this._header=header;this.styleSheetId=header.id;this.url=header.resourceURL();this.lineNumber=lineNumber;this.columnNumber=columnNumber||0;}
WebInspector.CSSLocation.prototype={cssModel:function()
{return this._header.cssModel();},header:function()
{return this._header;},__proto__:WebInspector.SDKObject.prototype}
WebInspector.CSSStyleDeclaration=function(cssModel,parentRule,payload,type)
{this._cssModel=cssModel;this.parentRule=parentRule;this._reinitialize(payload);this.type=type;}
WebInspector.CSSStyleDeclaration.Type={Regular:"Regular",Inline:"Inline",Attributes:"Attributes"}
WebInspector.CSSStyleDeclaration.prototype={_reinitialize:function(payload)
{this.styleSheetId=payload.styleSheetId;this.range=payload.range?WebInspector.TextRange.fromObject(payload.range):null;var shorthandEntries=payload.shorthandEntries;this._shorthandValues=new Map();this._shorthandIsImportant=new Set();for(var i=0;i<shorthandEntries.length;++i){this._shorthandValues.set(shorthandEntries[i].name,shorthandEntries[i].value);if(shorthandEntries[i].important)
this._shorthandIsImportant.add(shorthandEntries[i].name);}
this._allProperties=[];for(var i=0;i<payload.cssProperties.length;++i){var property=WebInspector.CSSProperty.parsePayload(this,i,payload.cssProperties[i]);this._allProperties.push(property);}
this._generateSyntheticPropertiesIfNeeded();this._computeInactiveProperties();this._activePropertyMap=new Map();for(var property of this._allProperties){if(!property.activeInStyle())
continue;this._activePropertyMap.set(property.name,property);}
this.cssText=payload.cssText;this._leadingProperties=null;},_generateSyntheticPropertiesIfNeeded:function()
{if(this.range)
return;if(!this._shorthandValues.size)
return;var propertiesSet=new Set();for(var property of this._allProperties)
propertiesSet.add(property.name);var generatedProperties=[];for(var property of this._allProperties){var shorthands=WebInspector.CSSMetadata.cssPropertiesMetainfo.shorthands(property.name)||[];for(var shorthand of shorthands){if(propertiesSet.has(shorthand))
continue;var shorthandValue=this._shorthandValues.get(shorthand);if(!shorthandValue)
continue;var shorthandImportance=!!this._shorthandIsImportant.has(shorthand);var shorthandProperty=new WebInspector.CSSProperty(this,this.allProperties.length,shorthand,shorthandValue,shorthandImportance,false,true,false);generatedProperties.push(shorthandProperty);propertiesSet.add(shorthand);}}
this._allProperties=this._allProperties.concat(generatedProperties);},_computeLeadingProperties:function()
{function propertyHasRange(property)
{return!!property.range;}
if(this.range)
return this._allProperties.filter(propertyHasRange);var leadingProperties=[];for(var property of this._allProperties){var shorthands=WebInspector.CSSMetadata.cssPropertiesMetainfo.shorthands(property.name)||[];var belongToAnyShorthand=false;for(var shorthand of shorthands){if(this._shorthandValues.get(shorthand)){belongToAnyShorthand=true;break;}}
if(!belongToAnyShorthand)
leadingProperties.push(property);}
return leadingProperties;},leadingProperties:function()
{if(!this._leadingProperties)
this._leadingProperties=this._computeLeadingProperties();return this._leadingProperties;},target:function()
{return this._cssModel.target();},cssModel:function()
{return this._cssModel;},sourceStyleSheetEdited:function(styleSheetId,oldRange,newRange)
{if(this.styleSheetId!==styleSheetId)
return;if(this.range)
this.range=this.range.rebaseAfterTextEdit(oldRange,newRange);for(var i=0;i<this._allProperties.length;++i)
this._allProperties[i].sourceStyleSheetEdited(styleSheetId,oldRange,newRange);},_computeInactiveProperties:function()
{var activeProperties={};for(var i=0;i<this._allProperties.length;++i){var property=this._allProperties[i];if(property.disabled||!property.parsedOk){property._setActive(false);continue;}
var canonicalName=WebInspector.CSSMetadata.canonicalPropertyName(property.name);var activeProperty=activeProperties[canonicalName];if(!activeProperty){activeProperties[canonicalName]=property;}else if(!activeProperty.important||property.important){activeProperty._setActive(false);activeProperties[canonicalName]=property;}else{property._setActive(false);}}},get allProperties()
{return this._allProperties;},getPropertyValue:function(name)
{var property=this._activePropertyMap.get(name);return property?property.value:"";},isPropertyImplicit:function(name)
{var property=this._activePropertyMap.get(name);return property?property.implicit:"";},longhandProperties:function(name)
{var longhands=WebInspector.CSSMetadata.cssPropertiesMetainfo.longhands(name);var result=[];for(var i=0;longhands&&i<longhands.length;++i){var property=this._activePropertyMap.get(longhands[i]);if(property)
result.push(property);}
return result;},propertyAt:function(index)
{return(index<this.allProperties.length)?this.allProperties[index]:null;},pastLastSourcePropertyIndex:function()
{for(var i=this.allProperties.length-1;i>=0;--i){if(this.allProperties[i].range)
return i+1;}
return 0;},_insertionRange:function(index)
{var property=this.propertyAt(index);return property&&property.range?property.range.collapseToStart():this.range.collapseToEnd();},newBlankProperty:function(index)
{index=(typeof index==="undefined")?this.pastLastSourcePropertyIndex():index;var property=new WebInspector.CSSProperty(this,index,"","",false,false,true,false,"",this._insertionRange(index));return property;},setText:function(text,majorChange)
{if(!this.styleSheetId)
return Promise.resolve(false);function parsePayload(error,stylePayload)
{if(error||!stylePayload)
return false;if(majorChange)
this._cssModel._domModel.markUndoableState();this._reinitialize(stylePayload);this._cssModel._fireStyleSheetChanged(this.styleSheetId);return true;}
return this._cssModel._agent.setStyleText(this.styleSheetId,this.range.serializeToObject(),text,parsePayload.bind(this)).catchException(false);},insertPropertyAt:function(index,name,value,userCallback)
{this.newBlankProperty(index).setText(name+": "+value+";",false,true).then(userCallback);},appendProperty:function(name,value,userCallback)
{this.insertPropertyAt(this.allProperties.length,name,value,userCallback);}}
WebInspector.CSSRuleSelector=function(payload)
{this.text=payload.text;if(payload.range)
this.range=WebInspector.TextRange.fromObject(payload.range);}
WebInspector.CSSRuleSelector.parseSelectorListPayload=function(selectorList)
{var selectors=[];for(var i=0;i<selectorList.selectors.length;++i){var selectorPayload=selectorList.selectors[i];selectors.push(new WebInspector.CSSRuleSelector(selectorPayload));}
return selectors;}
WebInspector.CSSRuleSelector.prototype={sourceStyleRuleEdited:function(oldRange,newRange)
{if(!this.range)
return;this.range=this.range.rebaseAfterTextEdit(oldRange,newRange);}}
WebInspector.CSSRule=function(cssModel,payload,matchingSelectors)
{this._cssModel=cssModel;this.styleSheetId=payload.styleSheetId;if(matchingSelectors)
this.matchingSelectors=matchingSelectors;this.selectors=WebInspector.CSSRuleSelector.parseSelectorListPayload(payload.selectorList);if(this.styleSheetId){var styleSheetHeader=cssModel.styleSheetHeaderForId(this.styleSheetId);this.sourceURL=styleSheetHeader.sourceURL;}
this.origin=payload.origin;this.style=new WebInspector.CSSStyleDeclaration(this._cssModel,this,payload.style,WebInspector.CSSStyleDeclaration.Type.Regular);if(payload.media)
this.media=WebInspector.CSSMedia.parseMediaArrayPayload(cssModel,payload.media);}
WebInspector.CSSRule.createDummyRule=function(cssModel,selectorText)
{var dummyPayload={selectorList:{selectors:[{text:selectorText}],},style:{styleSheetId:"0",range:new WebInspector.TextRange(0,0,0,0),shorthandEntries:[],cssProperties:[]}};return new WebInspector.CSSRule(cssModel,(dummyPayload));}
WebInspector.CSSRule.prototype={setSelectorText:function(nodeId,newSelector,userCallback)
{function callback(error,selectorPayload)
{if(error||!selectorPayload)
return null;this._cssModel._domModel.markUndoableState();this._cssModel._fireStyleSheetChanged((this.styleSheetId));return WebInspector.CSSRuleSelector.parseSelectorListPayload(selectorPayload);}
if(!this.styleSheetId)
throw"No rule stylesheet id";var range=this.selectorRange();if(!range)
throw"Rule selector is not editable";WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.StyleRuleEdited);this._cssModel._agent.setRuleSelector(this.styleSheetId,range,newSelector,callback.bind(this)).then(onNewSelectors.bind(this)).catchException(false).then(userCallback);function onNewSelectors(selectors)
{if(!selectors)
return Promise.resolve(false);return this._cssModel._computeMatchingSelectors(nodeId,selectors).then(onMatchingSelectors.bind(this,selectors));}
function onMatchingSelectors(selectors,matchingSelectors)
{if(!matchingSelectors)
return false;this.selectors=selectors;this.matchingSelectors=matchingSelectors;return true;}},selectorText:function()
{return this.selectors.select("text").join(", ");},selectorRange:function()
{var firstRange=this.selectors[0].range;if(!firstRange)
return null;var lastRange=this.selectors.peekLast().range;return new WebInspector.TextRange(firstRange.startLine,firstRange.startColumn,lastRange.endLine,lastRange.endColumn);},sourceStyleSheetEdited:function(styleSheetId,oldRange,newRange)
{this._sourceStyleSheetEditedWithMedia(styleSheetId,oldRange,newRange,null,null);},_sourceStyleSheetEditedWithMedia:function(styleSheetId,oldRange,newRange,oldMedia,newMedia)
{if(this.styleSheetId===styleSheetId){for(var i=0;i<this.selectors.length;++i)
this.selectors[i].sourceStyleRuleEdited(oldRange,newRange);}
if(this.media){for(var i=0;i<this.media.length;++i){if(oldMedia&&newMedia&&oldMedia.equal(this.media[i])){this.media[i]=newMedia;}else{this.media[i].sourceStyleSheetEdited(styleSheetId,oldRange,newRange);}}}
this.style.sourceStyleSheetEdited(styleSheetId,oldRange,newRange);},mediaEdited:function(oldMedia,newMedia)
{this._sourceStyleSheetEditedWithMedia((oldMedia.parentStyleSheetId),oldMedia.range,newMedia.range,oldMedia,newMedia);},resourceURL:function()
{if(!this.styleSheetId)
return"";var styleSheetHeader=this._cssModel.styleSheetHeaderForId(this.styleSheetId);return styleSheetHeader.resourceURL();},lineNumberInSource:function(selectorIndex)
{var selector=this.selectors[selectorIndex];if(!selector||!selector.range||!this.styleSheetId)
return 0;var styleSheetHeader=this._cssModel.styleSheetHeaderForId(this.styleSheetId);return styleSheetHeader.lineNumberInSource(selector.range.startLine);},columnNumberInSource:function(selectorIndex)
{var selector=this.selectors[selectorIndex];if(!selector||!selector.range||!this.styleSheetId)
return undefined;var styleSheetHeader=this._cssModel.styleSheetHeaderForId(this.styleSheetId);console.assert(styleSheetHeader);return styleSheetHeader.columnNumberInSource(selector.range.startLine,selector.range.startColumn);},isUserAgent:function()
{return this.origin===CSSAgent.StyleSheetOrigin.UserAgent;},isInjected:function()
{return this.origin===CSSAgent.StyleSheetOrigin.Injected;},isViaInspector:function()
{return this.origin===CSSAgent.StyleSheetOrigin.Inspector;},isRegular:function()
{return this.origin===CSSAgent.StyleSheetOrigin.Regular;}}
WebInspector.CSSProperty=function(ownerStyle,index,name,value,important,disabled,parsedOk,implicit,text,range)
{this.ownerStyle=ownerStyle;this.index=index;this.name=name;this.value=value;this.important=important;this.disabled=disabled;this.parsedOk=parsedOk;this.implicit=implicit;this.text=text;this.range=range?WebInspector.TextRange.fromObject(range):null;this._active=true;}
WebInspector.CSSProperty.parsePayload=function(ownerStyle,index,payload)
{var result=new WebInspector.CSSProperty(ownerStyle,index,payload.name,payload.value,payload.important||false,payload.disabled||false,("parsedOk"in payload)?!!payload.parsedOk:true,!!payload.implicit,payload.text,payload.range);return result;}
WebInspector.CSSProperty.prototype={sourceStyleSheetEdited:function(styleSheetId,oldRange,newRange)
{if(this.ownerStyle.styleSheetId!==styleSheetId)
return;if(this.range)
this.range=this.range.rebaseAfterTextEdit(oldRange,newRange);},_setActive:function(active)
{this._active=active;},get propertyText()
{if(this.text!==undefined)
return this.text;if(this.name==="")
return"";return this.name+": "+this.value+(this.important?" !important":"")+";";},activeInStyle:function()
{return this._active;},setText:function(propertyText,majorChange,overwrite)
{if(!this.ownerStyle)
return Promise.reject(new Error("No ownerStyle for property"));if(!this.ownerStyle.styleSheetId)
return Promise.reject(new Error("No owner style id"));if(!this.range||!this.ownerStyle.range)
return Promise.reject(new Error("Style not editable"));if(majorChange)
WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.StyleRuleEdited);if(overwrite&&propertyText===this.propertyText){if(majorChange)
this.ownerStyle._cssModel._domModel.markUndoableState();return Promise.resolve(true);}
var range=this.range.relativeTo(this.ownerStyle.range.startLine,this.ownerStyle.range.startColumn);var indentation=this.ownerStyle.cssText?this._detectIndentation(this.ownerStyle.cssText):WebInspector.moduleSetting("textEditorIndent").get();var endIndentation=this.ownerStyle.cssText?indentation.substring(0,this.ownerStyle.range.endColumn):"";var newStyleText=range.replaceInText(this.ownerStyle.cssText||"",String.sprintf(";%s;",propertyText));return self.runtime.instancePromise(WebInspector.TokenizerFactory).then(this._formatStyle.bind(this,newStyleText,indentation,endIndentation)).then(setStyleText.bind(this));function setStyleText(styleText)
{return this.ownerStyle.setText(styleText,majorChange);}},_formatStyle:function(styleText,indentation,endIndentation,tokenizerFactory)
{if(indentation)
indentation="\n"+indentation;var result="";var propertyText;var insideProperty=false;var tokenize=tokenizerFactory.createTokenizer("text/css");tokenize("*{"+styleText+"}",processToken);if(insideProperty)
result+=propertyText;result=result.substring(2,result.length-1).trimRight();return result+(indentation?"\n"+endIndentation:"");function processToken(token,tokenType,column,newColumn)
{if(!insideProperty){var isDisabledProperty=tokenType&&tokenType.includes("css-comment")&&token.includes(":");var isPropertyStart=tokenType&&(tokenType.includes("css-meta")||tokenType.includes("css-property")||tokenType.includes("css-variable-2"));if(isDisabledProperty){result=result.trimRight()+indentation+token;}else if(isPropertyStart){insideProperty=true;propertyText=token;}else if(token!==";"){result+=token;}
return;}
if(token==="}"||token===";"){result=result.trimRight()+indentation+propertyText.trim()+";";insideProperty=false;if(token==="}")
result+="}";}else{propertyText+=token;}}},_detectIndentation:function(text)
{var lines=text.split("\n");if(lines.length<2)
return"";return WebInspector.TextUtils.lineIndent(lines[1]);},setValue:function(newValue,majorChange,overwrite,userCallback)
{var text=this.name+": "+newValue+(this.important?" !important":"")+";";this.setText(text,majorChange,overwrite).then(userCallback);},setDisabled:function(disabled)
{if(!this.ownerStyle)
return Promise.resolve(false);if(disabled===this.disabled)
return Promise.resolve(true);var propertyText=this.text.trim();var text=disabled?"/* "+propertyText+" */":this.text.substring(2,propertyText.length-2).trim();return this.setText(text,true,true);}}
WebInspector.CSSMediaQuery=function(payload)
{this._active=payload.active;this._expressions=[];for(var j=0;j<payload.expressions.length;++j)
this._expressions.push(WebInspector.CSSMediaQueryExpression.parsePayload(payload.expressions[j]));}
WebInspector.CSSMediaQuery.parsePayload=function(payload)
{return new WebInspector.CSSMediaQuery(payload);}
WebInspector.CSSMediaQuery.prototype={active:function()
{return this._active;},expressions:function()
{return this._expressions;}}
WebInspector.CSSMediaQueryExpression=function(payload)
{this._value=payload.value;this._unit=payload.unit;this._feature=payload.feature;this._valueRange=payload.valueRange?WebInspector.TextRange.fromObject(payload.valueRange):null;this._computedLength=payload.computedLength||null;}
WebInspector.CSSMediaQueryExpression.parsePayload=function(payload)
{return new WebInspector.CSSMediaQueryExpression(payload);}
WebInspector.CSSMediaQueryExpression.prototype={value:function()
{return this._value;},unit:function()
{return this._unit;},feature:function()
{return this._feature;},valueRange:function()
{return this._valueRange;},computedLength:function()
{return this._computedLength;}}
WebInspector.CSSMedia=function(cssModel,payload)
{this._cssModel=cssModel;this.text=payload.text;this.source=payload.source;this.sourceURL=payload.sourceURL||"";this.range=payload.range?WebInspector.TextRange.fromObject(payload.range):null;this.parentStyleSheetId=payload.parentStyleSheetId;this.mediaList=null;if(payload.mediaList){this.mediaList=[];for(var i=0;i<payload.mediaList.length;++i)
this.mediaList.push(WebInspector.CSSMediaQuery.parsePayload(payload.mediaList[i]));}}
WebInspector.CSSMedia.Source={LINKED_SHEET:"linkedSheet",INLINE_SHEET:"inlineSheet",MEDIA_RULE:"mediaRule",IMPORT_RULE:"importRule"};WebInspector.CSSMedia.parsePayload=function(cssModel,payload)
{return new WebInspector.CSSMedia(cssModel,payload);}
WebInspector.CSSMedia.parseMediaArrayPayload=function(cssModel,payload)
{var result=[];for(var i=0;i<payload.length;++i)
result.push(WebInspector.CSSMedia.parsePayload(cssModel,payload[i]));return result;}
WebInspector.CSSMedia.prototype={sourceStyleSheetEdited:function(styleSheetId,oldRange,newRange)
{if(this.parentStyleSheetId!==styleSheetId)
return;if(this.range)
this.range=this.range.rebaseAfterTextEdit(oldRange,newRange);},equal:function(other)
{if(!this.parentStyleSheetId||!this.range||!other.range)
return false;return this.parentStyleSheetId===other.parentStyleSheetId&&this.range.equal(other.range);},active:function()
{if(!this.mediaList)
return true;for(var i=0;i<this.mediaList.length;++i){if(this.mediaList[i].active())
return true;}
return false;},lineNumberInSource:function()
{if(!this.range)
return undefined;var header=this.header();if(!header)
return undefined;return header.lineNumberInSource(this.range.startLine);},columnNumberInSource:function()
{if(!this.range)
return undefined;var header=this.header();if(!header)
return undefined;return header.columnNumberInSource(this.range.startLine,this.range.startColumn);},header:function()
{return this.parentStyleSheetId?this._cssModel.styleSheetHeaderForId(this.parentStyleSheetId):null;},rawLocation:function()
{var header=this.header();if(!header||this.lineNumberInSource()===undefined)
return null;var lineNumber=Number(this.lineNumberInSource());return new WebInspector.CSSLocation(header,lineNumber,this.columnNumberInSource());}}
WebInspector.CSSStyleSheetHeader=function(cssModel,payload)
{this._cssModel=cssModel;this.id=payload.styleSheetId;this.frameId=payload.frameId;this.sourceURL=payload.sourceURL;this.hasSourceURL=!!payload.hasSourceURL;this.sourceMapURL=payload.sourceMapURL;this.origin=payload.origin;this.title=payload.title;this.disabled=payload.disabled;this.isInline=payload.isInline;this.startLine=payload.startLine;this.startColumn=payload.startColumn;if(payload.ownerNode)
this.ownerNode=new WebInspector.DeferredDOMNode(cssModel.target(),payload.ownerNode);}
WebInspector.CSSStyleSheetHeader.prototype={target:function()
{return this._cssModel.target();},cssModel:function()
{return this._cssModel;},resourceURL:function()
{return this.isViaInspector()?this._viaInspectorResourceURL():this.sourceURL;},_viaInspectorResourceURL:function()
{var frame=this._cssModel.target().resourceTreeModel.frameForId(this.frameId);console.assert(frame);var parsedURL=new WebInspector.ParsedURL(frame.url);var fakeURL="inspector://"+parsedURL.host+parsedURL.folderPathComponents;if(!fakeURL.endsWith("/"))
fakeURL+="/";fakeURL+="inspector-stylesheet";return fakeURL;},lineNumberInSource:function(lineNumberInStyleSheet)
{return this.startLine+lineNumberInStyleSheet;},columnNumberInSource:function(lineNumberInStyleSheet,columnNumberInStyleSheet)
{return(lineNumberInStyleSheet?0:this.startColumn)+columnNumberInStyleSheet;},contentURL:function()
{return this.resourceURL();},contentType:function()
{return WebInspector.resourceTypes.Stylesheet;},_trimSourceURL:function(text)
{var sourceURLIndex=text.lastIndexOf("/*# sourceURL=");if(sourceURLIndex===-1)
return text;var sourceURLLineIndex=text.lastIndexOf("\n",sourceURLIndex);if(sourceURLLineIndex===-1)
return text;var sourceURLLine=text.substr(sourceURLLineIndex+1).split("\n",1)[0];var sourceURLRegex=/[\040\t]*\/\*# sourceURL=[\040\t]*([^\s]*)[\040\t]*\*\/[\040\t]*$/;if(sourceURLLine.search(sourceURLRegex)===-1)
return text;return text.substr(0,sourceURLLineIndex)+text.substr(sourceURLLineIndex+sourceURLLine.length+1);},requestContent:function(userCallback)
{this._cssModel._agent.getStyleSheetText(this.id,textCallback.bind(this)).catchException("").then(userCallback)
function textCallback(error,text)
{if(error||text===null){WebInspector.console.error("Failed to get text for stylesheet "+this.id+": "+error)
text="";}
return this._trimSourceURL(text);}},searchInContent:function(query,caseSensitive,isRegex,callback)
{function performSearch(content)
{callback(WebInspector.ContentProvider.performSearchInContent(content,query,caseSensitive,isRegex));}
this.requestContent(performSearch);},_setContentPromise:function(newText)
{newText=this._trimSourceURL(newText);if(this.hasSourceURL)
newText+="\n/*# sourceURL="+this.sourceURL+" */";return this._cssModel._agent.setStyleSheetText(this.id,newText,callback.bind(this));function callback(error,sourceMapURL)
{this.sourceMapURL=sourceMapURL;return error||null;}},setContent:function(newText,callback)
{this._setContentPromise(newText).catchException(null).then(callback);},isViaInspector:function()
{return this.origin==="inspector";}}
WebInspector.CSSDispatcher=function(cssModel)
{this._cssModel=cssModel;}
WebInspector.CSSDispatcher.prototype={mediaQueryResultChanged:function()
{this._cssModel.mediaQueryResultChanged();},styleSheetChanged:function(styleSheetId)
{this._cssModel._fireStyleSheetChanged(styleSheetId);},styleSheetAdded:function(header)
{this._cssModel._styleSheetAdded(header);},styleSheetRemoved:function(id)
{this._cssModel._styleSheetRemoved(id);},layoutEditorChange:function(id,range)
{this._cssModel._layoutEditorChange(id,range);},}
WebInspector.CSSStyleModel.ComputedStyleLoader=function(cssModel)
{this._cssModel=cssModel;this._nodeIdToPromise=new Map();}
WebInspector.CSSStyleModel.ComputedStyleLoader.prototype={computedStylePromise:function(nodeId)
{if(!this._nodeIdToPromise[nodeId])
this._nodeIdToPromise[nodeId]=this._cssModel._agent.getComputedStyleForNode(nodeId,parsePayload).then(cleanUp.bind(this));return this._nodeIdToPromise[nodeId];function parsePayload(error,computedPayload)
{if(error||!computedPayload||!computedPayload.length)
return null;var result=new Map();for(var property of computedPayload)
result.set(property.name,property.value);return result;}
function cleanUp(computedStyle)
{delete this._nodeIdToPromise[nodeId];return computedStyle;}}}
WebInspector.CSSStyleModel.fromTarget=function(target)
{if(!target.isPage())
return null;return(target.model(WebInspector.CSSStyleModel));}
WebInspector.CSSStyleModel.fromNode=function(node)
{return(WebInspector.CSSStyleModel.fromTarget(node.target()));}
WebInspector.CSSStyleModel.MatchedStyleResult=function(cssModel,node,inlinePayload,attributesPayload,matchedPayload,pseudoPayload,inheritedPayload)
{this._cssModel=cssModel;this._node=node;this._nodeStyles=[];this._nodeForStyle=new Map();this._inheritedStyles=new Set();function addAttributesStyle()
{if(!attributesPayload)
return;var style=new WebInspector.CSSStyleDeclaration(cssModel,null,attributesPayload,WebInspector.CSSStyleDeclaration.Type.Attributes);this._nodeForStyle.set(style,this._node);this._nodeStyles.push(style);}
if(inlinePayload&&this._node.nodeType()===Node.ELEMENT_NODE){var style=new WebInspector.CSSStyleDeclaration(cssModel,null,inlinePayload,WebInspector.CSSStyleDeclaration.Type.Inline);this._nodeForStyle.set(style,this._node);this._nodeStyles.push(style);}
var addedAttributesStyle;var matchedRules=WebInspector.CSSStyleModel.parseRuleMatchArrayPayload(cssModel,matchedPayload);for(var i=matchedRules.length-1;i>=0;--i){var rule=matchedRules[i];if((rule.isInjected()||rule.isUserAgent())&&!addedAttributesStyle){addedAttributesStyle=true;addAttributesStyle.call(this);}
this._nodeForStyle.set(rule.style,this._node);this._nodeStyles.push(rule.style);}
if(!addedAttributesStyle)
addAttributesStyle.call(this);var parentNode=this._node.parentNode;for(var i=0;inheritedPayload&&i<inheritedPayload.length;++i){var entryPayload=inheritedPayload[i];var inheritedInlineStyle=entryPayload.inlineStyle?new WebInspector.CSSStyleDeclaration(cssModel,null,entryPayload.inlineStyle,WebInspector.CSSStyleDeclaration.Type.Inline):null;var inheritedMatchedCSSRules=entryPayload.matchedCSSRules?WebInspector.CSSStyleModel.parseRuleMatchArrayPayload(cssModel,entryPayload.matchedCSSRules):null;if(inheritedInlineStyle&&this._containsInherited(inheritedInlineStyle)){this._nodeForStyle.set(inheritedInlineStyle,parentNode);this._nodeStyles.push(inheritedInlineStyle);this._inheritedStyles.add(inheritedInlineStyle);}
for(var j=inheritedMatchedCSSRules.length-1;j>=0;--j){var inheritedRule=inheritedMatchedCSSRules[j];if(!this._containsInherited(inheritedRule.style))
continue;this._nodeForStyle.set(inheritedRule.style,parentNode);this._nodeStyles.push(inheritedRule.style);this._inheritedStyles.add(inheritedRule.style);}
parentNode=parentNode.parentNode;}
this._pseudoStyles=new Map();if(pseudoPayload){for(var i=0;i<pseudoPayload.length;++i){var entryPayload=pseudoPayload[i];var pseudoElement=this._node.pseudoElements().get(entryPayload.pseudoType);var pseudoStyles=[];var rules=WebInspector.CSSStyleModel.parseRuleMatchArrayPayload(cssModel,entryPayload.matches);for(var j=rules.length-1;j>=0;--j){var pseudoRule=rules[j];pseudoStyles.push(pseudoRule.style);this._nodeForStyle.set(pseudoRule.style,pseudoElement);}
this._pseudoStyles.set(entryPayload.pseudoType,pseudoStyles);}}
this.resetActiveProperties();}
WebInspector.CSSStyleModel.MatchedStyleResult.prototype={node:function()
{return this._node;},hasMatchingSelectors:function(style)
{return style.parentRule?style.parentRule.matchingSelectors&&style.parentRule.matchingSelectors.length>0&&this.mediaMatches(style):true;},mediaMatches:function(style)
{var media=style.parentRule?style.parentRule.media:[];for(var i=0;media&&i<media.length;++i){if(!media[i].active())
return false;}
return true;},nodeStyles:function()
{return this._nodeStyles;},pseudoStyles:function()
{return this._pseudoStyles;},_containsInherited:function(style)
{var properties=style.allProperties;for(var i=0;i<properties.length;++i){var property=properties[i];if(property.activeInStyle()&&WebInspector.CSSMetadata.isPropertyInherited(property.name))
return true;}
return false;},nodeForStyle:function(style)
{return this._nodeForStyle.get(style)||null;},isInherited:function(style)
{return this._inheritedStyles.has(style);},propertyState:function(property)
{if(this._propertiesState.size===0){this._computeActiveProperties(this._nodeStyles,this._propertiesState);for(var pseudoElementStyles of this._pseudoStyles.valuesArray())
this._computeActiveProperties(pseudoElementStyles,this._propertiesState);}
return this._propertiesState.get(property)||null;},resetActiveProperties:function()
{this._propertiesState=new Map();},_computeActiveProperties:function(styles,result)
{var foundImportantProperties=new Set();var propertyToEffectiveRule=new Map();var inheritedPropertyToNode=new Map();var allUsedProperties=new Set();for(var i=0;i<styles.length;++i){var style=styles[i];if(!this.hasMatchingSelectors(style))
continue;var styleActiveProperties=new Map();var allProperties=style.allProperties;for(var j=0;j<allProperties.length;++j){var property=allProperties[j];var inherited=this.isInherited(style);if(inherited&&!WebInspector.CSSMetadata.isPropertyInherited(property.name))
continue;if(!property.activeInStyle()){result.set(property,WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded);continue;}
var canonicalName=WebInspector.CSSMetadata.canonicalPropertyName(property.name);if(foundImportantProperties.has(canonicalName)){result.set(property,WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded);continue;}
if(!property.important&&allUsedProperties.has(canonicalName)){result.set(property,WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded);continue;}
var isKnownProperty=propertyToEffectiveRule.has(canonicalName);var inheritedFromNode=inherited?this.nodeForStyle(style):null;if(!isKnownProperty&&inheritedFromNode&&!inheritedPropertyToNode.has(canonicalName))
inheritedPropertyToNode.set(canonicalName,inheritedFromNode);if(property.important){if(inherited&&isKnownProperty&&inheritedFromNode!==inheritedPropertyToNode.get(canonicalName)){result.set(property,WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded);continue;}
foundImportantProperties.add(canonicalName);if(isKnownProperty){var overloaded=(propertyToEffectiveRule.get(canonicalName).get(canonicalName));result.set(overloaded,WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded);propertyToEffectiveRule.get(canonicalName).delete(canonicalName);}}
styleActiveProperties.set(canonicalName,property);allUsedProperties.add(canonicalName);propertyToEffectiveRule.set(canonicalName,styleActiveProperties);result.set(property,WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Active);}
for(var property of style.leadingProperties()){var canonicalName=WebInspector.CSSMetadata.canonicalPropertyName(property.name);if(!styleActiveProperties.has(canonicalName))
continue;var longhands=style.longhandProperties(property.name);if(!longhands.length)
continue;var notUsed=true;for(var longhand of longhands){var longhandCanonicalName=WebInspector.CSSMetadata.canonicalPropertyName(longhand.name);notUsed=notUsed&&!styleActiveProperties.has(longhandCanonicalName);}
if(!notUsed)
continue;styleActiveProperties.delete(canonicalName);allUsedProperties.delete(canonicalName);result.set(property,WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded);}}}}
WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState={Active:"Active",Overloaded:"Overloaded"}
WebInspector.CSSStyleModel.InlineStyleResult=function(inlineStyle,attributesStyle)
{this.inlineStyle=inlineStyle;this.attributesStyle=attributesStyle;};WebInspector.DOMNode=function(domModel,doc,isInShadowTree,payload)
{WebInspector.SDKObject.call(this,domModel.target());this._domModel=domModel;this._agent=domModel._agent;this.ownerDocument=doc;this._isInShadowTree=isInShadowTree;this.id=payload.nodeId;domModel._idToDOMNode[this.id]=this;this._nodeType=payload.nodeType;this._nodeName=payload.nodeName;this._localName=payload.localName;this._nodeValue=payload.nodeValue;this._pseudoType=payload.pseudoType;this._shadowRootType=payload.shadowRootType;this._frameId=payload.frameId||null;this._xmlVersion=payload.xmlVersion;this._shadowRoots=[];this._attributes=[];this._attributesMap={};if(payload.attributes)
this._setAttributesPayload(payload.attributes);this._markers={};this._subtreeMarkerCount=0;this._childNodeCount=payload.childNodeCount||0;this._children=null;this.nextSibling=null;this.previousSibling=null;this.firstChild=null;this.lastChild=null;this.parentNode=null;if(payload.shadowRoots){for(var i=0;i<payload.shadowRoots.length;++i){var root=payload.shadowRoots[i];var node=new WebInspector.DOMNode(this._domModel,this.ownerDocument,true,root);this._shadowRoots.push(node);node.parentNode=this;}}
if(payload.templateContent){this._templateContent=new WebInspector.DOMNode(this._domModel,this.ownerDocument,true,payload.templateContent);this._templateContent.parentNode=this;}
if(payload.importedDocument){this._importedDocument=new WebInspector.DOMNode(this._domModel,this.ownerDocument,true,payload.importedDocument);this._importedDocument.parentNode=this;}
if(payload.distributedNodes)
this._setDistributedNodePayloads(payload.distributedNodes);if(payload.children)
this._setChildrenPayload(payload.children);this._setPseudoElements(payload.pseudoElements);if(payload.contentDocument){this._contentDocument=new WebInspector.DOMDocument(domModel,payload.contentDocument);this._children=[this._contentDocument];this._renumber();}
if(this._nodeType===Node.ELEMENT_NODE){if(this.ownerDocument&&!this.ownerDocument.documentElement&&this._nodeName==="HTML")
this.ownerDocument.documentElement=this;if(this.ownerDocument&&!this.ownerDocument.body&&this._nodeName==="BODY")
this.ownerDocument.body=this;}else if(this._nodeType===Node.DOCUMENT_TYPE_NODE){this.publicId=payload.publicId;this.systemId=payload.systemId;this.internalSubset=payload.internalSubset;}else if(this._nodeType===Node.ATTRIBUTE_NODE){this.name=payload.name;this.value=payload.value;}}
WebInspector.DOMNode.PseudoElementNames={Before:"before",After:"after"}
WebInspector.DOMNode.ShadowRootTypes={UserAgent:"user-agent",Open:"open",Closed:"closed"}
WebInspector.DOMNode.prototype={domModel:function()
{return this._domModel;},children:function()
{return this._children?this._children.slice():null;},hasAttributes:function()
{return this._attributes.length>0;},childNodeCount:function()
{return this._childNodeCount;},hasShadowRoots:function()
{return!!this._shadowRoots.length;},shadowRoots:function()
{return this._shadowRoots.slice();},templateContent:function()
{return this._templateContent||null;},importedDocument:function()
{return this._importedDocument||null;},nodeType:function()
{return this._nodeType;},nodeName:function()
{return this._nodeName;},pseudoType:function()
{return this._pseudoType;},hasPseudoElements:function()
{return this._pseudoElements.size>0;},pseudoElements:function()
{return this._pseudoElements;},beforePseudoElement:function()
{if(!this._pseudoElements)
return null;return this._pseudoElements.get(WebInspector.DOMNode.PseudoElementNames.Before);},afterPseudoElement:function()
{if(!this._pseudoElements)
return null;return this._pseudoElements.get(WebInspector.DOMNode.PseudoElementNames.After);},isInsertionPoint:function()
{return!this.isXMLNode()&&(this._nodeName==="SHADOW"||this._nodeName==="CONTENT");},distributedNodes:function()
{return this._distributedNodes||[];},isInShadowTree:function()
{return this._isInShadowTree;},ancestorShadowHost:function()
{var ancestorShadowRoot=this.ancestorShadowRoot();return ancestorShadowRoot?ancestorShadowRoot.parentNode:null;},ancestorShadowRoot:function()
{if(!this._isInShadowTree)
return null;var current=this;while(current&&!current.isShadowRoot())
current=current.parentNode;return current;},ancestorUserAgentShadowRoot:function()
{var ancestorShadowRoot=this.ancestorShadowRoot();if(!ancestorShadowRoot)
return null;return ancestorShadowRoot.shadowRootType()===WebInspector.DOMNode.ShadowRootTypes.UserAgent?ancestorShadowRoot:null;},isShadowRoot:function()
{return!!this._shadowRootType;},shadowRootType:function()
{return this._shadowRootType||null;},nodeNameInCorrectCase:function()
{var shadowRootType=this.shadowRootType();if(shadowRootType)
return"#shadow-root ("+shadowRootType+")";return this.isXMLNode()?this.nodeName():this.nodeName().toLowerCase();},setNodeName:function(name,callback)
{this._agent.setNodeName(this.id,name,this._domModel._markRevision(this,callback));},localName:function()
{return this._localName;},nodeValue:function()
{return this._nodeValue;},setNodeValue:function(value,callback)
{this._agent.setNodeValue(this.id,value,this._domModel._markRevision(this,callback));},getAttribute:function(name)
{var attr=this._attributesMap[name];return attr?attr.value:undefined;},setAttribute:function(name,text,callback)
{this._agent.setAttributesAsText(this.id,text,name,this._domModel._markRevision(this,callback));},setAttributeValue:function(name,value,callback)
{this._agent.setAttributeValue(this.id,name,value,this._domModel._markRevision(this,callback));},attributes:function()
{return this._attributes;},removeAttribute:function(name,callback)
{function mycallback(error)
{if(!error){delete this._attributesMap[name];for(var i=0;i<this._attributes.length;++i){if(this._attributes[i].name===name){this._attributes.splice(i,1);break;}}}
this._domModel._markRevision(this,callback)(error);}
this._agent.removeAttribute(this.id,name,mycallback.bind(this));},getChildNodes:function(callback)
{if(this._children){if(callback)
callback(this.children());return;}
function mycallback(error)
{if(callback)
callback(error?null:this.children());}
this._agent.requestChildNodes(this.id,undefined,mycallback.bind(this));},getSubtree:function(depth,callback)
{function mycallback(error)
{if(callback)
callback(error?null:this._children);}
this._agent.requestChildNodes(this.id,depth,mycallback.bind(this));},getOuterHTML:function(callback)
{this._agent.getOuterHTML(this.id,callback);},setOuterHTML:function(html,callback)
{this._agent.setOuterHTML(this.id,html,this._domModel._markRevision(this,callback));},removeNode:function(callback)
{this._agent.removeNode(this.id,this._domModel._markRevision(this,callback));},copyNode:function(callback)
{function copy(error,text)
{if(!error)
InspectorFrontendHost.copyText(text);if(callback)
callback(error?null:text);}
this._agent.getOuterHTML(this.id,copy);},path:function()
{function canPush(node)
{return node&&("index"in node||(node.isShadowRoot()&&node.parentNode))&&node._nodeName.length;}
var path=[];var node=this;while(canPush(node)){var index=typeof node.index==="number"?node.index:(node.shadowRootType()===WebInspector.DOMNode.ShadowRootTypes.UserAgent?"u":"a");path.push([index,node._nodeName]);node=node.parentNode;}
path.reverse();return path.join(",");},isAncestor:function(node)
{if(!node)
return false;var currentNode=node.parentNode;while(currentNode){if(this===currentNode)
return true;currentNode=currentNode.parentNode;}
return false;},isDescendant:function(descendant)
{return descendant!==null&&descendant.isAncestor(this);},frameId:function()
{var node=this;while(!node._frameId&&node.parentNode)
node=node.parentNode;return node._frameId;},_setAttributesPayload:function(attrs)
{var attributesChanged=!this._attributes||attrs.length!==this._attributes.length*2;var oldAttributesMap=this._attributesMap||{};this._attributes=[];this._attributesMap={};for(var i=0;i<attrs.length;i+=2){var name=attrs[i];var value=attrs[i+1];this._addAttribute(name,value);if(attributesChanged)
continue;if(!oldAttributesMap[name]||oldAttributesMap[name].value!==value)
attributesChanged=true;}
return attributesChanged;},_insertChild:function(prev,payload)
{var node=new WebInspector.DOMNode(this._domModel,this.ownerDocument,this._isInShadowTree,payload);this._children.splice(this._children.indexOf(prev)+1,0,node);this._renumber();return node;},_removeChild:function(node)
{if(node.pseudoType()){this._pseudoElements.delete(node.pseudoType());}else{var shadowRootIndex=this._shadowRoots.indexOf(node);if(shadowRootIndex!==-1){this._shadowRoots.splice(shadowRootIndex,1);}else{console.assert(this._children.indexOf(node)!==-1);this._children.splice(this._children.indexOf(node),1);}}
node.parentNode=null;this._subtreeMarkerCount-=node._subtreeMarkerCount;if(node._subtreeMarkerCount)
this._domModel.dispatchEventToListeners(WebInspector.DOMModel.Events.MarkersChanged,this);this._renumber();},_setChildrenPayload:function(payloads)
{if(this._contentDocument)
return;this._children=[];for(var i=0;i<payloads.length;++i){var payload=payloads[i];var node=new WebInspector.DOMNode(this._domModel,this.ownerDocument,this._isInShadowTree,payload);this._children.push(node);}
this._renumber();},_setPseudoElements:function(payloads)
{this._pseudoElements=new Map();if(!payloads)
return;for(var i=0;i<payloads.length;++i){var node=new WebInspector.DOMNode(this._domModel,this.ownerDocument,this._isInShadowTree,payloads[i]);node.parentNode=this;this._pseudoElements.set(node.pseudoType(),node);}},_setDistributedNodePayloads:function(payloads)
{this._distributedNodes=[];for(var payload of payloads)
this._distributedNodes.push(new WebInspector.DOMNodeShortcut(this._domModel.target(),payload.backendNodeId,payload.nodeType,payload.nodeName));},_renumber:function()
{this._childNodeCount=this._children.length;if(this._childNodeCount==0){this.firstChild=null;this.lastChild=null;return;}
this.firstChild=this._children[0];this.lastChild=this._children[this._childNodeCount-1];for(var i=0;i<this._childNodeCount;++i){var child=this._children[i];child.index=i;child.nextSibling=i+1<this._childNodeCount?this._children[i+1]:null;child.previousSibling=i-1>=0?this._children[i-1]:null;child.parentNode=this;}},_addAttribute:function(name,value)
{var attr={name:name,value:value,_node:this};this._attributesMap[name]=attr;this._attributes.push(attr);},_setAttribute:function(name,value)
{var attr=this._attributesMap[name];if(attr)
attr.value=value;else
this._addAttribute(name,value);},_removeAttribute:function(name)
{var attr=this._attributesMap[name];if(attr){this._attributes.remove(attr);delete this._attributesMap[name];}},copyTo:function(targetNode,anchorNode,callback)
{this._agent.copyTo(this.id,targetNode.id,anchorNode?anchorNode.id:undefined,this._domModel._markRevision(this,callback));},moveTo:function(targetNode,anchorNode,callback)
{this._agent.moveTo(this.id,targetNode.id,anchorNode?anchorNode.id:undefined,this._domModel._markRevision(this,callback));},isXMLNode:function()
{return!!this._xmlVersion;},setMarker:function(name,value)
{if(value===null){if(!this._markers.hasOwnProperty(name))
return;delete this._markers[name];for(var node=this;node;node=node.parentNode)
--node._subtreeMarkerCount;for(var node=this;node;node=node.parentNode)
this._domModel.dispatchEventToListeners(WebInspector.DOMModel.Events.MarkersChanged,node);return;}
if(this.parentNode&&!this._markers.hasOwnProperty(name)){for(var node=this;node;node=node.parentNode)
++node._subtreeMarkerCount;}
this._markers[name]=value;for(var node=this;node;node=node.parentNode)
this._domModel.dispatchEventToListeners(WebInspector.DOMModel.Events.MarkersChanged,node);},marker:function(name)
{return this._markers[name]||null;},markers:function()
{return Object.values(this._markers);},traverseMarkers:function(visitor)
{function traverse(node)
{if(!node._subtreeMarkerCount)
return;for(var marker in node._markers)
visitor(node,marker);if(!node._children)
return;for(var child of node._children)
traverse(child);}
traverse(this);},resolveURL:function(url)
{if(!url)
return url;for(var frameOwnerCandidate=this;frameOwnerCandidate;frameOwnerCandidate=frameOwnerCandidate.parentNode){if(frameOwnerCandidate.baseURL)
return WebInspector.ParsedURL.completeURL(frameOwnerCandidate.baseURL,url);}
return null;},highlight:function(mode,objectId)
{this._domModel.highlightDOMNode(this.id,mode,undefined,objectId);},highlightForTwoSeconds:function()
{this._domModel.highlightDOMNodeForTwoSeconds(this.id);},resolveToObject:function(objectGroup,callback)
{this._agent.resolveNode(this.id,objectGroup,mycallback.bind(this));function mycallback(error,object)
{if(!callback)
return;if(error||!object)
callback(null);else
callback(this.target().runtimeModel.createRemoteObject(object));}},resolveToObjectPromise:function(objectGroup)
{return new Promise(resolveToObject.bind(this));function resolveToObject(fulfill,reject)
{this.resolveToObject(objectGroup,mycallback);function mycallback(object)
{if(object)
fulfill(object)
else
reject(null);}}},boxModel:function(callback)
{this._agent.getBoxModel(this.id,this._domModel._wrapClientCallback(callback));},setAsInspectedNode:function()
{var node=this;while(true){var ancestor=node.ancestorUserAgentShadowRoot();if(!ancestor)
break;ancestor=node.ancestorShadowHost();if(!ancestor)
break
node=ancestor;}
this._agent.setInspectedNode(node.id);},__proto__:WebInspector.SDKObject.prototype}
WebInspector.DeferredDOMNode=function(target,backendNodeId)
{this._domModel=WebInspector.DOMModel.fromTarget(target);this._backendNodeId=backendNodeId;}
WebInspector.DeferredDOMNode.prototype={resolve:function(callback)
{if(!this._domModel){callback(null);return;}
this._domModel.pushNodesByBackendIdsToFrontend(new Set([this._backendNodeId]),onGotNode.bind(this));function onGotNode(nodeIds)
{callback(nodeIds&&(nodeIds.get(this._backendNodeId)||null));}},resolvePromise:function()
{function resolveNode(fulfill,reject)
{function mycallback(node)
{fulfill(node)}
this.resolve(mycallback);}
return new Promise(resolveNode.bind(this));},backendNodeId:function()
{return this._backendNodeId;},highlight:function()
{if(this._domModel)
this._domModel.highlightDOMNode(undefined,undefined,this._backendNodeId);}}
WebInspector.DOMNodeShortcut=function(target,backendNodeId,nodeType,nodeName)
{this.nodeType=nodeType;this.nodeName=nodeName;this.deferredNode=new WebInspector.DeferredDOMNode(target,backendNodeId);}
WebInspector.DOMDocument=function(domModel,payload)
{WebInspector.DOMNode.call(this,domModel,this,false,payload);this.documentURL=payload.documentURL||"";this.baseURL=payload.baseURL||"";this._listeners={};}
WebInspector.DOMDocument.prototype={__proto__:WebInspector.DOMNode.prototype}
WebInspector.DOMModel=function(target){WebInspector.SDKModel.call(this,WebInspector.DOMModel,target);this._agent=target.domAgent();this._idToDOMNode={};this._document=null;this._attributeLoadNodeIds={};target.registerDOMDispatcher(new WebInspector.DOMDispatcher(this));this._showRulers=false;this._showExtensionLines=false;this._defaultHighlighter=new WebInspector.DefaultDOMNodeHighlighter(this._agent);this._highlighter=this._defaultHighlighter;this._agent.enable();}
WebInspector.DOMModel.Events={AttrModified:"AttrModified",AttrRemoved:"AttrRemoved",CharacterDataModified:"CharacterDataModified",DOMMutated:"DOMMutated",NodeInserted:"NodeInserted",NodeInspected:"NodeInspected",NodeHighlightedInOverlay:"NodeHighlightedInOverlay",NodeRemoved:"NodeRemoved",DocumentUpdated:"DocumentUpdated",ChildNodeCountUpdated:"ChildNodeCountUpdated",UndoRedoRequested:"UndoRedoRequested",UndoRedoCompleted:"UndoRedoCompleted",DistributedNodesChanged:"DistributedNodesChanged",ModelSuspended:"ModelSuspended",InspectModeWillBeToggled:"InspectModeWillBeToggled",MarkersChanged:"MarkersChanged"}
WebInspector.DOMModel.highlightObjectAsDOMNode=function(object)
{var domModel=WebInspector.DOMModel.fromTarget(object.target());if(domModel)
domModel.highlightDOMNode(undefined,undefined,undefined,object.objectId);}
WebInspector.DOMModel.instances=function()
{var result=[];for(var target of WebInspector.targetManager.targets()){var domModel=WebInspector.DOMModel.fromTarget(target);if(domModel)
result.push(domModel);}
return result;}
WebInspector.DOMModel.hideDOMNodeHighlight=function()
{for(var domModel of WebInspector.DOMModel.instances())
domModel.highlightDOMNode(0);}
WebInspector.DOMModel.cancelSearch=function()
{for(var domModel of WebInspector.DOMModel.instances())
domModel._cancelSearch();}
WebInspector.DOMModel.prototype={_scheduleMutationEvent:function(node)
{if(!this.hasEventListeners(WebInspector.DOMModel.Events.DOMMutated))
return;this._lastMutationId=(this._lastMutationId||0)+1;Promise.resolve().then(callObserve.bind(this,node,this._lastMutationId));function callObserve(node,mutationId)
{if(!this.hasEventListeners(WebInspector.DOMModel.Events.DOMMutated)||this._lastMutationId!==mutationId)
return;this.dispatchEventToListeners(WebInspector.DOMModel.Events.DOMMutated,node);}},requestDocument:function(callback)
{if(this._document){if(callback)
callback(this._document);return;}
if(this._pendingDocumentRequestCallbacks){this._pendingDocumentRequestCallbacks.push(callback);return;}
this._pendingDocumentRequestCallbacks=[callback];function onDocumentAvailable(error,root)
{if(!error)
this._setDocument(root);for(var i=0;i<this._pendingDocumentRequestCallbacks.length;++i){var callback=this._pendingDocumentRequestCallbacks[i];if(callback)
callback(this._document);}
delete this._pendingDocumentRequestCallbacks;}
this._agent.getDocument(onDocumentAvailable.bind(this));},existingDocument:function()
{return this._document;},pushNodeToFrontend:function(objectId,callback)
{function mycallback(nodeId)
{callback(nodeId?this.nodeForId(nodeId):null);}
this._dispatchWhenDocumentAvailable(this._agent.requestNode.bind(this._agent,objectId),mycallback.bind(this));},pushNodeByPathToFrontend:function(path,callback)
{this._dispatchWhenDocumentAvailable(this._agent.pushNodeByPathToFrontend.bind(this._agent,path),callback);},pushNodesByBackendIdsToFrontend:function(backendNodeIds,callback)
{var backendNodeIdsArray=Array.from(backendNodeIds.values());function mycallback(nodeIds)
{if(!nodeIds){callback(null);return;}
var map=new Map();for(var i=0;i<nodeIds.length;++i){if(nodeIds[i])
map.set(backendNodeIdsArray[i],this.nodeForId(nodeIds[i]));}
callback(map);}
this._dispatchWhenDocumentAvailable(this._agent.pushNodesByBackendIdsToFrontend.bind(this._agent,backendNodeIdsArray),mycallback.bind(this));},_wrapClientCallback:function(callback)
{if(!callback)
return;var wrapper=function(error,result)
{callback(error?null:result);};return wrapper;},_dispatchWhenDocumentAvailable:function(func,callback)
{var callbackWrapper=this._wrapClientCallback(callback);function onDocumentAvailable()
{if(this._document)
func(callbackWrapper);else{if(callbackWrapper)
callbackWrapper("No document");}}
this.requestDocument(onDocumentAvailable.bind(this));},_attributeModified:function(nodeId,name,value)
{var node=this._idToDOMNode[nodeId];if(!node)
return;node._setAttribute(name,value);this.dispatchEventToListeners(WebInspector.DOMModel.Events.AttrModified,{node:node,name:name});this._scheduleMutationEvent(node);},_attributeRemoved:function(nodeId,name)
{var node=this._idToDOMNode[nodeId];if(!node)
return;node._removeAttribute(name);this.dispatchEventToListeners(WebInspector.DOMModel.Events.AttrRemoved,{node:node,name:name});this._scheduleMutationEvent(node);},_inlineStyleInvalidated:function(nodeIds)
{for(var i=0;i<nodeIds.length;++i)
this._attributeLoadNodeIds[nodeIds[i]]=true;if("_loadNodeAttributesTimeout"in this)
return;this._loadNodeAttributesTimeout=setTimeout(this._loadNodeAttributes.bind(this),20);},_loadNodeAttributes:function()
{function callback(nodeId,error,attributes)
{if(error){return;}
var node=this._idToDOMNode[nodeId];if(node){if(node._setAttributesPayload(attributes)){this.dispatchEventToListeners(WebInspector.DOMModel.Events.AttrModified,{node:node,name:"style"});this._scheduleMutationEvent(node);}}}
delete this._loadNodeAttributesTimeout;for(var nodeId in this._attributeLoadNodeIds){var nodeIdAsNumber=parseInt(nodeId,10);this._agent.getAttributes(nodeIdAsNumber,callback.bind(this,nodeIdAsNumber));}
this._attributeLoadNodeIds={};},_characterDataModified:function(nodeId,newValue)
{var node=this._idToDOMNode[nodeId];node._nodeValue=newValue;this.dispatchEventToListeners(WebInspector.DOMModel.Events.CharacterDataModified,node);this._scheduleMutationEvent(node);},nodeForId:function(nodeId)
{return this._idToDOMNode[nodeId]||null;},_documentUpdated:function()
{this._setDocument(null);},_setDocument:function(payload)
{this._idToDOMNode={};if(payload&&"nodeId"in payload)
this._document=new WebInspector.DOMDocument(this,payload);else
this._document=null;this.dispatchEventToListeners(WebInspector.DOMModel.Events.DocumentUpdated,this._document);},_setDetachedRoot:function(payload)
{if(payload.nodeName==="#document")
new WebInspector.DOMDocument(this,payload);else
new WebInspector.DOMNode(this,null,false,payload);},_setChildNodes:function(parentId,payloads)
{if(!parentId&&payloads.length){this._setDetachedRoot(payloads[0]);return;}
var parent=this._idToDOMNode[parentId];parent._setChildrenPayload(payloads);},_childNodeCountUpdated:function(nodeId,newValue)
{var node=this._idToDOMNode[nodeId];node._childNodeCount=newValue;this.dispatchEventToListeners(WebInspector.DOMModel.Events.ChildNodeCountUpdated,node);this._scheduleMutationEvent(node);},_childNodeInserted:function(parentId,prevId,payload)
{var parent=this._idToDOMNode[parentId];var prev=this._idToDOMNode[prevId];var node=parent._insertChild(prev,payload);this._idToDOMNode[node.id]=node;this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeInserted,node);this._scheduleMutationEvent(node);},_childNodeRemoved:function(parentId,nodeId)
{var parent=this._idToDOMNode[parentId];var node=this._idToDOMNode[nodeId];parent._removeChild(node);this._unbind(node);this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeRemoved,{node:node,parent:parent});this._scheduleMutationEvent(node);},_shadowRootPushed:function(hostId,root)
{var host=this._idToDOMNode[hostId];if(!host)
return;var node=new WebInspector.DOMNode(this,host.ownerDocument,true,root);node.parentNode=host;this._idToDOMNode[node.id]=node;host._shadowRoots.unshift(node);this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeInserted,node);this._scheduleMutationEvent(node);},_shadowRootPopped:function(hostId,rootId)
{var host=this._idToDOMNode[hostId];if(!host)
return;var root=this._idToDOMNode[rootId];if(!root)
return;host._removeChild(root);this._unbind(root);this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeRemoved,{node:root,parent:host});this._scheduleMutationEvent(root);},_pseudoElementAdded:function(parentId,pseudoElement)
{var parent=this._idToDOMNode[parentId];if(!parent)
return;var node=new WebInspector.DOMNode(this,parent.ownerDocument,false,pseudoElement);node.parentNode=parent;this._idToDOMNode[node.id]=node;console.assert(!parent._pseudoElements.get(node.pseudoType()));parent._pseudoElements.set(node.pseudoType(),node);this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeInserted,node);this._scheduleMutationEvent(node);},_pseudoElementRemoved:function(parentId,pseudoElementId)
{var parent=this._idToDOMNode[parentId];if(!parent)
return;var pseudoElement=this._idToDOMNode[pseudoElementId];if(!pseudoElement)
return;parent._removeChild(pseudoElement);this._unbind(pseudoElement);this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeRemoved,{node:pseudoElement,parent:parent});this._scheduleMutationEvent(pseudoElement);},_distributedNodesUpdated:function(insertionPointId,distributedNodes)
{var insertionPoint=this._idToDOMNode[insertionPointId];if(!insertionPoint)
return;insertionPoint._setDistributedNodePayloads(distributedNodes);this.dispatchEventToListeners(WebInspector.DOMModel.Events.DistributedNodesChanged,insertionPoint);this._scheduleMutationEvent(insertionPoint);},_unbind:function(node)
{delete this._idToDOMNode[node.id];for(var i=0;node._children&&i<node._children.length;++i)
this._unbind(node._children[i]);for(var i=0;i<node._shadowRoots.length;++i)
this._unbind(node._shadowRoots[i]);var pseudoElements=node.pseudoElements();for(var value of pseudoElements.values())
this._unbind(value);if(node._templateContent)
this._unbind(node._templateContent);},_inspectNodeRequested:function(backendNodeId)
{var deferredNode=new WebInspector.DeferredDOMNode(this.target(),backendNodeId);this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeInspected,deferredNode);},performSearch:function(query,includeUserAgentShadowDOM,searchCallback)
{WebInspector.DOMModel.cancelSearch();function callback(error,searchId,resultsCount)
{this._searchId=searchId;searchCallback(resultsCount);}
this._agent.performSearch(query,includeUserAgentShadowDOM,callback.bind(this));},performSearchPromise:function(query,includeUserAgentShadowDOM)
{return new Promise(performSearch.bind(this));function performSearch(resolve)
{this._agent.performSearch(query,includeUserAgentShadowDOM,callback.bind(this));function callback(error,searchId,resultsCount)
{if(!error)
this._searchId=searchId;resolve(error?0:resultsCount);}}},searchResult:function(index,callback)
{if(this._searchId)
this._agent.getSearchResults(this._searchId,index,index+1,searchResultsCallback.bind(this));else
callback(null);function searchResultsCallback(error,nodeIds)
{if(error){console.error(error);callback(null);return;}
if(nodeIds.length!=1)
return;callback(this.nodeForId(nodeIds[0]));}},_cancelSearch:function()
{if(this._searchId){this._agent.discardSearchResults(this._searchId);delete this._searchId;}},querySelector:function(nodeId,selectors,callback)
{this._agent.querySelector(nodeId,selectors,this._wrapClientCallback(callback));},querySelectorAll:function(nodeId,selectors,callback)
{this._agent.querySelectorAll(nodeId,selectors,this._wrapClientCallback(callback));},highlightDOMNode:function(nodeId,mode,backendNodeId,objectId)
{this.highlightDOMNodeWithConfig(nodeId,{mode:mode},backendNodeId,objectId);},highlightDOMNodeWithConfig:function(nodeId,config,backendNodeId,objectId)
{config=config||{mode:"all",showInfo:undefined,selectors:undefined};if(this._hideDOMNodeHighlightTimeout){clearTimeout(this._hideDOMNodeHighlightTimeout);delete this._hideDOMNodeHighlightTimeout;}
var highlightConfig=this._buildHighlightConfig(config.mode);if(typeof config.showInfo!=="undefined")
highlightConfig.showInfo=config.showInfo;if(typeof config.selectors!=="undefined")
highlightConfig.selectorList=config.selectors;this._highlighter.highlightDOMNode(this.nodeForId(nodeId||0),highlightConfig,backendNodeId,objectId);},highlightDOMNodeForTwoSeconds:function(nodeId)
{this.highlightDOMNode(nodeId);this._hideDOMNodeHighlightTimeout=setTimeout(WebInspector.DOMModel.hideDOMNodeHighlight.bind(WebInspector.DOMModel),2000);},highlightFrame:function(frameId)
{this._highlighter.highlightFrame(frameId);},setInspectMode:function(mode,callback)
{function onDocumentAvailable()
{this.dispatchEventToListeners(WebInspector.DOMModel.Events.InspectModeWillBeToggled,mode!==DOMAgent.InspectMode.None);this._highlighter.setInspectMode(mode,this._buildHighlightConfig(),callback);}
this.requestDocument(onDocumentAvailable.bind(this));},setHighlightSettings:function(showRulers,showExtensionLines)
{this._showRulers=showRulers;this._showExtensionLines=showExtensionLines;},_buildHighlightConfig:function(mode)
{mode=mode||"all";var highlightConfig={showInfo:mode==="all",showRulers:this._showRulers,showExtensionLines:this._showExtensionLines};if(mode==="all"||mode==="content")
highlightConfig.contentColor=WebInspector.Color.PageHighlight.Content.toProtocolRGBA();if(mode==="all"||mode==="padding")
highlightConfig.paddingColor=WebInspector.Color.PageHighlight.Padding.toProtocolRGBA();if(mode==="all"||mode==="border")
highlightConfig.borderColor=WebInspector.Color.PageHighlight.Border.toProtocolRGBA();if(mode==="all"||mode==="margin")
highlightConfig.marginColor=WebInspector.Color.PageHighlight.Margin.toProtocolRGBA();if(mode==="all"){highlightConfig.eventTargetColor=WebInspector.Color.PageHighlight.EventTarget.toProtocolRGBA();highlightConfig.shapeColor=WebInspector.Color.PageHighlight.Shape.toProtocolRGBA();highlightConfig.shapeMarginColor=WebInspector.Color.PageHighlight.ShapeMargin.toProtocolRGBA();highlightConfig.displayAsMaterial=Runtime.experiments.isEnabled("materialDesign");}
return highlightConfig;},_markRevision:function(node,callback)
{function wrapperFunction(error)
{if(!error)
this.markUndoableState();if(callback)
callback.apply(this,arguments);}
return wrapperFunction.bind(this);},markUndoableState:function()
{this._agent.markUndoableState();},undo:function(callback)
{function mycallback(error)
{this.dispatchEventToListeners(WebInspector.DOMModel.Events.UndoRedoCompleted);callback(error);}
this.dispatchEventToListeners(WebInspector.DOMModel.Events.UndoRedoRequested);this._agent.undo(callback);},redo:function(callback)
{function mycallback(error)
{this.dispatchEventToListeners(WebInspector.DOMModel.Events.UndoRedoCompleted);callback(error);}
this.dispatchEventToListeners(WebInspector.DOMModel.Events.UndoRedoRequested);this._agent.redo(callback);},setHighlighter:function(highlighter)
{this._highlighter=highlighter||this._defaultHighlighter;},nodeForLocation:function(x,y,callback)
{this._agent.getNodeForLocation(x,y,mycallback.bind(this));function mycallback(error,nodeId)
{if(error){callback(null);return;}
callback(this.nodeForId(nodeId));}},pushObjectAsNodeToFrontend:function(object,callback)
{if(object.isNode())
this.pushNodeToFrontend(object.objectId,callback);else
callback(null);},suspendModel:function()
{return new Promise(promiseBody.bind(this));function promiseBody(fulfill)
{this._agent.disable(callback.bind(this));function callback()
{this._setDocument(null);fulfill();}}},resumeModel:function()
{return new Promise(promiseBody.bind(this));function promiseBody(fulfill)
{this._agent.enable(fulfill);}},nodeHighlightRequested:function(nodeId)
{var node=this.nodeForId(nodeId);if(!node)
return;this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeHighlightedInOverlay,node);},__proto__:WebInspector.SDKModel.prototype}
WebInspector.DOMDispatcher=function(domModel)
{this._domModel=domModel;}
WebInspector.DOMDispatcher.prototype={documentUpdated:function()
{this._domModel._documentUpdated();},inspectNodeRequested:function(nodeId)
{this._domModel._inspectNodeRequested(nodeId);},attributeModified:function(nodeId,name,value)
{this._domModel._attributeModified(nodeId,name,value);},attributeRemoved:function(nodeId,name)
{this._domModel._attributeRemoved(nodeId,name);},inlineStyleInvalidated:function(nodeIds)
{this._domModel._inlineStyleInvalidated(nodeIds);},characterDataModified:function(nodeId,characterData)
{this._domModel._characterDataModified(nodeId,characterData);},setChildNodes:function(parentId,payloads)
{this._domModel._setChildNodes(parentId,payloads);},childNodeCountUpdated:function(nodeId,childNodeCount)
{this._domModel._childNodeCountUpdated(nodeId,childNodeCount);},childNodeInserted:function(parentNodeId,previousNodeId,payload)
{this._domModel._childNodeInserted(parentNodeId,previousNodeId,payload);},childNodeRemoved:function(parentNodeId,nodeId)
{this._domModel._childNodeRemoved(parentNodeId,nodeId);},shadowRootPushed:function(hostId,root)
{this._domModel._shadowRootPushed(hostId,root);},shadowRootPopped:function(hostId,rootId)
{this._domModel._shadowRootPopped(hostId,rootId);},pseudoElementAdded:function(parentId,pseudoElement)
{this._domModel._pseudoElementAdded(parentId,pseudoElement);},pseudoElementRemoved:function(parentId,pseudoElementId)
{this._domModel._pseudoElementRemoved(parentId,pseudoElementId);},distributedNodesUpdated:function(insertionPointId,distributedNodes)
{this._domModel._distributedNodesUpdated(insertionPointId,distributedNodes);},nodeHighlightRequested:function(nodeId)
{this._domModel.nodeHighlightRequested(nodeId);}}
WebInspector.DOMNodeHighlighter=function(){}
WebInspector.DOMNodeHighlighter.prototype={highlightDOMNode:function(node,config,backendNodeId,objectId){},setInspectMode:function(mode,config,callback){},highlightFrame:function(frameId){}}
WebInspector.DefaultDOMNodeHighlighter=function(agent)
{this._agent=agent;}
WebInspector.DefaultDOMNodeHighlighter.prototype={highlightDOMNode:function(node,config,backendNodeId,objectId)
{if(objectId||node||backendNodeId)
this._agent.highlightNode(config,(objectId||backendNodeId)?undefined:node.id,backendNodeId,objectId);else
this._agent.hideHighlight();},setInspectMode:function(mode,config,callback)
{this._agent.setInspectMode(mode,config,callback);},highlightFrame:function(frameId)
{this._agent.highlightFrame(frameId,WebInspector.Color.PageHighlight.Content.toProtocolRGBA(),WebInspector.Color.PageHighlight.ContentOutline.toProtocolRGBA());}}
WebInspector.DOMModel.fromTarget=function(target)
{return(target.model(WebInspector.DOMModel));};WebInspector.DebuggerModel=function(target)
{WebInspector.SDKModel.call(this,WebInspector.DebuggerModel,target);target.registerDebuggerDispatcher(new WebInspector.DebuggerDispatcher(this));this._agent=target.debuggerAgent();WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.TargetDisposed,this._targetDisposed,this);this._debuggerPausedDetails=null;this._scripts={};this._scriptsBySourceURL=new Map();this._breakpointResolvedEventTarget=new WebInspector.Object();this._isPausing=false;WebInspector.moduleSetting("pauseOnExceptionEnabled").addChangeListener(this._pauseOnExceptionStateChanged,this);WebInspector.moduleSetting("pauseOnCaughtException").addChangeListener(this._pauseOnExceptionStateChanged,this);WebInspector.moduleSetting("enableAsyncStackTraces").addChangeListener(this.asyncStackTracesStateChanged,this);WebInspector.moduleSetting("skipStackFramesPattern").addChangeListener(this._applySkipStackFrameSettings,this);WebInspector.moduleSetting("skipContentScripts").addChangeListener(this._applySkipStackFrameSettings,this);this.enableDebugger();this._applySkipStackFrameSettings();}
WebInspector.DebuggerModel.FunctionDetails;WebInspector.DebuggerModel.GeneratorObjectDetails;WebInspector.DebuggerModel.PauseOnExceptionsState={DontPauseOnExceptions:"none",PauseOnAllExceptions:"all",PauseOnUncaughtExceptions:"uncaught"};WebInspector.DebuggerModel.Events={AsyncOperationStarted:"AsyncOperationStarted",AsyncOperationCompleted:"AsyncOperationCompleted",DebuggerWasEnabled:"DebuggerWasEnabled",DebuggerWasDisabled:"DebuggerWasDisabled",BeforeDebuggerPaused:"BeforeDebuggerPaused",DebuggerPaused:"DebuggerPaused",DebuggerResumed:"DebuggerResumed",ParsedScriptSource:"ParsedScriptSource",FailedToParseScriptSource:"FailedToParseScriptSource",GlobalObjectCleared:"GlobalObjectCleared",CallFrameSelected:"CallFrameSelected",ConsoleCommandEvaluatedInSelectedCallFrame:"ConsoleCommandEvaluatedInSelectedCallFrame",PromiseUpdated:"PromiseUpdated",}
WebInspector.DebuggerModel.BreakReason={AsyncOperation:"AsyncOperation",DOM:"DOM",EventListener:"EventListener",XHR:"XHR",Exception:"exception",PromiseRejection:"promiseRejection",Assert:"assert",CSPViolation:"CSPViolation",DebugCommand:"debugCommand",Other:"other"}
WebInspector.DebuggerModel.prototype={debuggerEnabled:function()
{return!!this._debuggerEnabled;},enableDebugger:function(callback)
{if(this._debuggerEnabled){if(callback)
callback();return;}
this._agent.enable(callback);this._debuggerEnabled=true;this._pauseOnExceptionStateChanged();this.asyncStackTracesStateChanged();this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerWasEnabled);},disableDebugger:function(callback)
{if(!this._debuggerEnabled){if(callback)
callback();return;}
this._agent.disable(callback);this._debuggerEnabled=false;this._isPausing=false;this.asyncStackTracesStateChanged();this._globalObjectCleared();this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerWasDisabled);},_skipAllPauses:function(skip)
{if(this._skipAllPausesTimeout){clearTimeout(this._skipAllPausesTimeout);delete this._skipAllPausesTimeout;}
this._agent.setSkipAllPauses(skip);},skipAllPausesUntilReloadOrTimeout:function(timeout)
{if(this._skipAllPausesTimeout)
clearTimeout(this._skipAllPausesTimeout);this._agent.setSkipAllPauses(true);this._skipAllPausesTimeout=setTimeout(this._skipAllPauses.bind(this,false),timeout);},_pauseOnExceptionStateChanged:function()
{var state;if(!WebInspector.moduleSetting("pauseOnExceptionEnabled").get()){state=WebInspector.DebuggerModel.PauseOnExceptionsState.DontPauseOnExceptions;}else if(WebInspector.moduleSetting("pauseOnCaughtException").get()){state=WebInspector.DebuggerModel.PauseOnExceptionsState.PauseOnAllExceptions;}else{state=WebInspector.DebuggerModel.PauseOnExceptionsState.PauseOnUncaughtExceptions;}
this._agent.setPauseOnExceptions(state);},asyncStackTracesStateChanged:function()
{const maxAsyncStackChainDepth=4;var enabled=WebInspector.moduleSetting("enableAsyncStackTraces").get()&&this._debuggerEnabled;this._agent.setAsyncCallStackDepth(enabled?maxAsyncStackChainDepth:0);},stepInto:function()
{this._agent.stepInto();},stepIntoAsync:function()
{this._agent.stepIntoAsync();},stepOver:function()
{this._agent.stepOver();},stepOut:function()
{this._agent.stepOut();},resume:function()
{this._agent.resume();this._isPausing=false;},pause:function()
{this._isPausing=true;this._skipAllPauses(false);this._agent.pause();},setBreakpointsActive:function(active)
{this._agent.setBreakpointsActive(active);},setBreakpointByURL:function(url,lineNumber,columnNumber,condition,callback)
{var minColumnNumber=0;var scripts=this._scriptsBySourceURL.get(url)||[];for(var i=0,l=scripts.length;i<l;++i){var script=scripts[i];if(lineNumber===script.lineOffset)
minColumnNumber=minColumnNumber?Math.min(minColumnNumber,script.columnOffset):script.columnOffset;}
columnNumber=Math.max(columnNumber,minColumnNumber);var target=this.target();function didSetBreakpoint(error,breakpointId,locations)
{if(callback){var rawLocations=locations?locations.map(WebInspector.DebuggerModel.Location.fromPayload.bind(WebInspector.DebuggerModel.Location,this)):[];callback(error?null:breakpointId,rawLocations);}}
this._agent.setBreakpointByUrl(lineNumber,url,undefined,columnNumber,condition,didSetBreakpoint.bind(this));},setBreakpointBySourceId:function(rawLocation,condition,callback)
{var target=this.target();function didSetBreakpoint(error,breakpointId,actualLocation)
{if(callback){var location=WebInspector.DebuggerModel.Location.fromPayload(this,actualLocation);callback(error?null:breakpointId,[location]);}}
this._agent.setBreakpoint(rawLocation.payload(),condition,didSetBreakpoint.bind(this));},removeBreakpoint:function(breakpointId,callback)
{this._agent.removeBreakpoint(breakpointId,innerCallback);function innerCallback(error)
{if(error)
console.error("Failed to remove breakpoint: "+error);if(callback)
callback();}},getCollectionEntries:function(objectId,callback)
{this._agent.getCollectionEntries(objectId,innerCallback);function innerCallback(error,response)
{if(error){console.error(error);callback(null);return;}
callback(response);}},enablePromiseTracker:function(captureStacks)
{this._agent.enablePromiseTracker(captureStacks);},disablePromiseTracker:function()
{this._agent.disablePromiseTracker();},getPromiseById:function(promiseId,objectGroup,callback)
{this._agent.getPromiseById(promiseId,objectGroup,innerCallback);function innerCallback(error,promise)
{if(error){console.error(error);callback(null);return;}
callback(promise);}},flushAsyncOperationEvents:function()
{this._agent.flushAsyncOperationEvents();},setAsyncOperationBreakpoint:function(operationId)
{this._agent.setAsyncOperationBreakpoint(operationId);},removeAsyncOperationBreakpoint:function(operationId)
{this._agent.removeAsyncOperationBreakpoint(operationId);},_breakpointResolved:function(breakpointId,location)
{this._breakpointResolvedEventTarget.dispatchEventToListeners(breakpointId,WebInspector.DebuggerModel.Location.fromPayload(this,location));},_globalObjectCleared:function()
{this._setDebuggerPausedDetails(null);this._reset();this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.GlobalObjectCleared);},_promiseUpdated:function(eventType,promise)
{this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.PromiseUpdated,{eventType:eventType,promise:promise});},_asyncOperationStarted:function(operation)
{this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.AsyncOperationStarted,operation);},_asyncOperationCompleted:function(operationId)
{this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.AsyncOperationCompleted,operationId);},_reset:function()
{this._scripts={};this._scriptsBySourceURL.clear();},get scripts()
{return this._scripts;},scriptForId:function(scriptId)
{return this._scripts[scriptId]||null;},scriptsForSourceURL:function(sourceURL)
{if(!sourceURL)
return[];return this._scriptsBySourceURL.get(sourceURL)||[];},setScriptSource:function(scriptId,newSource,callback)
{this._scripts[scriptId].editSource(newSource,this._didEditScriptSource.bind(this,scriptId,newSource,callback));},_didEditScriptSource:function(scriptId,newSource,callback,error,errorData,callFrames,asyncStackTrace,needsStepIn)
{if(needsStepIn){this.stepInto();this._pendingLiveEditCallback=callback.bind(this,error,errorData);return;}
if(!error&&callFrames&&callFrames.length)
this._pausedScript(callFrames,this._debuggerPausedDetails.reason,this._debuggerPausedDetails.auxData,this._debuggerPausedDetails.breakpointIds,asyncStackTrace);callback(error,errorData);},get callFrames()
{return this._debuggerPausedDetails?this._debuggerPausedDetails.callFrames:null;},debuggerPausedDetails:function()
{return this._debuggerPausedDetails;},_setDebuggerPausedDetails:function(debuggerPausedDetails)
{this._isPausing=false;this._debuggerPausedDetails=debuggerPausedDetails;if(this._debuggerPausedDetails){if(Runtime.experiments.isEnabled("emptySourceMapAutoStepping")){if(this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.BeforeDebuggerPaused,this._debuggerPausedDetails)){return false;}}
this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerPaused,this._debuggerPausedDetails);}
if(debuggerPausedDetails)
this.setSelectedCallFrame(debuggerPausedDetails.callFrames[0]);else
this.setSelectedCallFrame(null);return true;},_pausedScript:function(callFrames,reason,auxData,breakpointIds,asyncStackTrace)
{var pausedDetails=new WebInspector.DebuggerPausedDetails(this,callFrames,reason,auxData,breakpointIds,asyncStackTrace);if(this._setDebuggerPausedDetails(pausedDetails)){if(this._pendingLiveEditCallback){var callback=this._pendingLiveEditCallback;delete this._pendingLiveEditCallback;callback();}}else{this._agent.stepInto();}},_resumedScript:function()
{this._setDebuggerPausedDetails(null);this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerResumed);},_parsedScriptSource:function(scriptId,sourceURL,startLine,startColumn,endLine,endColumn,executionContextId,isContentScript,isInternalScript,isLiveEdit,sourceMapURL,hasSourceURL,hasSyntaxError)
{var script=new WebInspector.Script(this,scriptId,sourceURL,startLine,startColumn,endLine,endColumn,executionContextId,isContentScript,isInternalScript,isLiveEdit,sourceMapURL,hasSourceURL);this._registerScript(script);if(!hasSyntaxError)
this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.ParsedScriptSource,script);else
this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.FailedToParseScriptSource,script);return script;},_registerScript:function(script)
{this._scripts[script.scriptId]=script;if(script.isAnonymousScript())
return;var scripts=this._scriptsBySourceURL.get(script.sourceURL);if(!scripts){scripts=[];this._scriptsBySourceURL.set(script.sourceURL,scripts);}
scripts.push(script);},createRawLocation:function(script,lineNumber,columnNumber)
{if(script.sourceURL)
return this.createRawLocationByURL(script.sourceURL,lineNumber,columnNumber);return new WebInspector.DebuggerModel.Location(this,script.scriptId,lineNumber,columnNumber);},createRawLocationByURL:function(sourceURL,lineNumber,columnNumber)
{var closestScript=null;var scripts=this._scriptsBySourceURL.get(sourceURL)||[];for(var i=0,l=scripts.length;i<l;++i){var script=scripts[i];if(!closestScript)
closestScript=script;if(script.lineOffset>lineNumber||(script.lineOffset===lineNumber&&script.columnOffset>columnNumber))
continue;if(script.endLine<lineNumber||(script.endLine===lineNumber&&script.endColumn<=columnNumber))
continue;closestScript=script;break;}
return closestScript?new WebInspector.DebuggerModel.Location(this,closestScript.scriptId,lineNumber,columnNumber):null;},createRawLocationByScriptId:function(scriptId,lineNumber,columnNumber)
{var script=this.scriptForId(scriptId);return script?this.createRawLocation(script,lineNumber,columnNumber):null;},isPaused:function()
{return!!this.debuggerPausedDetails();},isPausing:function()
{return this._isPausing;},setSelectedCallFrame:function(callFrame)
{this._selectedCallFrame=callFrame;if(!this._selectedCallFrame)
return;this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.CallFrameSelected,callFrame);},selectedCallFrame:function()
{return this._selectedCallFrame;},evaluateOnSelectedCallFrame:function(code,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,returnByValue,generatePreview,callback)
{function didEvaluate(result,wasThrown,exceptionDetails)
{if(!result)
callback(null,false);else if(returnByValue)
callback(null,!!wasThrown,wasThrown?null:result,exceptionDetails);else
callback(this.target().runtimeModel.createRemoteObject(result),!!wasThrown,undefined,exceptionDetails);if(objectGroup==="console")
this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.ConsoleCommandEvaluatedInSelectedCallFrame);}
this.selectedCallFrame().evaluate(code,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,returnByValue,generatePreview,didEvaluate.bind(this));},_applySkipStackFrameSettings:function()
{this._agent.skipStackFrames(WebInspector.moduleSetting("skipStackFramesPattern").get(),WebInspector.moduleSetting("skipContentScripts").get());},functionDetails:function(remoteObject,callback)
{this._agent.getFunctionDetails(remoteObject.objectId,didGetDetails.bind(this));function didGetDetails(error,response)
{if(error){callback(null);return;}
var location=response.location;var script=this.scriptForId(location.scriptId);var rawLocation=script?this.createRawLocation(script,location.lineNumber,location.columnNumber||0):null;var sourceURL=script?script.contentURL():null;callback({location:rawLocation,sourceURL:sourceURL,functionName:response.functionName,scopeChain:response.scopeChain||null});}},compileScript:function(expression,sourceURL,persistScript,executionContextId,callback)
{this._agent.compileScript(expression,sourceURL,persistScript,executionContextId,innerCallback);function innerCallback(error,scriptId,exceptionDetails)
{if(error){console.error(error);return;}
if(callback)
callback(scriptId,exceptionDetails);}},runScript:function(scriptId,executionContextId,objectGroup,doNotPauseOnExceptionsAndMuteConsole,callback)
{this._agent.runScript(scriptId,executionContextId,objectGroup,doNotPauseOnExceptionsAndMuteConsole,innerCallback);function innerCallback(error,result,exceptionDetails)
{if(error){console.error(error);return;}
if(callback)
callback(result,exceptionDetails);}},setVariableValue:function(scopeNumber,variableName,newValue,callFrameId,functionObjectId,callback)
{this._agent.setVariableValue(scopeNumber,variableName,newValue,callFrameId,functionObjectId,innerCallback);function innerCallback(error)
{if(error){console.error(error);if(callback)
callback(error);return;}
if(callback)
callback();}},generatorObjectDetails:function(remoteObject,callback)
{this._agent.getGeneratorObjectDetails(remoteObject.objectId,didGetDetails.bind(this));function didGetDetails(error,response)
{if(error){console.error(error);callback(null);return;}
var location=response.location;var script=location&&this.scriptForId(location.scriptId);var rawLocation=script?this.createRawLocation(script,location.lineNumber,location.columnNumber||0):null;var sourceURL=script?script.contentURL():null;callback({location:rawLocation,sourceURL:sourceURL,functionName:response.functionName,status:response.status});}},addBreakpointListener:function(breakpointId,listener,thisObject)
{this._breakpointResolvedEventTarget.addEventListener(breakpointId,listener,thisObject)},removeBreakpointListener:function(breakpointId,listener,thisObject)
{this._breakpointResolvedEventTarget.removeEventListener(breakpointId,listener,thisObject);},_targetDisposed:function(event)
{var target=(event.data);if(target!=this.target())
return;WebInspector.moduleSetting("pauseOnExceptionEnabled").removeChangeListener(this._pauseOnExceptionStateChanged,this);WebInspector.moduleSetting("pauseOnCaughtException").removeChangeListener(this._pauseOnExceptionStateChanged,this);WebInspector.moduleSetting("skipStackFramesPattern").removeChangeListener(this._applySkipStackFrameSettings,this);WebInspector.moduleSetting("skipContentScripts").removeChangeListener(this._applySkipStackFrameSettings,this);WebInspector.moduleSetting("enableAsyncStackTraces").removeChangeListener(this.asyncStackTracesStateChanged,this);},suspendModel:function()
{return new Promise(promiseBody.bind(this));function promiseBody(fulfill)
{this.disableDebugger(fulfill);}},resumeModel:function()
{return new Promise(promiseBody.bind(this));function promiseBody(fulfill)
{this.enableDebugger(fulfill);}},__proto__:WebInspector.SDKModel.prototype}
WebInspector.DebuggerEventTypes={JavaScriptPause:0,JavaScriptBreakpoint:1,NativeBreakpoint:2};WebInspector.DebuggerDispatcher=function(debuggerModel)
{this._debuggerModel=debuggerModel;}
WebInspector.DebuggerDispatcher.prototype={paused:function(callFrames,reason,auxData,breakpointIds,asyncStackTrace)
{this._debuggerModel._pausedScript(callFrames,reason,auxData,breakpointIds||[],asyncStackTrace);},resumed:function()
{this._debuggerModel._resumedScript();},globalObjectCleared:function()
{this._debuggerModel._globalObjectCleared();},scriptParsed:function(scriptId,sourceURL,startLine,startColumn,endLine,endColumn,executionContextId,isContentScript,isInternalScript,isLiveEdit,sourceMapURL,hasSourceURL)
{this._debuggerModel._parsedScriptSource(scriptId,sourceURL,startLine,startColumn,endLine,endColumn,executionContextId,!!isContentScript,!!isInternalScript,!!isLiveEdit,sourceMapURL,hasSourceURL,false);},scriptFailedToParse:function(scriptId,sourceURL,startLine,startColumn,endLine,endColumn,executionContextId,isContentScript,isInternalScript,sourceMapURL,hasSourceURL)
{this._debuggerModel._parsedScriptSource(scriptId,sourceURL,startLine,startColumn,endLine,endColumn,executionContextId,!!isContentScript,!!isInternalScript,false,sourceMapURL,hasSourceURL,true);},breakpointResolved:function(breakpointId,location)
{this._debuggerModel._breakpointResolved(breakpointId,location);},promiseUpdated:function(eventType,promise)
{this._debuggerModel._promiseUpdated(eventType,promise);},asyncOperationStarted:function(operation)
{this._debuggerModel._asyncOperationStarted(operation);},asyncOperationCompleted:function(operationId)
{this._debuggerModel._asyncOperationCompleted(operationId);}}
WebInspector.DebuggerModel.Location=function(debuggerModel,scriptId,lineNumber,columnNumber)
{WebInspector.SDKObject.call(this,debuggerModel.target());this._debuggerModel=debuggerModel;this.scriptId=scriptId;this.lineNumber=lineNumber;this.columnNumber=columnNumber||0;}
WebInspector.DebuggerModel.Location.fromPayload=function(debuggerModel,payload)
{return new WebInspector.DebuggerModel.Location(debuggerModel,payload.scriptId,payload.lineNumber,payload.columnNumber);}
WebInspector.DebuggerModel.Location.prototype={payload:function()
{return{scriptId:this.scriptId,lineNumber:this.lineNumber,columnNumber:this.columnNumber};},script:function()
{return this._debuggerModel.scriptForId(this.scriptId);},continueToLocation:function()
{this._debuggerModel._agent.continueToLocation(this.payload());},id:function()
{return this.target().id()+":"+this.scriptId+":"+this.lineNumber+":"+this.columnNumber;},__proto__:WebInspector.SDKObject.prototype}
WebInspector.DebuggerModel.CallFrame=function(debuggerModel,script,payload,isAsync)
{var target=debuggerModel.target();WebInspector.SDKObject.call(this,target);this.debuggerModel=debuggerModel;this._debuggerAgent=debuggerModel._agent;this._script=script;this._payload=payload;this._isAsync=isAsync;this._location=WebInspector.DebuggerModel.Location.fromPayload(debuggerModel,payload.location);this._scopeChain=[];this._localScope=null;for(var i=0;i<payload.scopeChain.length;++i){var scope=new WebInspector.DebuggerModel.Scope(this,i);this._scopeChain.push(scope);if(scope.type()===DebuggerAgent.ScopeType.Local)
this._localScope=scope;}
if(payload.functionLocation)
this._functionLocation=WebInspector.DebuggerModel.Location.fromPayload(debuggerModel,payload.functionLocation);}
WebInspector.DebuggerModel.CallFrame.fromPayloadArray=function(debuggerModel,callFrames,isAsync)
{var result=[];for(var i=0;i<callFrames.length;++i){var callFrame=callFrames[i];var script=debuggerModel.scriptForId(callFrame.location.scriptId);if(script)
result.push(new WebInspector.DebuggerModel.CallFrame(debuggerModel,script,callFrame,isAsync));}
return result;}
WebInspector.DebuggerModel.CallFrame.prototype={get script()
{return this._script;},get id()
{return this._payload.callFrameId;},scopeChain:function()
{return this._scopeChain;},localScope:function()
{return this._localScope;},thisObject:function()
{return this._payload.this?this.target().runtimeModel.createRemoteObject(this._payload.this):null;},returnValue:function()
{return this._payload.returnValue?this.target().runtimeModel.createRemoteObject(this._payload.returnValue):null;},get functionName()
{return this._payload.functionName;},location:function()
{return this._location;},functionLocation:function()
{return this._functionLocation||null;},isAsync:function()
{return!!this._isAsync;},evaluate:function(code,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,returnByValue,generatePreview,callback)
{function didEvaluateOnCallFrame(error,result,wasThrown,exceptionDetails)
{if(error){console.error(error);callback(null,false);return;}
callback(result,wasThrown,exceptionDetails);}
this._debuggerAgent.evaluateOnCallFrame(this._payload.callFrameId,code,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,returnByValue,generatePreview,didEvaluateOnCallFrame);},restart:function(callback)
{function protocolCallback(error,callFrames,asyncStackTrace)
{if(!error)
this.debuggerModel.stepInto();if(callback)
callback(error);}
this._debuggerAgent.restartFrame(this._payload.callFrameId,protocolCallback.bind(this));},variableNames:function(callback)
{var result={this:true};function propertiesCollected(properties)
{for(var i=0;properties&&i<properties.length;++i)
result[properties[i].name]=true;if(--pendingRequests==0)
callback(result);}
var scopeChain=this.scopeChain();var pendingRequests=scopeChain.length;for(var i=0;i<scopeChain.length;++i){var scope=scopeChain[i];var object=scope.object();object.getAllProperties(false,propertiesCollected);}},__proto__:WebInspector.SDKObject.prototype}
WebInspector.DebuggerModel.Scope=function(callFrame,ordinal)
{this._callFrame=callFrame;this._payload=callFrame._payload.scopeChain[ordinal];this._type=this._payload.type;this._name=this._payload.name;this._ordinal=ordinal;}
WebInspector.DebuggerModel.Scope.prototype={type:function()
{return this._type;},name:function()
{return this._name;},object:function()
{if(this._object)
return this._object;var runtimeModel=this._callFrame.target().runtimeModel;var declarativeScope=this._type!==DebuggerAgent.ScopeType.With&&this._type!==DebuggerAgent.ScopeType.Global;if(declarativeScope)
this._object=runtimeModel.createScopeRemoteObject(this._payload.object,new WebInspector.ScopeRef(this._ordinal,this._callFrame.id,undefined));else
this._object=runtimeModel.createRemoteObject(this._payload.object);return this._callFrame.target().runtimeModel.createRemoteObject(this._payload.object);},description:function()
{var declarativeScope=this._type!==DebuggerAgent.ScopeType.With&&this._type!==DebuggerAgent.ScopeType.Global;return declarativeScope?"":(this._payload.object.description||"");}}
WebInspector.DebuggerModel.StackTrace=function(callFrames,asyncStackTrace,description)
{this.callFrames=callFrames;this.asyncStackTrace=asyncStackTrace;this.description=description;}
WebInspector.DebuggerModel.StackTrace.fromPayload=function(debuggerModel,payload,isAsync)
{if(!payload)
return null;var callFrames=WebInspector.DebuggerModel.CallFrame.fromPayloadArray(debuggerModel,payload.callFrames,isAsync);if(!callFrames.length)
return null;var asyncStackTrace=WebInspector.DebuggerModel.StackTrace.fromPayload(debuggerModel,payload.asyncStackTrace,true);return new WebInspector.DebuggerModel.StackTrace(callFrames,asyncStackTrace,payload.description);}
WebInspector.DebuggerPausedDetails=function(debuggerModel,callFrames,reason,auxData,breakpointIds,asyncStackTrace)
{WebInspector.SDKObject.call(this,debuggerModel.target());this.debuggerModel=debuggerModel;this.callFrames=WebInspector.DebuggerModel.CallFrame.fromPayloadArray(debuggerModel,callFrames);this.reason=reason;this.auxData=auxData;this.breakpointIds=breakpointIds;this.asyncStackTrace=WebInspector.DebuggerModel.StackTrace.fromPayload(debuggerModel,asyncStackTrace,true);}
WebInspector.DebuggerPausedDetails.prototype={exception:function()
{if(this.reason!==WebInspector.DebuggerModel.BreakReason.Exception&&this.reason!==WebInspector.DebuggerModel.BreakReason.PromiseRejection)
return null;return this.target().runtimeModel.createRemoteObject((this.auxData));},__proto__:WebInspector.SDKObject.prototype}
WebInspector.DebuggerModel.instances=function()
{var result=[];for(var target of WebInspector.targetManager.targets()){var debuggerModel=WebInspector.DebuggerModel.fromTarget(target);if(debuggerModel)
result.push(debuggerModel);}
return result;}
WebInspector.DebuggerModel.fromTarget=function(target)
{if(!target||!target.hasJSContext())
return null;return(target.model(WebInspector.DebuggerModel));};WebInspector.HAREntry=function(request)
{this._request=request;}
WebInspector.HAREntry.prototype={build:function()
{var entry={startedDateTime:WebInspector.HARLog.pseudoWallTime(this._request,this._request.startTime),time:this._request.timing?WebInspector.HAREntry._toMilliseconds(this._request.duration):0,request:this._buildRequest(),response:this._buildResponse(),cache:{},timings:this._buildTimings()};if(this._request.connectionId!=="0")
entry.connection=this._request.connectionId;var page=this._request.target().networkLog.pageLoadForRequest(this._request);if(page)
entry.pageref="page_"+page.id;return entry;},_buildRequest:function()
{var headersText=this._request.requestHeadersText();var res={method:this._request.requestMethod,url:this._buildRequestURL(this._request.url),httpVersion:this._request.requestHttpVersion(),headers:this._request.requestHeaders(),queryString:this._buildParameters(this._request.queryParameters||[]),cookies:this._buildCookies(this._request.requestCookies||[]),headersSize:headersText?headersText.length:-1,bodySize:this.requestBodySize};if(this._request.requestFormData)
res.postData=this._buildPostData();return res;},_buildResponse:function()
{var headersText=this._request.responseHeadersText;return{status:this._request.statusCode,statusText:this._request.statusText,httpVersion:this._request.responseHttpVersion(),headers:this._request.responseHeaders,cookies:this._buildCookies(this._request.responseCookies||[]),content:this._buildContent(),redirectURL:this._request.responseHeaderValue("Location")||"",headersSize:headersText?headersText.length:-1,bodySize:this.responseBodySize,_transferSize:this._request.transferSize,_error:this._request.localizedFailDescription};},_buildContent:function()
{var content={size:this._request.resourceSize,mimeType:this._request.mimeType||"x-unknown",};var compression=this.responseCompression;if(typeof compression==="number")
content.compression=compression;return content;},_buildTimings:function()
{var timing=this._request.timing;if(!timing)
return{blocked:-1,dns:-1,connect:-1,send:0,wait:0,receive:0,ssl:-1};function firstNonNegative(values)
{for(var i=0;i<values.length;++i){if(values[i]>=0)
return values[i];}
console.assert(false,"Incomplete request timing information.");}
var blocked=firstNonNegative([timing.dnsStart,timing.connectStart,timing.sendStart]);var dns=-1;if(timing.dnsStart>=0)
dns=firstNonNegative([timing.connectStart,timing.sendStart])-timing.dnsStart;var connect=-1;if(timing.connectStart>=0)
connect=timing.sendStart-timing.connectStart;var send=timing.sendEnd-timing.sendStart;var wait=timing.receiveHeadersEnd-timing.sendEnd;var receive=WebInspector.HAREntry._toMilliseconds(this._request.duration)-timing.receiveHeadersEnd;var ssl=-1;if(timing.sslStart>=0&&timing.sslEnd>=0)
ssl=timing.sslEnd-timing.sslStart;return{blocked:blocked,dns:dns,connect:connect,send:send,wait:wait,receive:receive,ssl:ssl};},_buildPostData:function()
{var res={mimeType:this._request.requestContentType(),text:this._request.requestFormData};if(this._request.formParameters)
res.params=this._buildParameters(this._request.formParameters);return res;},_buildParameters:function(parameters)
{return parameters.slice();},_buildRequestURL:function(url)
{return url.split("#",2)[0];},_buildCookies:function(cookies)
{return cookies.map(this._buildCookie.bind(this));},_buildCookie:function(cookie)
{return{name:cookie.name(),value:cookie.value(),path:cookie.path(),domain:cookie.domain(),expires:cookie.expiresDate(WebInspector.HARLog.pseudoWallTime(this._request,this._request.startTime)),httpOnly:cookie.httpOnly(),secure:cookie.secure()};},get requestBodySize()
{return!this._request.requestFormData?0:this._request.requestFormData.length;},get responseBodySize()
{if(this._request.cached()||this._request.statusCode===304)
return 0;if(!this._request.responseHeadersText)
return-1;return this._request.transferSize-this._request.responseHeadersText.length;},get responseCompression()
{if(this._request.cached()||this._request.statusCode===304||this._request.statusCode===206)
return;if(!this._request.responseHeadersText)
return;return this._request.resourceSize-this.responseBodySize;}}
WebInspector.HAREntry._toMilliseconds=function(time)
{return time===-1?-1:time*1000;}
WebInspector.HARLog=function(requests)
{this._requests=requests;}
WebInspector.HARLog.pseudoWallTime=function(request,monotonicTime)
{return new Date(request.pseudoWallTime(monotonicTime)*1000);}
WebInspector.HARLog.prototype={build:function()
{return{version:"1.2",creator:this._creator(),pages:this._buildPages(),entries:this._requests.map(this._convertResource.bind(this))}},_creator:function()
{var webKitVersion=/AppleWebKit\/([^ ]+)/.exec(window.navigator.userAgent);return{name:"WebInspector",version:webKitVersion?webKitVersion[1]:"n/a"};},_buildPages:function()
{var seenIdentifiers={};var pages=[];for(var i=0;i<this._requests.length;++i){var request=this._requests[i];var page=request.target().networkLog.pageLoadForRequest(request);if(!page||seenIdentifiers[page.id])
continue;seenIdentifiers[page.id]=true;pages.push(this._convertPage(page,request));}
return pages;},_convertPage:function(page,request)
{return{startedDateTime:WebInspector.HARLog.pseudoWallTime(request,page.startTime),id:"page_"+page.id,title:page.url,pageTimings:{onContentLoad:this._pageEventTime(page,page.contentLoadTime),onLoad:this._pageEventTime(page,page.loadTime)}}},_convertResource:function(request)
{return(new WebInspector.HAREntry(request)).build();},_pageEventTime:function(page,time)
{var startTime=page.startTime;if(time===-1||startTime===-1)
return-1;return WebInspector.HAREntry._toMilliseconds(time-startTime);}};WebInspector.NetworkLog=function(target)
{WebInspector.SDKObject.call(this,target);this._requests=[];this._requestForId={};target.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestStarted,this._onRequestStarted,this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._onMainFrameNavigated,this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.Load,this._onLoad,this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.DOMContentLoaded,this._onDOMContentLoaded,this);}
WebInspector.NetworkLog.requestForURL=function(url)
{for(var target of WebInspector.targetManager.targets()){var result=target.networkLog.requestForURL(url);if(result)
return result;}
return null;}
WebInspector.NetworkLog.requests=function()
{var result=[];for(var target of WebInspector.targetManager.targets()){result=result.concat(target.networkLog.requests());}
return result;}
WebInspector.NetworkLog.prototype={requests:function()
{return this._requests;},requestForURL:function(url)
{for(var i=0;i<this._requests.length;++i){if(this._requests[i].url===url)
return this._requests[i];}
return null;},pageLoadForRequest:function(request)
{return request.__page;},_onMainFrameNavigated:function(event)
{var mainFrame=event.data;this._currentPageLoad=null;var oldRequests=this._requests.splice(0,this._requests.length);this._requestForId={};for(var i=0;i<oldRequests.length;++i){var request=oldRequests[i];if(request.loaderId===mainFrame.loaderId){if(!this._currentPageLoad)
this._currentPageLoad=new WebInspector.PageLoad(request);this._requests.push(request);this._requestForId[request.requestId]=request;request.__page=this._currentPageLoad;}}},_onRequestStarted:function(event)
{var request=(event.data);this._requests.push(request);this._requestForId[request.requestId]=request;request.__page=this._currentPageLoad;},_onDOMContentLoaded:function(event)
{if(this._currentPageLoad)
this._currentPageLoad.contentLoadTime=event.data;},_onLoad:function(event)
{if(this._currentPageLoad)
this._currentPageLoad.loadTime=event.data;},requestForId:function(requestId)
{return this._requestForId[requestId];},__proto__:WebInspector.SDKObject.prototype}
WebInspector.PageLoad=function(mainRequest)
{this.id=++WebInspector.PageLoad._lastIdentifier;this.url=mainRequest.url;this.startTime=mainRequest.startTime;}
WebInspector.PageLoad._lastIdentifier=0;;WebInspector.ServiceWorkerManager=function(target)
{WebInspector.SDKObject.call(this,target);target.registerServiceWorkerDispatcher(new WebInspector.ServiceWorkerDispatcher(this));this._lastAnonymousTargetId=0;this._agent=target.serviceWorkerAgent();this._workers=new Map();this._registrations=new Map();this.enable();}
WebInspector.ServiceWorkerManager.Events={WorkersUpdated:"WorkersUpdated",RegistrationUpdated:"RegistrationUpdated",RegistrationDeleted:"RegistrationDeleted",DebugOnStartUpdated:"DebugOnStartUpdated"}
WebInspector.ServiceWorkerManager.prototype={enable:function()
{if(this._enabled)
return;this._enabled=true;this._agent.enable();WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.MainFrameNavigated,this._mainFrameNavigated,this);},disable:function()
{if(!this._enabled)
return;this._enabled=false;for(var worker of this._workers.values())
worker._connection.close();this._workers.clear();this._registrations.clear();this._agent.disable();WebInspector.targetManager.removeEventListener(WebInspector.TargetManager.Events.MainFrameNavigated,this._mainFrameNavigated,this);},workers:function()
{return this._workers.values();},hasWorkers:function()
{return!!this._workers.size;},debugOnStart:function()
{return!!this._debugOnStart;},setDebugOnStart:function(flag)
{this._agent.setDebugOnStart(flag);},setForceUpdateOnPageLoad:function(registrationId,flag)
{this._agent.setForceUpdateOnPageLoad(registrationId,flag);},registrations:function()
{return this._registrations;},findVersion:function(versionId)
{for(var registration of this.registrations().values()){var version=registration.versions.get(versionId);if(version)
return version;}
return null;},deleteRegistration:function(registrationId)
{var registration=this._registrations.get(registrationId);if(!registration)
return;if(registration._isRedundant()){this._registrations.delete(registrationId);this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationDeleted,registration);return;}
registration._deleting=true;for(var version of registration.versions.values())
this.stopWorker(version.id);this._unregister(registration.scopeURL);},updateRegistration:function(registrationId)
{var registration=this._registrations.get(registrationId);if(!registration)
return;this._agent.updateRegistration(registration.scopeURL);},deliverPushMessage:function(registrationId,data)
{var registration=this._registrations.get(registrationId);if(!registration)
return;var origin=WebInspector.ParsedURL.splitURLIntoPathComponents(registration.scopeURL)[0];this._agent.deliverPushMessage(origin,registrationId,data);},activateTarget:function(targetId)
{this._agent.activateTarget(targetId);},_unregister:function(scope)
{this._agent.unregister(scope);},startWorker:function(scope)
{this._agent.startWorker(scope);},stopWorker:function(versionId)
{this._agent.stopWorker(versionId);},inspectWorker:function(versionId)
{this._agent.inspectWorker(versionId);},getTargetInfo:function(targetId,callback)
{function innerCallback(error,targetInfo)
{if(error){console.error(error);callback(null);return;}
if(targetInfo)
callback(new WebInspector.TargetInfo(targetInfo));else
callback(null)}
this._agent.getTargetInfo(targetId,innerCallback);},_workerCreated:function(workerId,url,versionId)
{new WebInspector.ServiceWorker(this,workerId,url,versionId);},_workerTerminated:function(workerId)
{var worker=this._workers.get(workerId);if(!worker)
return;worker._closeConnection();this._workers.delete(workerId);this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.WorkersUpdated);},_dispatchMessage:function(workerId,message)
{var worker=this._workers.get(workerId);if(worker)
worker._connection.dispatch(message);},_workerRegistrationUpdated:function(registrations)
{for(var payload of registrations){var registration=this._registrations.get(payload.registrationId);if(!registration){registration=new WebInspector.ServiceWorkerRegistration(payload);this._registrations.set(payload.registrationId,registration);this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationUpdated,registration);continue;}
registration._update(payload);if(registration._shouldBeRemoved()){this._registrations.delete(registration.id);this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationDeleted,registration);}else{this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationUpdated,registration);}}},_workerVersionUpdated:function(versions)
{var registrations=new Set();for(var payload of versions){var registration=this._registrations.get(payload.registrationId);if(!registration)
continue;registration._updateVersion(payload);registrations.add(registration);}
for(var registration of registrations){if(registration._shouldBeRemoved()){this._registrations.delete(registration.id);this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationDeleted,registration);}else{this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationUpdated,registration);}}},_workerErrorReported:function(payload)
{var registration=this._registrations.get(payload.registrationId);if(!registration)
return;registration._addError(payload);this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationUpdated,registration);},_debugOnStartUpdated:function(flag)
{this._debugOnStart=flag;this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.DebugOnStartUpdated,flag);},_mainFrameNavigated:function(event)
{},__proto__:WebInspector.SDKObject.prototype}
WebInspector.ServiceWorker=function(manager,workerId,url,versionId)
{this._manager=manager;this._agent=manager.target().serviceWorkerAgent();this._workerId=workerId;this._connection=new WebInspector.ServiceWorkerConnection(this._agent,workerId);this._url=url;this._versionId=versionId;var parsedURL=url.asParsedURL();this._name=parsedURL?parsedURL.lastPathComponentWithFragment():"#"+(++WebInspector.ServiceWorker._lastAnonymousTargetId);this._scope=parsedURL.host+parsedURL.folderPathComponents;this._manager._workers.set(workerId,this);this._target=WebInspector.targetManager.createTarget(this._name,WebInspector.Target.Type.ServiceWorker,this._connection,manager.target());this._manager.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.WorkersUpdated);this._target.runtimeAgent().run();}
WebInspector.ServiceWorker._lastAnonymousTargetId=0;WebInspector.ServiceWorker.prototype={name:function()
{return this._name;},url:function()
{return this._url;},versionId:function()
{return this._versionId;},scope:function()
{return this._scope;},stop:function()
{this._agent.stop(this._workerId);},_closeConnection:function()
{this._connection._close();delete this._connection;}}
WebInspector.ServiceWorkerDispatcher=function(manager)
{this._manager=manager;}
WebInspector.ServiceWorkerDispatcher.prototype={workerCreated:function(workerId,url,versionId)
{this._manager._workerCreated(workerId,url,versionId);},workerTerminated:function(workerId)
{this._manager._workerTerminated(workerId);},dispatchMessage:function(workerId,message)
{this._manager._dispatchMessage(workerId,message);},workerRegistrationUpdated:function(registrations)
{this._manager._workerRegistrationUpdated(registrations);},workerVersionUpdated:function(versions)
{this._manager._workerVersionUpdated(versions);},workerErrorReported:function(errorMessage)
{this._manager._workerErrorReported(errorMessage);},debugOnStartUpdated:function(flag)
{this._manager._debugOnStartUpdated(flag);}}
WebInspector.ServiceWorkerConnection=function(agent,workerId)
{InspectorBackendClass.Connection.call(this);this.suppressErrorsForDomains(["Worker","Page","CSS","DOM","DOMStorage","Database","Network","IndexedDB"]);this._agent=agent;this._workerId=workerId;}
WebInspector.ServiceWorkerConnection.prototype={sendMessage:function(messageObject)
{this._agent.sendMessage(this._workerId,JSON.stringify(messageObject));},_close:function()
{this.connectionClosed("worker_terminated");},__proto__:InspectorBackendClass.Connection.prototype}
WebInspector.TargetInfo=function(payload)
{this.id=payload.id;this.type=payload.type;this.title=payload.title;this.url=payload.url;}
WebInspector.TargetInfo.prototype={isWebContents:function()
{return this.type=="web_contents";},isFrame:function()
{return this.type=="frame";},}
WebInspector.ServiceWorkerErrorMessage=function(payload)
{this.errorMessage=payload.errorMessage;this.sourceURL=payload.sourceURL;this.lineNumber=payload.lineNumber;this.columnNumber=payload.columnNumber;}
WebInspector.ServiceWorkerVersion=function(registration,payload)
{this.registration=registration;this._update(payload);this.errorMessages=[];}
WebInspector.ServiceWorkerVersion.Modes={Installing:"installing",Waiting:"waiting",Active:"active",Redundant:"redundant"}
WebInspector.ServiceWorkerVersion.prototype={_update:function(payload)
{this.id=payload.versionId;this.scriptURL=payload.scriptURL;this.runningStatus=payload.runningStatus;this.status=payload.status;this.scriptLastModified=payload.scriptLastModified;this.scriptResponseTime=payload.scriptResponseTime;this.controlledClients=[]
for(var i=0;i<payload.controlledClients.length;++i){this.controlledClients.push(payload.controlledClients[i]);}},isStartable:function()
{return!this.registration.isDeleted&&this.isActivated()&&this.isStopped();},isStoppedAndRedundant:function()
{return this.runningStatus==ServiceWorkerAgent.ServiceWorkerVersionRunningStatus.Stopped&&this.status==ServiceWorkerAgent.ServiceWorkerVersionStatus.Redundant;},isStopped:function()
{return this.runningStatus==ServiceWorkerAgent.ServiceWorkerVersionRunningStatus.Stopped;},isStarting:function()
{return this.runningStatus==ServiceWorkerAgent.ServiceWorkerVersionRunningStatus.Starting;},isRunning:function()
{return this.runningStatus==ServiceWorkerAgent.ServiceWorkerVersionRunningStatus.Running;},isStopping:function()
{return this.runningStatus==ServiceWorkerAgent.ServiceWorkerVersionRunningStatus.Stopping;},isNew:function()
{return this.status==ServiceWorkerAgent.ServiceWorkerVersionStatus.New;},isInstalling:function()
{return this.status==ServiceWorkerAgent.ServiceWorkerVersionStatus.Installing;},isInstalled:function()
{return this.status==ServiceWorkerAgent.ServiceWorkerVersionStatus.Installed;},isActivating:function()
{return this.status==ServiceWorkerAgent.ServiceWorkerVersionStatus.Activating;},isActivated:function()
{return this.status==ServiceWorkerAgent.ServiceWorkerVersionStatus.Activated;},isRedundant:function()
{return this.status==ServiceWorkerAgent.ServiceWorkerVersionStatus.Redundant;},mode:function()
{if(this.isNew()||this.isInstalling())
return WebInspector.ServiceWorkerVersion.Modes.Installing;else if(this.isInstalled())
return WebInspector.ServiceWorkerVersion.Modes.Waiting;else if(this.isActivating()||this.isActivated())
return WebInspector.ServiceWorkerVersion.Modes.Active;return WebInspector.ServiceWorkerVersion.Modes.Redundant;},_addError:function(payload)
{this.errorMessages.push(new WebInspector.ServiceWorkerErrorMessage(payload));}}
WebInspector.ServiceWorkerRegistration=function(payload)
{this._update(payload);this.versions=new Map();this._deleting=false;}
WebInspector.ServiceWorkerRegistration.prototype={_update:function(payload)
{this.id=payload.registrationId;this.scopeURL=payload.scopeURL;this.isDeleted=payload.isDeleted;this.forceUpdateOnPageLoad=payload.forceUpdateOnPageLoad;},_updateVersion:function(payload)
{var version=this.versions.get(payload.versionId);if(!version){version=new WebInspector.ServiceWorkerVersion(this,payload);this.versions.set(payload.versionId,version);return version;}
version._update(payload);return version;},_addError:function(payload)
{var version=this.versions.get(payload.versionId);if(version)
version._addError(payload);},_isRedundant:function()
{for(var version of this.versions.values()){if(!version.isStoppedAndRedundant())
return false;}
return true;},_hasErrorLog:function()
{for(var version of this.versions.values()){if(version.errorMessages.length)
return true;}
return false;},_shouldBeRemoved:function()
{return this._isRedundant()&&(!this._hasErrorLog()||this._deleting);}};WebInspector.TracingManagerClient=function()
{}
WebInspector.TracingManagerClient.prototype={tracingStarted:function(){},traceEventsCollected:function(events){},tracingComplete:function(){},tracingBufferUsage:function(usage){},eventsRetrievalProgress:function(progress){}}
WebInspector.TracingManager=function(target)
{this._target=target;target.registerTracingDispatcher(new WebInspector.TracingDispatcher(this));this._activeClient=null;this._eventBufferSize=0;this._eventsRetrieved=0;}
WebInspector.TracingManager.EventPayload;WebInspector.TracingManager.TransferMode={ReportEvents:"ReportEvents",ReturnAsStream:"ReturnAsStream"};WebInspector.TracingManager.prototype={target:function()
{return this._target;},_bufferUsage:function(usage,eventCount,percentFull)
{this._eventBufferSize=eventCount;this._activeClient.tracingBufferUsage(usage||percentFull||0);},_eventsCollected:function(events)
{this._activeClient.traceEventsCollected(events);this._eventsRetrieved+=events.length;if(!this._eventBufferSize)
return;if(this._eventsRetrieved>this._eventBufferSize)
this._eventsRetrieved=this._eventBufferSize;this._activeClient.eventsRetrievalProgress(this._eventsRetrieved/this._eventBufferSize);},_tracingComplete:function()
{this._eventBufferSize=0;this._eventsRetrieved=0;this._activeClient.tracingComplete();this._activeClient=null;this._finishing=false;},start:function(client,categoryFilter,options,callback)
{if(this._activeClient)
throw new Error("Tracing is already started");var bufferUsageReportingIntervalMs=500;this._activeClient=client;this._target.tracingAgent().start(categoryFilter,options,bufferUsageReportingIntervalMs,WebInspector.TracingManager.TransferMode.ReportEvents,callback);this._activeClient.tracingStarted();},stop:function()
{if(!this._activeClient)
throw new Error("Tracing is not started");if(this._finishing)
throw new Error("Tracing is already being stopped");this._finishing=true;this._target.tracingAgent().end();}}
WebInspector.TracingDispatcher=function(tracingManager)
{this._tracingManager=tracingManager;}
WebInspector.TracingDispatcher.prototype={bufferUsage:function(usage,eventCount,percentFull)
{this._tracingManager._bufferUsage(usage,eventCount,percentFull);},dataCollected:function(data)
{this._tracingManager._eventsCollected(data);},tracingComplete:function()
{this._tracingManager._tracingComplete();}};WebInspector.TracingModel=function(backingStorage)
{this.reset();this._backingStorage=backingStorage;}
WebInspector.TracingModel.Phase={Begin:"B",End:"E",Complete:"X",Instant:"I",AsyncBegin:"S",AsyncStepInto:"T",AsyncStepPast:"p",AsyncEnd:"F",NestableAsyncBegin:"b",NestableAsyncEnd:"e",NestableAsyncInstant:"n",FlowBegin:"s",FlowStep:"t",FlowEnd:"f",Metadata:"M",Counter:"C",Sample:"P",CreateObject:"N",SnapshotObject:"O",DeleteObject:"D"};WebInspector.TracingModel.MetadataEvent={ProcessSortIndex:"process_sort_index",ProcessName:"process_name",ThreadSortIndex:"thread_sort_index",ThreadName:"thread_name"}
WebInspector.TracingModel.TopLevelEventCategory="toplevel";WebInspector.TracingModel.DevToolsMetadataEventCategory="disabled-by-default-devtools.timeline";WebInspector.TracingModel.DevToolsTimelineEventCategory="disabled-by-default-devtools.timeline";WebInspector.TracingModel.FrameLifecycleEventCategory="cc,devtools";WebInspector.TracingModel._nestableAsyncEventsString=WebInspector.TracingModel.Phase.NestableAsyncBegin+
WebInspector.TracingModel.Phase.NestableAsyncEnd+
WebInspector.TracingModel.Phase.NestableAsyncInstant;WebInspector.TracingModel._legacyAsyncEventsString=WebInspector.TracingModel.Phase.AsyncBegin+
WebInspector.TracingModel.Phase.AsyncEnd+
WebInspector.TracingModel.Phase.AsyncStepInto+
WebInspector.TracingModel.Phase.AsyncStepPast;WebInspector.TracingModel._flowEventsString=WebInspector.TracingModel.Phase.FlowBegin+
WebInspector.TracingModel.Phase.FlowStep+
WebInspector.TracingModel.Phase.FlowEnd;WebInspector.TracingModel._asyncEventsString=WebInspector.TracingModel._nestableAsyncEventsString+WebInspector.TracingModel._legacyAsyncEventsString;WebInspector.TracingModel.isNestableAsyncPhase=function(phase)
{return WebInspector.TracingModel._nestableAsyncEventsString.indexOf(phase)>=0;}
WebInspector.TracingModel.isAsyncBeginPhase=function(phase)
{return phase===WebInspector.TracingModel.Phase.AsyncBegin||phase===WebInspector.TracingModel.Phase.NestableAsyncBegin;}
WebInspector.TracingModel.isAsyncPhase=function(phase)
{return WebInspector.TracingModel._asyncEventsString.indexOf(phase)>=0;}
WebInspector.TracingModel.isFlowPhase=function(phase)
{return WebInspector.TracingModel._flowEventsString.indexOf(phase)>=0;}
WebInspector.TracingModel.isTopLevelEvent=function(event)
{return event.hasCategory(WebInspector.TracingModel.TopLevelEventCategory)||event.hasCategory(WebInspector.TracingModel.DevToolsMetadataEventCategory)&&event.name==="Program";}
WebInspector.BackingStorage=function()
{}
WebInspector.BackingStorage.prototype={appendString:function(string){},appendAccessibleString:function(string){},finishWriting:function(){},reset:function(){},}
WebInspector.TracingModel.prototype={devToolsMetadataEvents:function()
{return this._devToolsMetadataEvents;},setEventsForTest:function(events)
{this.reset();this.addEvents(events);this.tracingComplete();},addEvents:function(events)
{for(var i=0;i<events.length;++i)
this._addEvent(events[i]);},tracingComplete:function()
{this._processPendingAsyncEvents();this._backingStorage.finishWriting();for(var process of Object.values(this._processById)){for(var thread of Object.values(process._threads))
thread.tracingComplete();}},reset:function()
{this._processById={};this._processByName=new Map();this._minimumRecordTime=0;this._maximumRecordTime=0;this._devToolsMetadataEvents=[];if(this._backingStorage)
this._backingStorage.reset();this._appendDelimiter=false;this._asyncEvents=[];this._openAsyncEvents=new Map();this._openNestableAsyncEvents=new Map();this._parsedCategories=new Map();},_addEvent:function(payload)
{var process=this._processById[payload.pid];if(!process){process=new WebInspector.TracingModel.Process(this,payload.pid);this._processById[payload.pid]=process;}
var eventsDelimiter=",\n";if(this._appendDelimiter)
this._backingStorage.appendString(eventsDelimiter);this._appendDelimiter=true;var stringPayload=JSON.stringify(payload);var isAccessible=payload.ph===WebInspector.TracingModel.Phase.SnapshotObject;var backingStorage=null;var keepStringsLessThan=10000;if(isAccessible&&stringPayload.length>keepStringsLessThan)
backingStorage=this._backingStorage.appendAccessibleString(stringPayload);else
this._backingStorage.appendString(stringPayload);if(payload.ph!==WebInspector.TracingModel.Phase.Metadata){var timestamp=payload.ts/1000;if(timestamp&&(!this._minimumRecordTime||timestamp<this._minimumRecordTime))
this._minimumRecordTime=timestamp;var endTimeStamp=(payload.ts+(payload.dur||0))/1000;this._maximumRecordTime=Math.max(this._maximumRecordTime,endTimeStamp);var event=process._addEvent(payload);if(!event)
return;if(WebInspector.TracingModel.isAsyncPhase(payload.ph))
this._asyncEvents.push(event);event._setBackingStorage(backingStorage);if(event.hasCategory(WebInspector.TracingModel.DevToolsMetadataEventCategory))
this._devToolsMetadataEvents.push(event);return;}
switch(payload.name){case WebInspector.TracingModel.MetadataEvent.ProcessSortIndex:process._setSortIndex(payload.args["sort_index"]);break;case WebInspector.TracingModel.MetadataEvent.ProcessName:var processName=payload.args["name"];process._setName(processName);this._processByName.set(processName,process);break;case WebInspector.TracingModel.MetadataEvent.ThreadSortIndex:process.threadById(payload.tid)._setSortIndex(payload.args["sort_index"]);break;case WebInspector.TracingModel.MetadataEvent.ThreadName:process.threadById(payload.tid)._setName(payload.args["name"]);break;}},minimumRecordTime:function()
{return this._minimumRecordTime;},maximumRecordTime:function()
{return this._maximumRecordTime;},sortedProcesses:function()
{return WebInspector.TracingModel.NamedObject._sort(Object.values(this._processById));},processByName:function(name)
{return this._processByName.get(name);},threadByName:function(processName,threadName)
{var process=this.processByName(processName);return process&&process.threadByName(threadName);},_processPendingAsyncEvents:function()
{this._asyncEvents.sort(WebInspector.TracingModel.Event.compareStartTime);for(var i=0;i<this._asyncEvents.length;++i){var event=this._asyncEvents[i];if(WebInspector.TracingModel.isNestableAsyncPhase(event.phase))
this._addNestableAsyncEvent(event);else
this._addAsyncEvent(event);}
this._asyncEvents=[];this._closeOpenAsyncEvents();},_closeOpenAsyncEvents:function()
{for(var event of this._openAsyncEvents.values()){event.setEndTime(this._maximumRecordTime);event.steps[0].setEndTime(this._maximumRecordTime);}
this._openAsyncEvents.clear();for(var eventStack of this._openNestableAsyncEvents.values()){while(eventStack.length)
eventStack.pop().setEndTime(this._maximumRecordTime);}
this._openNestableAsyncEvents.clear();},_addNestableAsyncEvent:function(event)
{var phase=WebInspector.TracingModel.Phase;var key=event.categoriesString+"."+event.id;var openEventsStack=this._openNestableAsyncEvents.get(key);switch(event.phase){case phase.NestableAsyncBegin:if(!openEventsStack){openEventsStack=[];this._openNestableAsyncEvents.set(key,openEventsStack);}
var asyncEvent=new WebInspector.TracingModel.AsyncEvent(event);openEventsStack.push(asyncEvent);event.thread._addAsyncEvent(asyncEvent);break;case phase.NestableAsyncInstant:if(openEventsStack&&openEventsStack.length)
openEventsStack.peekLast()._addStep(event);break;case phase.NestableAsyncEnd:if(!openEventsStack||!openEventsStack.length)
break;var top=openEventsStack.pop();if(top.name!==event.name){console.error("Begin/end event mismatch for nestable async event, "+top.name+" vs. "+event.name);break;}
top._addStep(event);}},_addAsyncEvent:function(event)
{var phase=WebInspector.TracingModel.Phase;var key=event.categoriesString+"."+event.name+"."+event.id;var asyncEvent=this._openAsyncEvents.get(key);if(event.phase===phase.AsyncBegin){if(asyncEvent){console.error("Event "+event.name+" has already been started");return;}
asyncEvent=new WebInspector.TracingModel.AsyncEvent(event);this._openAsyncEvents.set(key,asyncEvent);event.thread._addAsyncEvent(asyncEvent);return;}
if(!asyncEvent){return;}
if(event.phase===phase.AsyncEnd){asyncEvent._addStep(event);this._openAsyncEvents.delete(key);return;}
if(event.phase===phase.AsyncStepInto||event.phase===phase.AsyncStepPast){var lastStep=asyncEvent.steps.peekLast();if(lastStep.phase!==phase.AsyncBegin&&lastStep.phase!==event.phase){console.assert(false,"Async event step phase mismatch: "+lastStep.phase+" at "+lastStep.startTime+" vs. "+event.phase+" at "+event.startTime);return;}
asyncEvent._addStep(event);return;}
console.assert(false,"Invalid async event phase");},_parsedCategoriesForString:function(str)
{var parsedCategories=this._parsedCategories.get(str);if(!parsedCategories){parsedCategories=new Set(str.split(","));this._parsedCategories.set(str,parsedCategories);}
return parsedCategories;}}
WebInspector.TracingModel.Event=function(categories,name,phase,startTime,thread)
{this.categoriesString=categories;this._parsedCategories=thread._model._parsedCategoriesForString(categories);this.name=name;this.phase=phase;this.startTime=startTime;this.thread=thread;this.args={};this.warning=null;this.initiator=null;this.stackTrace=null;this.previewElement=null;this.url=null;this.backendNodeId=0;this.selfTime=0;}
WebInspector.TracingModel.Event.fromPayload=function(payload,thread)
{var event=new WebInspector.TracingModel.Event(payload.cat,payload.name,(payload.ph),payload.ts/1000,thread);if(payload.args)
event.addArgs(payload.args);else
console.error("Missing mandatory event argument 'args' at "+payload.ts/1000);if(typeof payload.dur==="number")
event.setEndTime((payload.ts+payload.dur)/1000);if(payload.id)
event.id=payload.id;return event;}
WebInspector.TracingModel.Event.prototype={hasCategory:function(categoryName)
{return this._parsedCategories.has(categoryName);},setEndTime:function(endTime)
{if(endTime<this.startTime){console.assert(false,"Event out of order: "+this.name);return;}
this.endTime=endTime;this.duration=endTime-this.startTime;},addArgs:function(args)
{for(var name in args){if(name in this.args)
console.error("Same argument name ("+name+") is used for begin and end phases of "+this.name);this.args[name]=args[name];}},_complete:function(endEvent)
{if(endEvent.args)
this.addArgs(endEvent.args);else
console.error("Missing mandatory event argument 'args' at "+endEvent.startTime);this.setEndTime(endEvent.startTime);},_setBackingStorage:function(backingStorage)
{}}
WebInspector.TracingModel.Event.compareStartTime=function(a,b)
{return a.startTime-b.startTime;}
WebInspector.TracingModel.Event.orderedCompareStartTime=function(a,b)
{return a.startTime-b.startTime||a.ordinal-b.ordinal||-1;}
WebInspector.TracingModel.ObjectSnapshot=function(category,name,startTime,thread)
{WebInspector.TracingModel.Event.call(this,category,name,WebInspector.TracingModel.Phase.SnapshotObject,startTime,thread);}
WebInspector.TracingModel.ObjectSnapshot.fromPayload=function(payload,thread)
{var snapshot=new WebInspector.TracingModel.ObjectSnapshot(payload.cat,payload.name,payload.ts/1000,thread);if(payload.id)
snapshot.id=payload.id;if(!payload.args||!payload.args["snapshot"]){console.error("Missing mandatory 'snapshot' argument at "+payload.ts/1000);return snapshot;}
if(payload.args)
snapshot.addArgs(payload.args);return snapshot;}
WebInspector.TracingModel.ObjectSnapshot.prototype={requestObject:function(callback)
{var snapshot=this.args["snapshot"];if(snapshot){callback(snapshot);return;}
this._backingStorage().then(onRead,callback.bind(null,null));function onRead(result)
{if(!result){callback(null);return;}
try{var payload=JSON.parse(result);callback(payload["args"]["snapshot"]);}catch(e){WebInspector.console.error("Malformed event data in backing storage");callback(null);}}},objectPromise:function()
{if(!this._objectPromise)
this._objectPromise=new Promise(this.requestObject.bind(this));return this._objectPromise;},_setBackingStorage:function(backingStorage)
{if(!backingStorage)
return;this._backingStorage=backingStorage;this.args={};},__proto__:WebInspector.TracingModel.Event.prototype}
WebInspector.TracingModel.AsyncEvent=function(startEvent)
{WebInspector.TracingModel.Event.call(this,startEvent.categoriesString,startEvent.name,startEvent.phase,startEvent.startTime,startEvent.thread)
this.addArgs(startEvent.args);this.steps=[startEvent];}
WebInspector.TracingModel.AsyncEvent.prototype={_addStep:function(event)
{this.steps.push(event)
if(event.phase===WebInspector.TracingModel.Phase.AsyncEnd||event.phase===WebInspector.TracingModel.Phase.NestableAsyncEnd){this.setEndTime(event.startTime);this.steps[0].setEndTime(event.startTime);}},__proto__:WebInspector.TracingModel.Event.prototype}
WebInspector.TracingModel.NamedObject=function()
{}
WebInspector.TracingModel.NamedObject.prototype={_setName:function(name)
{this._name=name;},name:function()
{return this._name;},_setSortIndex:function(sortIndex)
{this._sortIndex=sortIndex;},}
WebInspector.TracingModel.NamedObject._sort=function(array)
{function comparator(a,b)
{return a._sortIndex!==b._sortIndex?a._sortIndex-b._sortIndex:a.name().localeCompare(b.name());}
return array.sort(comparator);}
WebInspector.TracingModel.Process=function(model,id)
{WebInspector.TracingModel.NamedObject.call(this);this._setName("Process "+id);this._id=id;this._threads={};this._threadByName=new Map();this._model=model;}
WebInspector.TracingModel.Process.prototype={id:function()
{return this._id;},threadById:function(id)
{var thread=this._threads[id];if(!thread){thread=new WebInspector.TracingModel.Thread(this,id);this._threads[id]=thread;}
return thread;},threadByName:function(name)
{return this._threadByName.get(name)||null;},_setThreadByName:function(name,thread)
{this._threadByName.set(name,thread);},_addEvent:function(payload)
{return this.threadById(payload.tid)._addEvent(payload);},sortedThreads:function()
{return WebInspector.TracingModel.NamedObject._sort(Object.values(this._threads));},__proto__:WebInspector.TracingModel.NamedObject.prototype}
WebInspector.TracingModel.Thread=function(process,id)
{WebInspector.TracingModel.NamedObject.call(this);this._process=process;this._setName("Thread "+id);this._events=[];this._asyncEvents=[];this._id=id;this._model=process._model;}
WebInspector.TracingModel.Thread.prototype={tracingComplete:function()
{this._asyncEvents.stableSort(WebInspector.TracingModel.Event.compareStartTime);this._events.stableSort(WebInspector.TracingModel.Event.compareStartTime);var phases=WebInspector.TracingModel.Phase;var stack=[];for(var i=0;i<this._events.length;++i){var e=this._events[i];e.ordinal=i;switch(e.phase){case phases.End:this._events[i]=null;if(!stack.length)
continue;var top=stack.pop();if(top.name!==e.name||top.categoriesString!==e.categoriesString)
console.error("B/E events mismatch at "+top.startTime+" ("+top.name+") vs. "+e.startTime+" ("+e.name+")");else
top._complete(e);break;case phases.Begin:stack.push(e);break;}}
this._events.remove(null,false);},_addEvent:function(payload)
{var event=payload.ph===WebInspector.TracingModel.Phase.SnapshotObject?WebInspector.TracingModel.ObjectSnapshot.fromPayload(payload,this):WebInspector.TracingModel.Event.fromPayload(payload,this);if(WebInspector.TracingModel.isTopLevelEvent(event)){if(this._lastTopLevelEvent&&this._lastTopLevelEvent.endTime>event.startTime)
return null;this._lastTopLevelEvent=event;}
this._events.push(event);return event;},_addAsyncEvent:function(asyncEvent)
{this._asyncEvents.push(asyncEvent);},_setName:function(name)
{WebInspector.TracingModel.NamedObject.prototype._setName.call(this,name);this._process._setThreadByName(name,this);},id:function()
{return this._id;},process:function()
{return this._process;},events:function()
{return this._events;},asyncEvents:function()
{return this._asyncEvents;},__proto__:WebInspector.TracingModel.NamedObject.prototype};WebInspector.WorkerManager=function(target)
{WebInspector.SDKObject.call(this,target);target.registerWorkerDispatcher(new WebInspector.WorkerDispatcher(this));this._lastAnonymousTargetId=0;this._connections=new Map();this._targetsByWorkerId=new Map();WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged,this._onSuspendStateChanged,this);this._onSuspendStateChanged();this.enable();}
WebInspector.WorkerManager.prototype={enable:function()
{if(this._enabled)
return;this._enabled=true;this.target().workerAgent().enable();this.target().resourceTreeModel.addEventListener(WebInspector.TargetManager.Events.MainFrameNavigated,this._mainFrameNavigated,this);},disable:function()
{if(!this._enabled)
return;this._enabled=false;this._reset();this.target().workerAgent().disable();this.target().resourceTreeModel.removeEventListener(WebInspector.TargetManager.Events.MainFrameNavigated,this._mainFrameNavigated,this);},dispose:function()
{this._reset();},_reset:function()
{for(var connection of this._connections.values())
connection._close();this._connections.clear();this._targetsByWorkerId.clear();},_onSuspendStateChanged:function()
{var suspended=WebInspector.targetManager.allTargetsSuspended();this.target().workerAgent().setAutoconnectToWorkers(!suspended);},_workerCreated:function(workerId,url,inspectorConnected)
{var connection=new WebInspector.WorkerConnection(this,workerId,inspectorConnected,onConnectionReady.bind(this));this._connections.set(workerId,connection);function onConnectionReady(connection)
{var parsedURL=url.asParsedURL();var workerName=parsedURL?parsedURL.lastPathComponentWithFragment():"#"+(++this._lastAnonymousTargetId);var target=WebInspector.targetManager.createTarget(workerName,WebInspector.Target.Type.DedicatedWorker,connection,this.target());this._targetsByWorkerId.set(workerId,target);if(inspectorConnected)
target.runtimeAgent().isRunRequired(pauseInDebuggerAndRunIfRequired.bind(null,target));}
function pauseInDebuggerAndRunIfRequired(target,error,required)
{var mainIsServiceWorker=WebInspector.targetManager.mainTarget().isServiceWorker();if(mainIsServiceWorker&&required)
target.debuggerAgent().pause();target.runtimeAgent().run();}},_workerTerminated:function(workerId)
{var connection=this._connections.get(workerId);if(connection)
connection._close();this._connections.delete(workerId);this._targetsByWorkerId.delete(workerId);},_dispatchMessageFromWorker:function(workerId,message)
{var connection=this._connections.get(workerId);if(connection)
connection.dispatch(message);},_mainFrameNavigated:function(event)
{this._reset();},targetByWorkerId:function(workerId)
{return this._targetsByWorkerId.get(workerId)||null;},__proto__:WebInspector.SDKObject.prototype}
WebInspector.WorkerDispatcher=function(workerManager)
{this._workerManager=workerManager;}
WebInspector.WorkerDispatcher.prototype={workerCreated:function(workerId,url,inspectorConnected)
{this._workerManager._workerCreated(workerId,url,inspectorConnected);},workerTerminated:function(workerId)
{this._workerManager._workerTerminated(workerId);},dispatchMessageFromWorker:function(workerId,message)
{this._workerManager._dispatchMessageFromWorker(workerId,message);}}
WebInspector.WorkerConnection=function(workerManager,workerId,inspectorConnected,onConnectionReady)
{InspectorBackendClass.Connection.call(this);this.suppressErrorsForDomains(["Worker","Page","CSS","DOM","DOMStorage","Database","Network","IndexedDB"]);this._agent=workerManager.target().workerAgent();this._workerId=workerId;if(!inspectorConnected)
this._agent.connectToWorker(workerId,onConnectionReady.bind(null,this));else
onConnectionReady.call(null,this);}
WebInspector.WorkerConnection.prototype={sendMessage:function(messageObject)
{this._agent.sendMessageToWorker(this._workerId,JSON.stringify(messageObject));},_close:function()
{this.connectionClosed("worker_terminated");},__proto__:InspectorBackendClass.Connection.prototype};WebInspector.RuntimeModel=function(target)
{WebInspector.SDKModel.call(this,WebInspector.RuntimeModel,target);this._agent=target.runtimeAgent();this.target().registerRuntimeDispatcher(new WebInspector.RuntimeDispatcher(this));if(target.hasJSContext())
this._agent.enable();this._executionContextById={};if(WebInspector.moduleSetting("customFormatters").get())
this._agent.setCustomObjectFormatterEnabled(true);WebInspector.moduleSetting("customFormatters").addChangeListener(this._customFormattersStateChanged.bind(this));}
WebInspector.RuntimeModel.Events={ExecutionContextCreated:"ExecutionContextCreated",ExecutionContextDestroyed:"ExecutionContextDestroyed",}
WebInspector.RuntimeModel._privateScript="private script";WebInspector.RuntimeModel.prototype={executionContexts:function()
{return Object.values(this._executionContextById);},executionContext:function(id)
{return this._executionContextById[id]||null;},_executionContextCreated:function(context)
{if(context.name==WebInspector.RuntimeModel._privateScript&&!context.origin&&!Runtime.experiments.isEnabled("privateScriptInspection")){return;}
var executionContext=new WebInspector.ExecutionContext(this.target(),context.id,context.name,context.origin,!context.type,context.frameId);this._executionContextById[executionContext.id]=executionContext;this.dispatchEventToListeners(WebInspector.RuntimeModel.Events.ExecutionContextCreated,executionContext);},_executionContextDestroyed:function(executionContextId)
{var executionContext=this._executionContextById[executionContextId];if(!executionContext)
return;delete this._executionContextById[executionContextId];this.dispatchEventToListeners(WebInspector.RuntimeModel.Events.ExecutionContextDestroyed,executionContext);},_executionContextsCleared:function()
{var contexts=this.executionContexts();this._executionContextById={};for(var i=0;i<contexts.length;++i)
this.dispatchEventToListeners(WebInspector.RuntimeModel.Events.ExecutionContextDestroyed,contexts[i]);},createRemoteObject:function(payload)
{console.assert(typeof payload==="object","Remote object payload should only be an object");return new WebInspector.RemoteObjectImpl(this.target(),payload.objectId,payload.type,payload.subtype,payload.value,payload.description,payload.preview,payload.customPreview);},createScopeRemoteObject:function(payload,scopeRef)
{return new WebInspector.ScopeRemoteObject(this.target(),payload.objectId,scopeRef,payload.type,payload.subtype,payload.value,payload.description,payload.preview);},createRemoteObjectFromPrimitiveValue:function(value)
{return new WebInspector.RemoteObjectImpl(this.target(),undefined,typeof value,undefined,value);},createRemotePropertyFromPrimitiveValue:function(name,value)
{return new WebInspector.RemoteObjectProperty(name,this.createRemoteObjectFromPrimitiveValue(value));},_customFormattersStateChanged:function(event)
{var enabled=(event.data);this._agent.setCustomObjectFormatterEnabled(enabled);},__proto__:WebInspector.SDKModel.prototype}
WebInspector.RuntimeDispatcher=function(runtimeModel)
{this._runtimeModel=runtimeModel;}
WebInspector.RuntimeDispatcher.prototype={executionContextCreated:function(context)
{this._runtimeModel._executionContextCreated(context);},executionContextDestroyed:function(executionContextId)
{this._runtimeModel._executionContextDestroyed(executionContextId);},executionContextsCleared:function()
{this._runtimeModel._executionContextsCleared();}}
WebInspector.ExecutionContext=function(target,id,name,origin,isPageContext,frameId)
{WebInspector.SDKObject.call(this,target);this.id=id;this.name=name;this.origin=origin;this.isMainWorldContext=isPageContext;this.runtimeModel=target.runtimeModel;this.debuggerModel=WebInspector.DebuggerModel.fromTarget(target);this.frameId=frameId;}
WebInspector.ExecutionContext.comparator=function(a,b)
{function targetWeight(target)
{if(target.isPage())
return 3;if(target.isDedicatedWorker())
return 2;return 1;}
var weightDiff=targetWeight(a.target())-targetWeight(b.target());if(weightDiff)
return-weightDiff;var frameIdDiff=String.hashCode(a.frameId)-String.hashCode(b.frameId);if(frameIdDiff)
return frameIdDiff;if(a.isMainWorldContext)
return-1;if(b.isMainWorldContext)
return+1;return a.name.localeCompare(b.name);}
WebInspector.ExecutionContext.prototype={evaluate:function(expression,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,returnByValue,generatePreview,callback)
{if(this.debuggerModel.selectedCallFrame()){this.debuggerModel.evaluateOnSelectedCallFrame(expression,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,returnByValue,generatePreview,callback);return;}
this._evaluateGlobal.apply(this,arguments);},globalObject:function(objectGroup,returnByValue,generatePreview,callback)
{this._evaluateGlobal("this",objectGroup,false,true,returnByValue,generatePreview,callback);},_evaluateGlobal:function(expression,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,returnByValue,generatePreview,callback)
{if(!expression){expression="this";}
function evalCallback(error,result,wasThrown,exceptionDetails)
{if(error){callback(null,false);return;}
if(returnByValue)
callback(null,!!wasThrown,wasThrown?null:result,exceptionDetails);else
callback(this.runtimeModel.createRemoteObject(result),!!wasThrown,undefined,exceptionDetails);}
this.target().runtimeAgent().evaluate(expression,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,this.id,returnByValue,generatePreview,evalCallback.bind(this));},completionsForExpression:function(expressionString,text,cursorOffset,prefix,force,completionsReadyCallback)
{var lastIndex=expressionString.length-1;var dotNotation=(expressionString[lastIndex]===".");var bracketNotation=(expressionString[lastIndex]==="[");if(dotNotation||bracketNotation)
expressionString=expressionString.substr(0,lastIndex);if(expressionString&&parseInt(expressionString,10)==expressionString){completionsReadyCallback([]);return;}
if(!prefix&&!expressionString&&!force){completionsReadyCallback([]);return;}
if(!expressionString&&this.debuggerModel.selectedCallFrame())
this.debuggerModel.selectedCallFrame().variableNames(receivedPropertyNames.bind(this));else
this.evaluate(expressionString,"completion",true,true,false,false,evaluated.bind(this));function evaluated(result,wasThrown)
{if(!result||wasThrown){completionsReadyCallback([]);return;}
function getCompletions(type)
{var object;if(type==="string")
object=new String("");else if(type==="number")
object=new Number(0);else if(type==="boolean")
object=new Boolean(false);else
object=this;var resultSet={};for(var o=object;o;o=o.__proto__){try{if(type==="array"&&o===object&&ArrayBuffer.isView(o)&&o.length>9999)
continue;var names=Object.getOwnPropertyNames(o);for(var i=0;i<names.length;++i)
resultSet[names[i]]=true;}catch(e){}}
return resultSet;}
if(result.type==="object"||result.type==="function")
result.callFunctionJSON(getCompletions,[WebInspector.RemoteObject.toCallArgument(result.subtype)],receivedPropertyNames.bind(this));else if(result.type==="string"||result.type==="number"||result.type==="boolean")
this.evaluate("("+getCompletions+")(\""+result.type+"\")","completion",false,true,true,false,receivedPropertyNamesFromEval.bind(this));}
function receivedPropertyNamesFromEval(notRelevant,wasThrown,result)
{if(result&&!wasThrown)
receivedPropertyNames.call(this,result.value);else
completionsReadyCallback([]);}
function receivedPropertyNames(propertyNames)
{this.target().runtimeAgent().releaseObjectGroup("completion");if(!propertyNames){completionsReadyCallback([]);return;}
var includeCommandLineAPI=(!dotNotation&&!bracketNotation);if(includeCommandLineAPI){const commandLineAPI=["dir","dirxml","keys","values","profile","profileEnd","monitorEvents","unmonitorEvents","inspect","copy","clear","getEventListeners","debug","undebug","monitor","unmonitor","table","$","$$","$x"];for(var i=0;i<commandLineAPI.length;++i)
propertyNames[commandLineAPI[i]]=true;}
this._reportCompletions(completionsReadyCallback,dotNotation,bracketNotation,expressionString,prefix,Object.keys(propertyNames));}},_reportCompletions:function(completionsReadyCallback,dotNotation,bracketNotation,expressionString,prefix,properties){if(bracketNotation){if(prefix.length&&prefix[0]==="'")
var quoteUsed="'";else
var quoteUsed="\"";}
var results=[];if(!expressionString){const keywords=["break","case","catch","continue","default","delete","do","else","finally","for","function","if","in","instanceof","new","return","switch","this","throw","try","typeof","var","void","while","with"];properties=properties.concat(keywords);}
properties.sort();for(var i=0;i<properties.length;++i){var property=properties[i];if(dotNotation&&!/^[a-zA-Z_$\u008F-\uFFFF][a-zA-Z0-9_$\u008F-\uFFFF]*$/.test(property))
continue;if(bracketNotation){if(!/^[0-9]+$/.test(property))
property=quoteUsed+property.escapeCharacters(quoteUsed+"\\")+quoteUsed;property+="]";}
if(property.length<prefix.length)
continue;if(prefix.length&&!property.startsWith(prefix))
continue;results.push(property.split("\n").join("\\n"));}
completionsReadyCallback(results);},__proto__:WebInspector.SDKObject.prototype}
WebInspector.EventListener=function(target,type,useCapture,handler,originalHandler,location,removeFunction,listenerType)
{WebInspector.SDKObject.call(this,target);this._type=type;this._useCapture=useCapture;this._handler=handler;this._originalHandler=originalHandler||handler;this._location=location;this._sourceURL=location.script().contentURL();this._removeFunction=removeFunction;this._listenerType=listenerType||"normal";}
WebInspector.EventListener.prototype={type:function()
{return this._type;},useCapture:function()
{return this._useCapture;},handler:function()
{return this._handler;},location:function()
{return this._location;},sourceURL:function()
{return this._sourceURL;},originalHandler:function()
{return this._originalHandler;},removeFunction:function()
{return this._removeFunction;},remove:function()
{if(!this._removeFunction)
return Promise.resolve();return new Promise(promiseConstructor.bind(this));function promiseConstructor(success)
{this._removeFunction.callFunction(callCustomRemove,[WebInspector.RemoteObject.toCallArgument(this._removeFunction),WebInspector.RemoteObject.toCallArgument(this._type),WebInspector.RemoteObject.toCallArgument(this._originalHandler),WebInspector.RemoteObject.toCallArgument(this._useCapture)],success);function callCustomRemove(func,type,listener,useCapture)
{func.call(null,type,listener,useCapture);}}},listenerType:function()
{return this._listenerType;},setListenerType:function(listenerType)
{this._listenerType=listenerType;},__proto__:WebInspector.SDKObject.prototype};WebInspector.Script=function(debuggerModel,scriptId,sourceURL,startLine,startColumn,endLine,endColumn,executionContextId,isContentScript,isInternalScript,isLiveEdit,sourceMapURL,hasSourceURL)
{WebInspector.SDKObject.call(this,debuggerModel.target());this.debuggerModel=debuggerModel;this.scriptId=scriptId;this.sourceURL=sourceURL;this.lineOffset=startLine;this.columnOffset=startColumn;this.endLine=endLine;this.endColumn=endColumn;this._executionContextId=executionContextId;this._isContentScript=isContentScript;this._isInternalScript=isInternalScript;this._isLiveEdit=isLiveEdit;this.sourceMapURL=sourceMapURL;this.hasSourceURL=hasSourceURL;}
WebInspector.Script.Events={ScriptEdited:"ScriptEdited",SourceMapURLAdded:"SourceMapURLAdded",}
WebInspector.Script.sourceURLRegex=/^[\040\t]*\/\/# sourceURL=\s*(\S*?)\s*$/m;WebInspector.Script._trimSourceURLComment=function(source)
{var sourceURLIndex=source.lastIndexOf("//# sourceURL=");if(sourceURLIndex===-1)
return source;var sourceURLLineIndex=source.lastIndexOf("\n",sourceURLIndex);if(sourceURLLineIndex===-1)
return source;var sourceURLLine=source.substr(sourceURLLineIndex+1).split("\n",1)[0];if(sourceURLLine.search(WebInspector.Script.sourceURLRegex)===-1)
return source;return source.substr(0,sourceURLLineIndex)+source.substr(sourceURLLineIndex+sourceURLLine.length+1);}
WebInspector.Script.prototype={isContentScript:function()
{return this._isContentScript;},isInternalScript:function()
{return this._isInternalScript;},executionContext:function()
{return this.target().runtimeModel.executionContext(this._executionContextId);},isLiveEdit:function()
{return this._isLiveEdit;},contentURL:function()
{return this.sourceURL;},contentType:function()
{return WebInspector.resourceTypes.Script;},requestContent:function(callback)
{if(this._source){callback(this._source);return;}
function didGetScriptSource(error,source)
{this._source=WebInspector.Script._trimSourceURLComment(error?"":source);callback(this._source);}
if(this.scriptId){this.target().debuggerAgent().getScriptSource(this.scriptId,didGetScriptSource.bind(this));}else
callback("");},searchInContent:function(query,caseSensitive,isRegex,callback)
{function innerCallback(error,searchMatches)
{if(error){console.error(error);callback([]);return;}
var result=[];for(var i=0;i<searchMatches.length;++i){var searchMatch=new WebInspector.ContentProvider.SearchMatch(searchMatches[i].lineNumber,searchMatches[i].lineContent);result.push(searchMatch);}
callback(result||[]);}
if(this.scriptId){this.target().debuggerAgent().searchInContent(this.scriptId,query,caseSensitive,isRegex,innerCallback);}else{callback([]);}},_appendSourceURLCommentIfNeeded:function(source)
{if(!this.hasSourceURL)
return source;return source+"\n //# sourceURL="+this.sourceURL;},editSource:function(newSource,callback)
{function didEditScriptSource(error,errorData,callFrames,stackChanged,asyncStackTrace)
{if(!error)
this._source=newSource;var needsStepIn=!!stackChanged;callback(error,errorData,callFrames,asyncStackTrace,needsStepIn);}
newSource=WebInspector.Script._trimSourceURLComment(newSource);newSource=this._appendSourceURLCommentIfNeeded(newSource);if(this.scriptId)
this.target().debuggerAgent().setScriptSource(this.scriptId,newSource,undefined,didEditScriptSource.bind(this));else
callback("Script failed to parse");},rawLocation:function(lineNumber,columnNumber)
{return new WebInspector.DebuggerModel.Location(this.debuggerModel,this.scriptId,lineNumber,columnNumber||0);},isInlineScript:function()
{var startsAtZero=!this.lineOffset&&!this.columnOffset;return!!this.sourceURL&&!startsAtZero;},addSourceMapURL:function(sourceMapURL)
{if(this.sourceMapURL)
return;this.sourceMapURL=sourceMapURL;this.dispatchEventToListeners(WebInspector.Script.Events.SourceMapURLAdded,this.sourceMapURL);},isAnonymousScript:function()
{return!this.sourceURL;},isInlineScriptWithSourceURL:function()
{return!!this.hasSourceURL&&this.isInlineScript();},__proto__:WebInspector.SDKObject.prototype};WebInspector.ServiceWorkerCacheModel=function(target)
{WebInspector.SDKModel.call(this,WebInspector.ServiceWorkerCacheModel,target);this._caches=new Map();this._agent=target.cacheStorageAgent();this._enabled=false;}
WebInspector.ServiceWorkerCacheModel.EventTypes={CacheAdded:"CacheAdded",CacheRemoved:"CacheRemoved"}
WebInspector.ServiceWorkerCacheModel.prototype={enable:function()
{if(this._enabled)
return;this.target().resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded,this._securityOriginAdded,this);this.target().resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved,this._securityOriginRemoved,this);var securityOrigins=this.target().resourceTreeModel.securityOrigins();for(var i=0;i<securityOrigins.length;++i)
this._addOrigin(securityOrigins[i]);this._enabled=true;},refreshCacheNames:function()
{var securityOrigins=this.target().resourceTreeModel.securityOrigins();for(var securityOrigin of securityOrigins)
this._loadCacheNames(securityOrigin);},deleteCache:function(cache)
{function callback(error)
{if(error){console.error("ServiceWorkerCacheAgent error deleting cache ",cache.toString(),": ",error);return;}
this._caches.delete(cache.cacheId);this._cacheRemoved(cache);}
this._agent.deleteCache(cache.cacheId,callback.bind(this));},deleteCacheEntry:function(cache,request,callback)
{function myCallback(error)
{if(error){WebInspector.console.error(WebInspector.UIString("ServiceWorkerCacheAgent error deleting cache entry %s in cache: %s",cache.toString(),error));return;}
callback();}
this._agent.deleteEntry(cache.cacheId,request,myCallback);},loadCacheData:function(cache,skipCount,pageSize,callback)
{this._requestEntries(cache,skipCount,pageSize,callback);},caches:function()
{var caches=new Array();for(var cache of this._caches.values())
caches.push(cache);return caches;},dispose:function()
{for(var cache of this._caches.values())
this._cacheRemoved(cache);this._caches.clear();if(this._enabled){this.target().resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded,this._securityOriginAdded,this);this.target().resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved,this._securityOriginRemoved,this);}},_addOrigin:function(securityOrigin)
{this._loadCacheNames(securityOrigin);},_removeOrigin:function(securityOrigin)
{for(var opaqueId of this._caches.keys()){var cache=this._caches.get(opaqueId);if(cache.securityOrigin==securityOrigin){this._caches.delete(opaqueId);this._cacheRemoved(cache);}}},_loadCacheNames:function(securityOrigin)
{function callback(error,caches)
{if(error){console.error("ServiceWorkerCacheAgent error while loading caches: ",error);return;}
this._updateCacheNames(securityOrigin,caches);}
this._agent.requestCacheNames(securityOrigin,callback.bind(this));},_updateCacheNames:function(securityOrigin,cachesJson)
{function deleteAndSaveOldCaches(cache)
{if(cache.securityOrigin==securityOrigin&&!updatingCachesIds.has(cache.cacheId)){oldCaches.set(cache.cacheId,cache);this._caches.delete(cache.cacheId);}}
var updatingCachesIds=new Set();var newCaches=new Map();var oldCaches=new Map();for(var cacheJson of cachesJson){var cache=new WebInspector.ServiceWorkerCacheModel.Cache(cacheJson.securityOrigin,cacheJson.cacheName,cacheJson.cacheId);updatingCachesIds.add(cache.cacheId);if(this._caches.has(cache.cacheId))
continue;newCaches.set(cache.cacheId,cache);this._caches.set(cache.cacheId,cache);}
this._caches.forEach(deleteAndSaveOldCaches,this);newCaches.forEach(this._cacheAdded,this);oldCaches.forEach(this._cacheRemoved,this);},_securityOriginAdded:function(event)
{var securityOrigin=(event.data);this._addOrigin(securityOrigin);},_securityOriginRemoved:function(event)
{var securityOrigin=(event.data);this._removeOrigin(securityOrigin);},_cacheAdded:function(cache)
{this.dispatchEventToListeners(WebInspector.ServiceWorkerCacheModel.EventTypes.CacheAdded,cache);},_cacheRemoved:function(cache)
{this.dispatchEventToListeners(WebInspector.ServiceWorkerCacheModel.EventTypes.CacheRemoved,cache);},_requestEntries:function(cache,skipCount,pageSize,callback)
{function innerCallback(error,dataEntries,hasMore)
{if(error){console.error("ServiceWorkerCacheAgent error while requesting entries: ",error);return;}
var entries=[];for(var i=0;i<dataEntries.length;++i){entries.push(new WebInspector.ServiceWorkerCacheModel.Entry(dataEntries[i].request,dataEntries[i].response));}
callback(entries,hasMore);}
this._agent.requestEntries(cache.cacheId,skipCount,pageSize,innerCallback);},__proto__:WebInspector.SDKModel.prototype}
WebInspector.ServiceWorkerCacheModel.Entry=function(request,response)
{this.request=request;this.response=response;}
WebInspector.ServiceWorkerCacheModel.Cache=function(securityOrigin,cacheName,cacheId)
{this.securityOrigin=securityOrigin;this.cacheName=cacheName;this.cacheId=cacheId;}
WebInspector.ServiceWorkerCacheModel.Cache.prototype={equals:function(cache)
{return this.cacheId==cache.cacheId;},toString:function()
{return this.securityOrigin+this.cacheName;}}
WebInspector.ServiceWorkerCacheModel._symbol=Symbol("CacheStorageModel");WebInspector.ServiceWorkerCacheModel.fromTarget=function(target)
{if(!target[WebInspector.ServiceWorkerCacheModel._symbol])
target[WebInspector.ServiceWorkerCacheModel._symbol]=new WebInspector.ServiceWorkerCacheModel(target);return target[WebInspector.ServiceWorkerCacheModel._symbol];};WebInspector.CallFunctionResult;WebInspector.RemoteObject=function(){}
WebInspector.RemoteObject.prototype={customPreview:function()
{return null;},get type()
{throw"Not implemented";},get subtype()
{throw"Not implemented";},get description()
{throw"Not implemented";},get hasChildren()
{throw"Not implemented";},arrayLength:function()
{throw"Not implemented";},getOwnProperties:function(callback)
{throw"Not implemented";},getOwnPropertiesPromise:function()
{return new Promise(promiseConstructor.bind(this));function promiseConstructor(success)
{this.getOwnProperties(getOwnPropertiesCallback.bind(null,success));}
function getOwnPropertiesCallback(callback,properties,internalProperties)
{callback({properties:properties,internalProperties:internalProperties});}},getAllProperties:function(accessorPropertiesOnly,callback)
{throw"Not implemented";},getAllPropertiesPromise:function(accessorPropertiesOnly)
{return new Promise(promiseConstructor.bind(this));function promiseConstructor(success)
{this.getAllProperties(accessorPropertiesOnly,getAllPropertiesCallback.bind(null,success));}
function getAllPropertiesCallback(callback,properties,internalProperties)
{callback({properties:properties,internalProperties:internalProperties});}},eventListeners:function()
{throw"Not implemented";},deleteProperty:function(name,callback)
{throw"Not implemented";},callFunction:function(functionDeclaration,args,callback)
{throw"Not implemented";},callFunctionPromise:function(functionDeclaration,args)
{return new Promise(promiseConstructor.bind(this));function promiseConstructor(success)
{this.callFunction(functionDeclaration,args,callFunctionCallback.bind(null,success));}
function callFunctionCallback(callback,object,wasThrown)
{callback({object:object,wasThrown:wasThrown});}},callFunctionJSON:function(functionDeclaration,args,callback)
{throw"Not implemented";},callFunctionJSONPromise:function(functionDeclaration,args)
{return new Promise(promiseConstructor.bind(this));function promiseConstructor(success)
{this.callFunctionJSON(functionDeclaration,args,success);}},target:function()
{throw new Error("Target-less object");},debuggerModel:function()
{throw new Error("DebuggerModel-less object");},isNode:function()
{return false;},functionDetails:function(callback)
{callback(null);},functionDetailsPromise:function()
{return new Promise(promiseConstructor.bind(this));function promiseConstructor(success)
{this.functionDetails(success);}},generatorObjectDetails:function(callback)
{callback(null);},collectionEntries:function(callback)
{callback(null);}}
WebInspector.RemoteObject.fromLocalObject=function(value)
{return new WebInspector.LocalJSONObject(value);}
WebInspector.RemoteObject.type=function(remoteObject)
{if(remoteObject===null)
return"null";var type=typeof remoteObject;if(type!=="object"&&type!=="function")
return type;return remoteObject.type;}
WebInspector.RemoteObject.arrayLength=function(object)
{if(object.subtype!=="array")
return 0;var matches=object.description.match(/\[([0-9]+)\]/);if(!matches)
return 0;return parseInt(matches[1],10);}
WebInspector.RemoteObject.toCallArgument=function(object)
{var type=typeof object;var value=object;var objectId=undefined;var description=String(object);if(type==="number"&&value===0&&1/value<0)
description="-0";switch(type){case"number":case"string":case"boolean":case"undefined":break;default:if(object){type=object.type;value=object.value;objectId=object.objectId;description=object.description;}
break;}
if(type==="number"){switch(description){case"NaN":case"Infinity":case"-Infinity":case"-0":value=description;break;}}
return{value:value,objectId:objectId,type:(type)};}
WebInspector.RemoteObjectImpl=function(target,objectId,type,subtype,value,description,preview,customPreview)
{WebInspector.RemoteObject.call(this);this._target=target;this._runtimeAgent=target.runtimeAgent();this._debuggerModel=WebInspector.DebuggerModel.fromTarget(target);this._type=type;this._subtype=subtype;if(objectId){this._objectId=objectId;this._description=description;this._hasChildren=(type!=="symbol");this._preview=preview;}else{this._description=description||(value+"");this._hasChildren=false;if(type==="number"&&typeof value!=="number")
this.value=Number(value);else
this.value=value;}
this._customPreview=customPreview||null;}
WebInspector.RemoteObjectImpl.prototype={customPreview:function()
{return this._customPreview;},get objectId()
{return this._objectId;},get type()
{return this._type;},get subtype()
{return this._subtype;},get description()
{return this._description;},get hasChildren()
{return this._hasChildren;},get preview()
{return this._preview;},getOwnProperties:function(callback)
{this.doGetProperties(true,false,false,callback);},getAllProperties:function(accessorPropertiesOnly,callback)
{this.doGetProperties(false,accessorPropertiesOnly,false,callback);},eventListeners:function()
{return new Promise(eventListeners.bind(this));function eventListeners(fulfill,reject)
{if(!this.target().isPage()){fulfill([]);return;}
if(!this._objectId){reject(null);return;}
var removeFunction=null;this.callFunctionPromise(nodeRemoveEventListener).then(storeRemoveFunction.bind(this));function storeRemoveFunction(result)
{if(!result.wasThrown&&result.object)
removeFunction=result.object;this.target().domdebuggerAgent().getEventListeners(this._objectId,mycallback.bind(this));}
function mycallback(error,payloads)
{if(error){reject(null);return;}
fulfill(payloads.map(createEventListener.bind(this)));}
function nodeRemoveEventListener()
{return removeEventListenerWrapper.bind(this);function removeEventListenerWrapper(type,handler,useCapture)
{this.removeEventListener(type,handler,useCapture);if(this["on"+type])
this["on"+type]=null;}}
function createEventListener(payload)
{return new WebInspector.EventListener(this._target,payload.type,payload.useCapture,payload.handler?this.target().runtimeModel.createRemoteObject(payload.handler):null,payload.originalHandler?this.target().runtimeModel.createRemoteObject(payload.originalHandler):null,WebInspector.DebuggerModel.Location.fromPayload(this._debuggerModel,payload.location),removeFunction);}}},getProperty:function(propertyPath,callback)
{function remoteFunction(arrayStr)
{var result=this;var properties=JSON.parse(arrayStr);for(var i=0,n=properties.length;i<n;++i)
result=result[properties[i]];return result;}
var args=[{value:JSON.stringify(propertyPath)}];this.callFunction(remoteFunction,args,callback);},doGetProperties:function(ownProperties,accessorPropertiesOnly,generatePreview,callback)
{if(!this._objectId){callback(null,null);return;}
function remoteObjectBinder(error,properties,internalProperties,exceptionDetails)
{if(error){callback(null,null);return;}
if(exceptionDetails){var msg=new WebInspector.ConsoleMessage(this._target,WebInspector.ConsoleMessage.MessageSource.JS,WebInspector.ConsoleMessage.MessageLevel.Error,exceptionDetails.text);this._target.consoleModel.addMessage(msg);callback(null,null);return;}
var result=[];for(var i=0;properties&&i<properties.length;++i){var property=properties[i];var propertyValue=property.value?this._target.runtimeModel.createRemoteObject(property.value):null;var propertySymbol=property.symbol?this._target.runtimeModel.createRemoteObject(property.symbol):null;var remoteProperty=new WebInspector.RemoteObjectProperty(property.name,propertyValue,!!property.enumerable,!!property.writable,!!property.isOwn,!!property.wasThrown,propertySymbol);if(typeof property.value==="undefined"){if(property.get&&property.get.type!=="undefined")
remoteProperty.getter=this._target.runtimeModel.createRemoteObject(property.get);if(property.set&&property.set.type!=="undefined")
remoteProperty.setter=this._target.runtimeModel.createRemoteObject(property.set);}
result.push(remoteProperty);}
var internalPropertiesResult=null;if(internalProperties){internalPropertiesResult=[];for(var i=0;i<internalProperties.length;i++){var property=internalProperties[i];if(!property.value)
continue;var propertyValue=this._target.runtimeModel.createRemoteObject(property.value);internalPropertiesResult.push(new WebInspector.RemoteObjectProperty(property.name,propertyValue,true,false));}}
callback(result,internalPropertiesResult);}
this._runtimeAgent.getProperties(this._objectId,ownProperties,accessorPropertiesOnly,generatePreview,remoteObjectBinder.bind(this));},setPropertyValue:function(name,value,callback)
{if(!this._objectId){callback("Can't set a property of non-object.");return;}
this._runtimeAgent.invoke_evaluate({expression:value,doNotPauseOnExceptionsAndMuteConsole:true},evaluatedCallback.bind(this));function evaluatedCallback(error,result,wasThrown)
{if(error||wasThrown){callback(error||result.description);return;}
if(typeof name==="string")
name=WebInspector.RemoteObject.toCallArgument(name);this.doSetObjectPropertyValue(result,name,callback);if(result.objectId)
this._runtimeAgent.releaseObject(result.objectId);}},doSetObjectPropertyValue:function(result,name,callback)
{var setPropertyValueFunction="function(a, b) { this[a] = b; }";var argv=[name,WebInspector.RemoteObject.toCallArgument(result)];this._runtimeAgent.callFunctionOn(this._objectId,setPropertyValueFunction,argv,true,undefined,undefined,propertySetCallback);function propertySetCallback(error,result,wasThrown)
{if(error||wasThrown){callback(error||result.description);return;}
callback();}},deleteProperty:function(name,callback)
{if(!this._objectId){callback("Can't delete a property of non-object.");return;}
var deletePropertyFunction="function(a) { delete this[a]; return !(a in this); }";this._runtimeAgent.callFunctionOn(this._objectId,deletePropertyFunction,[name],true,undefined,undefined,deletePropertyCallback);function deletePropertyCallback(error,result,wasThrown)
{if(error||wasThrown){callback(error||result.description);return;}
if(!result.value)
callback("Failed to delete property.");else
callback();}},callFunction:function(functionDeclaration,args,callback)
{function mycallback(error,result,wasThrown)
{if(!callback)
return;if(error)
callback(null,false);else
callback(this.target().runtimeModel.createRemoteObject(result),wasThrown);}
this._runtimeAgent.callFunctionOn(this._objectId,functionDeclaration.toString(),args,true,undefined,undefined,mycallback.bind(this));},callFunctionJSON:function(functionDeclaration,args,callback)
{function mycallback(error,result,wasThrown)
{callback((error||wasThrown)?null:result.value);}
this._runtimeAgent.callFunctionOn(this._objectId,functionDeclaration.toString(),args,true,true,false,mycallback);},release:function()
{if(!this._objectId)
return;this._runtimeAgent.releaseObject(this._objectId);},arrayLength:function()
{return WebInspector.RemoteObject.arrayLength(this);},target:function()
{return this._target;},debuggerModel:function()
{return this._debuggerModel;},isNode:function()
{return!!this._objectId&&this.type==="object"&&this.subtype==="node";},functionDetails:function(callback)
{this._debuggerModel.functionDetails(this,callback);},generatorObjectDetails:function(callback)
{this._debuggerModel.generatorObjectDetails(this,callback);},collectionEntries:function(callback)
{if(!this._objectId){callback(null);return;}
this._debuggerModel.getCollectionEntries(this._objectId,callback);},__proto__:WebInspector.RemoteObject.prototype};WebInspector.RemoteObject.loadFromObjectPerProto=function(object,callback)
{var savedOwnProperties;var savedAccessorProperties;var savedInternalProperties;var resultCounter=2;function processCallback()
{if(--resultCounter)
return;if(savedOwnProperties&&savedAccessorProperties){var combinedList=savedAccessorProperties.slice(0);for(var i=0;i<savedOwnProperties.length;i++){var property=savedOwnProperties[i];if(!property.isAccessorProperty())
combinedList.push(property);}
return callback(combinedList,savedInternalProperties?savedInternalProperties:null);}else{callback(null,null);}}
function allAccessorPropertiesCallback(properties,internalProperties)
{savedAccessorProperties=properties;processCallback();}
function ownPropertiesCallback(properties,internalProperties)
{savedOwnProperties=properties;savedInternalProperties=internalProperties;processCallback();}
object.getAllProperties(true,allAccessorPropertiesCallback);object.getOwnProperties(ownPropertiesCallback);};WebInspector.ScopeRemoteObject=function(target,objectId,scopeRef,type,subtype,value,description,preview)
{WebInspector.RemoteObjectImpl.call(this,target,objectId,type,subtype,value,description,preview);this._scopeRef=scopeRef;this._savedScopeProperties=undefined;};WebInspector.ScopeRemoteObject.prototype={doGetProperties:function(ownProperties,accessorPropertiesOnly,generatePreview,callback)
{if(accessorPropertiesOnly){callback([],[]);return;}
if(this._savedScopeProperties){callback(this._savedScopeProperties.slice(),[]);return;}
function wrappedCallback(properties,internalProperties)
{if(this._scopeRef&&Array.isArray(properties))
this._savedScopeProperties=properties.slice();callback(properties,internalProperties);}
generatePreview=true;WebInspector.RemoteObjectImpl.prototype.doGetProperties.call(this,ownProperties,accessorPropertiesOnly,generatePreview,wrappedCallback.bind(this));},doSetObjectPropertyValue:function(result,name,callback)
{this._debuggerModel.setVariableValue(this._scopeRef.number,(name.value),WebInspector.RemoteObject.toCallArgument(result),this._scopeRef.callFrameId,this._scopeRef.functionId,setVariableValueCallback.bind(this));function setVariableValueCallback(error)
{if(error){callback(error);return;}
if(this._savedScopeProperties){for(var i=0;i<this._savedScopeProperties.length;i++){if(this._savedScopeProperties[i].name===name)
this._savedScopeProperties[i].value=this._target.runtimeModel.createRemoteObject(result);}}
callback();}},__proto__:WebInspector.RemoteObjectImpl.prototype};WebInspector.ScopeRef=function(number,callFrameId,functionId)
{this.number=number;this.callFrameId=callFrameId;this.functionId=functionId;}
WebInspector.RemoteObjectProperty=function(name,value,enumerable,writable,isOwn,wasThrown,symbol,synthetic)
{this.name=name;if(value!==null)
this.value=value;this.enumerable=typeof enumerable!=="undefined"?enumerable:true;this.writable=typeof writable!=="undefined"?writable:true;this.isOwn=!!isOwn;this.wasThrown=!!wasThrown;if(symbol)
this.symbol=symbol;this.synthetic=!!synthetic;}
WebInspector.RemoteObjectProperty.prototype={isAccessorProperty:function()
{return!!(this.getter||this.setter);}};WebInspector.LocalJSONObject=function(value)
{WebInspector.RemoteObject.call(this);this._value=value;}
WebInspector.LocalJSONObject.prototype={get description()
{if(this._cachedDescription)
return this._cachedDescription;function formatArrayItem(property)
{return this._formatValue(property.value);}
function formatObjectItem(property)
{var name=property.name;if(/^\s|\s$|^$|\n/.test(name))
name="\""+name.replace(/\n/g,"\u21B5")+"\"";return name+": "+this._formatValue(property.value);}
if(this.type==="object"){switch(this.subtype){case"array":this._cachedDescription=this._concatenate("[","]",formatArrayItem.bind(this));break;case"date":this._cachedDescription=""+this._value;break;case"null":this._cachedDescription="null";break;default:this._cachedDescription=this._concatenate("{","}",formatObjectItem.bind(this));}}else{this._cachedDescription=String(this._value);}
return this._cachedDescription;},_formatValue:function(value)
{if(!value)
return"undefined";var description=value.description||"";if(value.type==="string")
return"\""+description.replace(/\n/g,"\u21B5")+"\"";return description;},_concatenate:function(prefix,suffix,formatProperty)
{var previewChars=100;var buffer=prefix;var children=this._children();for(var i=0;i<children.length;++i){var itemDescription=formatProperty(children[i]);if(buffer.length+itemDescription.length>previewChars){buffer+=",\u2026";break;}
if(i)
buffer+=", ";buffer+=itemDescription;}
buffer+=suffix;return buffer;},get type()
{return typeof this._value;},get subtype()
{if(this._value===null)
return"null";if(Array.isArray(this._value))
return"array";if(this._value instanceof Date)
return"date";return undefined;},get hasChildren()
{if((typeof this._value!=="object")||(this._value===null))
return false;return!!Object.keys((this._value)).length;},getOwnProperties:function(callback)
{callback(this._children(),null);},getAllProperties:function(accessorPropertiesOnly,callback)
{if(accessorPropertiesOnly)
callback([],null);else
callback(this._children(),null);},_children:function()
{if(!this.hasChildren)
return[];var value=(this._value);function buildProperty(propName)
{var propValue=value[propName];if(!(propValue instanceof WebInspector.RemoteObject))
propValue=WebInspector.RemoteObject.fromLocalObject(propValue);return new WebInspector.RemoteObjectProperty(propName,propValue);}
if(!this._cachedChildren)
this._cachedChildren=Object.keys(value).map(buildProperty);return this._cachedChildren;},isError:function()
{return false;},arrayLength:function()
{return Array.isArray(this._value)?this._value.length:0;},callFunction:function(functionDeclaration,args,callback)
{var target=(this._value);var rawArgs=args?args.map(function(arg){return arg.value;}):[];var result;var wasThrown=false;try{result=functionDeclaration.apply(target,rawArgs);}catch(e){wasThrown=true;}
if(!callback)
return;callback(WebInspector.RemoteObject.fromLocalObject(result),wasThrown);},callFunctionJSON:function(functionDeclaration,args,callback)
{var target=(this._value);var rawArgs=args?args.map(function(arg){return arg.value;}):[];var result;try{result=functionDeclaration.apply(target,rawArgs);}catch(e){result=null;}
callback(result);},__proto__:WebInspector.RemoteObject.prototype}
WebInspector.RemoteArray=function(object)
{this._object=object;};WebInspector.RemoteArray.objectAsArray=function(object)
{if(!object||object.type!=="object"||object.subtype!=="array")
throw new Error("Object is empty or not an array");return new WebInspector.RemoteArray(object);}
WebInspector.RemoteArray.createFromRemoteObjects=function(objects)
{if(!objects.length)
throw new Error("Input array is empty");var objectArguments=[];for(var i=0;i<objects.length;++i)
objectArguments.push(WebInspector.RemoteObject.toCallArgument(objects[i]))
return objects[0].callFunctionPromise(createArray,objectArguments).then(returnRemoteArray);function createArray()
{if(arguments.length>1)
return new Array(arguments);return[arguments[0]];}
function returnRemoteArray(result)
{if(result.wasThrown||!result.object)
throw new Error("Call function throws exceptions or returns empty value");return WebInspector.RemoteArray.objectAsArray(result.object);}}
WebInspector.RemoteArray.prototype={at:function(index)
{if(index<0||index>this._object.arrayLength())
throw new Error("Out of range");return this._object.callFunctionPromise(at,[WebInspector.RemoteObject.toCallArgument(index)]).then(assertCallFunctionResult);function at(index)
{return this[index];}
function assertCallFunctionResult(result)
{if(result.wasThrown||!result.object)
throw new Error("Exception in callFunction or result value is empty");return result.object;}},length:function()
{return this._object.arrayLength();},map:function(func)
{var promises=[];for(var i=0;i<this.length();++i)
promises.push(this.at(i).then(func));return Promise.all(promises);},object:function()
{return this._object;}}
WebInspector.RemoteFunction=function(object)
{this._object=object;}
WebInspector.RemoteFunction.objectAsFunction=function(object)
{if(!object||object.type!=="function")
throw new Error("Object is empty or not a function");return new WebInspector.RemoteFunction(object);}
WebInspector.RemoteFunction.prototype={targetFunction:function()
{return this._object.getOwnPropertiesPromise().then(targetFunction.bind(this));function targetFunction(ownProperties)
{if(!ownProperties.internalProperties)
return this._object;var internalProperties=ownProperties.internalProperties;for(var property of internalProperties){if(property.name==="[[TargetFunction]]")
return property.value;}
return this._object;}},targetFunctionDetails:function()
{return this.targetFunction().then(functionDetails.bind(this));function functionDetails(targetFunction)
{var boundReleaseFunctionDetails=releaseTargetFunction.bind(null,this._object!==targetFunction?targetFunction:null);return targetFunction.functionDetailsPromise().then(boundReleaseFunctionDetails);}
function releaseTargetFunction(targetFunction,functionDetails)
{if(targetFunction)
targetFunction.release();return functionDetails;}},object:function()
{return this._object;}}
WebInspector.MapEntryLocalJSONObject=function(value)
{WebInspector.LocalJSONObject.call(this,value);}
WebInspector.MapEntryLocalJSONObject.prototype={get description()
{if(!this._cachedDescription){var children=this._children();this._cachedDescription="{"+this._formatValue(children[0].value)+" => "+this._formatValue(children[1].value)+"}";}
return this._cachedDescription;},__proto__:WebInspector.LocalJSONObject.prototype};WebInspector.Resource=function(target,request,url,documentURL,frameId,loaderId,type,mimeType,isHidden)
{WebInspector.SDKObject.call(this,target);this._request=request;this.url=url;this._documentURL=documentURL;this._frameId=frameId;this._loaderId=loaderId;this._type=type||WebInspector.resourceTypes.Other;this._mimeType=mimeType;this._isHidden=isHidden;this._content;this._contentEncoded;this._pendingContentCallbacks=[];if(this._request&&!this._request.finished)
this._request.addEventListener(WebInspector.NetworkRequest.Events.FinishedLoading,this._requestFinished,this);}
WebInspector.Resource.contentAsDataURL=function(content,mimeType,contentEncoded,charset)
{const maxDataUrlSize=1024*1024;if(content===null||content.length>maxDataUrlSize)
return null;return"data:"+mimeType+(charset?";charset="+charset:"")+(contentEncoded?";base64":"")+","+content;}
WebInspector.Resource.populateImageSource=function(url,mimeType,contentProvider,image)
{function onResourceContent(content)
{var imageSrc=WebInspector.Resource.contentAsDataURL(content,mimeType,true);if(imageSrc===null)
imageSrc=url;image.src=imageSrc;}
contentProvider.requestContent(onResourceContent);}
WebInspector.Resource.prototype={get request()
{return this._request;},get url()
{return this._url;},set url(x)
{this._url=x;this._parsedURL=new WebInspector.ParsedURL(x);},get parsedURL()
{return this._parsedURL;},get documentURL()
{return this._documentURL;},get frameId()
{return this._frameId;},get loaderId()
{return this._loaderId;},get displayName()
{return this._parsedURL.displayName;},resourceType:function()
{return this._request?this._request.resourceType():this._type;},get mimeType()
{return this._request?this._request.mimeType:this._mimeType;},get content()
{return this._content;},get contentEncoded()
{return this._contentEncoded;},contentURL:function()
{return this._url;},contentType:function()
{if(this.resourceType()===WebInspector.resourceTypes.Document&&this.mimeType.indexOf("javascript")!==-1)
return WebInspector.resourceTypes.Script;return this.resourceType();},requestContent:function(callback)
{if(typeof this._content!=="undefined"){callback(this._content);return;}
this._pendingContentCallbacks.push(callback);if(!this._request||this._request.finished)
this._innerRequestContent();},canonicalMimeType:function()
{return this.contentType().canonicalMimeType()||this.mimeType;},searchInContent:function(query,caseSensitive,isRegex,callback)
{function callbackWrapper(error,searchMatches)
{callback(searchMatches||[]);}
if(this.frameId)
this.target().pageAgent().searchInResource(this.frameId,this.url,query,caseSensitive,isRegex,callbackWrapper);else
callback([]);},populateImageSource:function(image)
{WebInspector.Resource.populateImageSource(this._url,this._mimeType,this,image);},_requestFinished:function()
{this._request.removeEventListener(WebInspector.NetworkRequest.Events.FinishedLoading,this._requestFinished,this);if(this._pendingContentCallbacks.length)
this._innerRequestContent();},_innerRequestContent:function()
{if(this._contentRequested)
return;this._contentRequested=true;function contentLoaded(error,content,contentEncoded)
{if(error||content===null){replyWithContent.call(this,null,false);return;}
replyWithContent.call(this,content,contentEncoded);}
function replyWithContent(content,contentEncoded)
{this._content=content;this._contentEncoded=contentEncoded;var callbacks=this._pendingContentCallbacks.slice();for(var i=0;i<callbacks.length;++i)
callbacks[i](this._content);this._pendingContentCallbacks.length=0;delete this._contentRequested;}
function resourceContentLoaded(error,content,contentEncoded)
{contentLoaded.call(this,error,content,contentEncoded);}
if(this.request){this.request.requestContent(requestContentLoaded.bind(this));return;}
function requestContentLoaded(content)
{contentLoaded.call(this,null,content,this.request.contentEncoded);}
this.target().pageAgent().getResourceContent(this.frameId,this.url,resourceContentLoaded.bind(this));},isHidden:function()
{return!!this._isHidden;},hasTextContent:function()
{if(this._type.isTextType())
return true;if(this._type===WebInspector.resourceTypes.Other)
return!!this._content&&!this._contentEncoded;return false;},__proto__:WebInspector.SDKObject.prototype};WebInspector.ResourceTreeModel=function(target)
{WebInspector.SDKModel.call(this,WebInspector.ResourceTreeModel,target);target.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestFinished,this._onRequestFinished,this);target.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestUpdateDropped,this._onRequestUpdateDropped,this);this._agent=target.pageAgent();this._agent.enable();this._fetchResourceTree();target.registerPageDispatcher(new WebInspector.PageDispatcher(this));this._securityOriginFrameCount={};this._inspectedPageURL="";this._pendingReloadOptions=null;this._reloadSuspensionCount=0;}
WebInspector.ResourceTreeModel.EventTypes={FrameAdded:"FrameAdded",FrameNavigated:"FrameNavigated",FrameDetached:"FrameDetached",FrameResized:"FrameResized",FrameWillNavigate:"FrameWillNavigate",MainFrameNavigated:"MainFrameNavigated",ResourceAdded:"ResourceAdded",WillLoadCachedResources:"WillLoadCachedResources",CachedResourcesLoaded:"CachedResourcesLoaded",DOMContentLoaded:"DOMContentLoaded",Load:"Load",PageReloadRequested:"PageReloadRequested",WillReloadPage:"WillReloadPage",InspectedURLChanged:"InspectedURLChanged",SecurityOriginAdded:"SecurityOriginAdded",SecurityOriginRemoved:"SecurityOriginRemoved",ScreencastFrame:"ScreencastFrame",ScreencastVisibilityChanged:"ScreencastVisibilityChanged",ColorPicked:"ColorPicked"}
WebInspector.ResourceTreeModel.frames=function()
{var result=[];for(var target of WebInspector.targetManager.targets())
result=result.concat(Object.values(target.resourceTreeModel._frames));return result;}
WebInspector.ResourceTreeModel.resourceForURL=function(url)
{for(var target of WebInspector.targetManager.targets()){var mainFrame=target.resourceTreeModel.mainFrame;var result=mainFrame?mainFrame.resourceForURL(url):null;if(result)
return result;}
return null;}
WebInspector.ResourceTreeModel.prototype={_fetchResourceTree:function()
{this._frames={};this._cachedResourcesProcessed=false;this._agent.getResourceTree(this._processCachedResources.bind(this));},_processCachedResources:function(error,mainFramePayload)
{if(error){this._cachedResourcesProcessed=true;return;}
this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.WillLoadCachedResources);this._inspectedPageURL=mainFramePayload.frame.url;if(this.target().isPage())
this._addFramesRecursively(null,mainFramePayload);else
this._addSecurityOrigin(mainFramePayload.frame.securityOrigin);this._dispatchInspectedURLChanged();this._cachedResourcesProcessed=true;this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.CachedResourcesLoaded);},inspectedPageURL:function()
{return this._inspectedPageURL;},inspectedPageDomain:function()
{var parsedURL=this._inspectedPageURL?this._inspectedPageURL.asParsedURL():null;return parsedURL?parsedURL.host:"";},cachedResourcesLoaded:function()
{return this._cachedResourcesProcessed;},_dispatchInspectedURLChanged:function()
{InspectorFrontendHost.inspectedURLChanged(this._inspectedPageURL);this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged,this._inspectedPageURL);},_addFrame:function(frame,aboutToNavigate)
{this._frames[frame.id]=frame;if(frame.isMainFrame())
this.mainFrame=frame;this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameAdded,frame);if(!aboutToNavigate)
this._addSecurityOrigin(frame.securityOrigin);},_addSecurityOrigin:function(securityOrigin)
{if(!this._securityOriginFrameCount[securityOrigin]){this._securityOriginFrameCount[securityOrigin]=1;this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded,securityOrigin);return;}
this._securityOriginFrameCount[securityOrigin]+=1;},_removeSecurityOrigin:function(securityOrigin)
{if(typeof securityOrigin==="undefined")
return;if(this._securityOriginFrameCount[securityOrigin]===1){delete this._securityOriginFrameCount[securityOrigin];this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved,securityOrigin);return;}
this._securityOriginFrameCount[securityOrigin]-=1;},securityOrigins:function()
{return Object.keys(this._securityOriginFrameCount);},_handleMainFrameDetached:function(mainFrame)
{function removeOriginForFrame(frame)
{for(var i=0;i<frame.childFrames.length;++i)
removeOriginForFrame.call(this,frame.childFrames[i]);if(!frame.isMainFrame())
this._removeSecurityOrigin(frame.securityOrigin);}
removeOriginForFrame.call(this,mainFrame);},_frameAttached:function(frameId,parentFrameId)
{if(!this._cachedResourcesProcessed&&parentFrameId)
return null;if(this._frames[frameId])
return null;var parentFrame=parentFrameId?this._frames[parentFrameId]:null;var frame=new WebInspector.ResourceTreeFrame(this,parentFrame,frameId);if(frame.isMainFrame()&&this.mainFrame){this._handleMainFrameDetached(this.mainFrame);this._frameDetached(this.mainFrame.id);}
this._addFrame(frame,true);return frame;},_frameNavigated:function(framePayload)
{if(!this._cachedResourcesProcessed&&framePayload.parentId)
return;var frame=this._frames[framePayload.id];if(!frame){console.assert(!framePayload.parentId,"Main frame shouldn't have parent frame id.");frame=this._frameAttached(framePayload.id,framePayload.parentId||"");console.assert(frame);}
this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameWillNavigate,frame);this._removeSecurityOrigin(frame.securityOrigin);frame._navigate(framePayload);var addedOrigin=frame.securityOrigin;if(frame.isMainFrame())
this._inspectedPageURL=frame.url;this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated,frame);if(frame.isMainFrame())
this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,frame);if(addedOrigin)
this._addSecurityOrigin(addedOrigin);var resources=frame.resources();for(var i=0;i<resources.length;++i)
this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded,resources[i]);if(frame.isMainFrame())
this._dispatchInspectedURLChanged();},_frameDetached:function(frameId)
{if(!this._cachedResourcesProcessed)
return;var frame=this._frames[frameId];if(!frame)
return;this._removeSecurityOrigin(frame.securityOrigin);if(frame.parentFrame)
frame.parentFrame._removeChildFrame(frame);else
frame._remove();},_onRequestFinished:function(event)
{if(!this._cachedResourcesProcessed)
return;var request=(event.data);if(request.failed||request.resourceType()===WebInspector.resourceTypes.XHR)
return;var frame=this._frames[request.frameId];if(frame)
frame._addRequest(request);},_onRequestUpdateDropped:function(event)
{if(!this._cachedResourcesProcessed)
return;var frameId=event.data.frameId;var frame=this._frames[frameId];if(!frame)
return;var url=event.data.url;if(frame._resourcesMap[url])
return;var resource=new WebInspector.Resource(this.target(),null,url,frame.url,frameId,event.data.loaderId,WebInspector.resourceTypes[event.data.resourceType],event.data.mimeType);frame.addResource(resource);},frameForId:function(frameId)
{return this._frames[frameId];},forAllResources:function(callback)
{if(this.mainFrame)
return this.mainFrame._callForFrameResources(callback);return false;},frames:function()
{return Object.values(this._frames);},resourceForURL:function(url)
{return this.mainFrame?this.mainFrame.resourceForURL(url):null;},_addFramesRecursively:function(parentFrame,frameTreePayload)
{var framePayload=frameTreePayload.frame;var frame=new WebInspector.ResourceTreeFrame(this,parentFrame,framePayload.id,framePayload);this._addFrame(frame);var frameResource=this._createResourceFromFramePayload(framePayload,framePayload.url,WebInspector.resourceTypes.Document,framePayload.mimeType);if(frame.isMainFrame())
this._inspectedPageURL=frameResource.url;frame.addResource(frameResource);for(var i=0;frameTreePayload.childFrames&&i<frameTreePayload.childFrames.length;++i)
this._addFramesRecursively(frame,frameTreePayload.childFrames[i]);for(var i=0;i<frameTreePayload.resources.length;++i){var subresource=frameTreePayload.resources[i];var resource=this._createResourceFromFramePayload(framePayload,subresource.url,WebInspector.resourceTypes[subresource.type],subresource.mimeType);frame.addResource(resource);}},_createResourceFromFramePayload:function(frame,url,type,mimeType)
{return new WebInspector.Resource(this.target(),null,url,frame.url,frame.id,frame.loaderId,type,mimeType);},suspendReload:function()
{this._reloadSuspensionCount++;},resumeReload:function()
{this._reloadSuspensionCount--;console.assert(this._reloadSuspensionCount>=0,"Unbalanced call to ResourceTreeModel.resumeReload()");if(!this._reloadSuspensionCount&&this._pendingReloadOptions)
this.reloadPage.apply(this,this._pendingReloadOptions);},reloadPage:function(ignoreCache,scriptToEvaluateOnLoad)
{if(!this._pendingReloadOptions)
this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.PageReloadRequested);if(this._reloadSuspensionCount){this._pendingReloadOptions=[ignoreCache,scriptToEvaluateOnLoad];return;}
this._pendingReloadOptions=null;this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.WillReloadPage);this._agent.reload(ignoreCache,scriptToEvaluateOnLoad);},__proto__:WebInspector.SDKModel.prototype}
WebInspector.ResourceTreeFrame=function(model,parentFrame,frameId,payload)
{this._model=model;this._parentFrame=parentFrame;this._id=frameId;this._url="";if(payload){this._loaderId=payload.loaderId;this._name=payload.name;this._url=payload.url;this._securityOrigin=payload.securityOrigin;this._mimeType=payload.mimeType;}
this._childFrames=[];this._resourcesMap={};if(this._parentFrame)
this._parentFrame._childFrames.push(this);}
WebInspector.ResourceTreeFrame.fromScript=function(script)
{var executionContext=script.executionContext();if(!executionContext||!executionContext.frameId)
return null;return script.target().resourceTreeModel.frameForId(executionContext.frameId);}
WebInspector.ResourceTreeFrame.fromStyleSheet=function(header)
{return header.target().resourceTreeModel.frameForId(header.frameId);}
WebInspector.ResourceTreeFrame.fromResource=function(resource)
{return resource.target().resourceTreeModel.frameForId(resource.frameId);}
WebInspector.ResourceTreeFrame.prototype={target:function()
{return this._model.target();},get id()
{return this._id;},get name()
{return this._name||"";},get url()
{return this._url;},get securityOrigin()
{return this._securityOrigin;},get loaderId()
{return this._loaderId;},get parentFrame()
{return this._parentFrame;},get childFrames()
{return this._childFrames;},isMainFrame:function()
{return!this._parentFrame;},_navigate:function(framePayload)
{this._loaderId=framePayload.loaderId;this._name=framePayload.name;this._url=framePayload.url;this._securityOrigin=framePayload.securityOrigin;this._mimeType=framePayload.mimeType;var mainResource=this._resourcesMap[this._url];this._resourcesMap={};this._removeChildFrames();if(mainResource&&mainResource.loaderId===this._loaderId)
this.addResource(mainResource);},get mainResource()
{return this._resourcesMap[this._url];},_removeChildFrame:function(frame)
{this._childFrames.remove(frame);frame._remove();},_removeChildFrames:function()
{var frames=this._childFrames;this._childFrames=[];for(var i=0;i<frames.length;++i)
frames[i]._remove();},_remove:function()
{this._removeChildFrames();delete this._model._frames[this.id];this._model.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameDetached,this);},addResource:function(resource)
{if(this._resourcesMap[resource.url]===resource){return;}
this._resourcesMap[resource.url]=resource;this._model.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded,resource);},_addRequest:function(request)
{var resource=this._resourcesMap[request.url];if(resource&&resource.request===request){return resource;}
resource=new WebInspector.Resource(this.target(),request,request.url,request.documentURL,request.frameId,request.loaderId,request.resourceType(),request.mimeType);this._resourcesMap[resource.url]=resource;this._model.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded,resource);return resource;},resources:function()
{var result=[];for(var url in this._resourcesMap)
result.push(this._resourcesMap[url]);return result;},resourceForURL:function(url)
{var result;function filter(resource)
{if(resource.url===url){result=resource;return true;}}
this._callForFrameResources(filter);return result||null;},_callForFrameResources:function(callback)
{for(var url in this._resourcesMap){if(callback(this._resourcesMap[url]))
return true;}
for(var i=0;i<this._childFrames.length;++i){if(this._childFrames[i]._callForFrameResources(callback))
return true;}
return false;},displayName:function()
{if(!this._parentFrame)
return WebInspector.UIString("top");var subtitle=new WebInspector.ParsedURL(this._url).displayName;if(subtitle){if(!this._name)
return subtitle;return this._name+" ("+subtitle+")";}
return WebInspector.UIString("<iframe>");}}
WebInspector.PageDispatcher=function(resourceTreeModel)
{this._resourceTreeModel=resourceTreeModel;}
WebInspector.PageDispatcher.prototype={domContentEventFired:function(time)
{this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.DOMContentLoaded,time);},loadEventFired:function(time)
{this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.Load,time);},frameAttached:function(frameId,parentFrameId)
{this._resourceTreeModel._frameAttached(frameId,parentFrameId);},frameNavigated:function(frame)
{this._resourceTreeModel._frameNavigated(frame);},frameDetached:function(frameId)
{this._resourceTreeModel._frameDetached(frameId);},frameStartedLoading:function(frameId)
{},frameStoppedLoading:function(frameId)
{},frameScheduledNavigation:function(frameId,delay)
{},frameClearedScheduledNavigation:function(frameId)
{},frameResized:function()
{this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameResized,null);},javascriptDialogOpening:function(message,dialogType)
{},javascriptDialogClosed:function(result)
{},screencastFrame:function(data,metadata,sessionId)
{this._resourceTreeModel._agent.screencastFrameAck(sessionId);this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ScreencastFrame,{data:data,metadata:metadata});},screencastVisibilityChanged:function(visible)
{this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ScreencastVisibilityChanged,{visible:visible});},colorPicked:function(color)
{this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ColorPicked,color);},interstitialShown:function()
{},interstitialHidden:function()
{}};function SourceMapV3()
{this.version;this.file;this.sources;this.sections;this.mappings;this.sourceRoot;}
SourceMapV3.Section=function()
{this.map;this.offset;}
SourceMapV3.Offset=function()
{this.line;this.column;}
WebInspector.SourceMap=function(compiledURL,sourceMappingURL,payload)
{if(!WebInspector.SourceMap.prototype._base64Map){const base64Digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";WebInspector.SourceMap.prototype._base64Map={};for(var i=0;i<base64Digits.length;++i)
WebInspector.SourceMap.prototype._base64Map[base64Digits.charAt(i)]=i;}
this._compiledURL=compiledURL;this._sourceMappingURL=sourceMappingURL;this._reverseMappingsBySourceURL=new Map();this._mappings=[];this._sources={};this._sourceContentByURL={};this._parseMappingPayload(payload);}
WebInspector.SourceMap.load=function(sourceMapURL,compiledURL,callback)
{var parsedURL=new WebInspector.ParsedURL(sourceMapURL);if(parsedURL.isDataURL()){var xhr=new XMLHttpRequest();xhr.open("GET",sourceMapURL,false);xhr.send(null);contentLoaded(xhr.status,{},xhr.responseText);return;}
WebInspector.multitargetNetworkManager.loadResource(sourceMapURL,contentLoaded);function contentLoaded(statusCode,headers,content)
{if(!content||statusCode>=400){callback(null);return;}
if(content.slice(0,3)===")]}")
content=content.substring(content.indexOf('\n'));try{var payload=(JSON.parse(content));var baseURL=sourceMapURL.startsWith("data:")?compiledURL:sourceMapURL;callback(new WebInspector.SourceMap(compiledURL,baseURL,payload));}catch(e){console.error(e.message);WebInspector.console.error("Failed to parse SourceMap: "+sourceMapURL);callback(null);}}}
WebInspector.SourceMap.prototype={url:function()
{return this._sourceMappingURL;},sources:function()
{return Object.keys(this._sources);},sourceContent:function(sourceURL)
{return this._sourceContentByURL[sourceURL];},sourceContentProvider:function(sourceURL,contentType)
{var sourceContent=this.sourceContent(sourceURL);if(sourceContent)
return new WebInspector.StaticContentProvider(contentType,sourceContent);return new WebInspector.CompilerSourceMappingContentProvider(sourceURL,contentType);},_parseMappingPayload:function(mappingPayload)
{if(mappingPayload.sections)
this._parseSections(mappingPayload.sections);else
this._parseMap(mappingPayload,0,0);},_parseSections:function(sections)
{for(var i=0;i<sections.length;++i){var section=sections[i];this._parseMap(section.map,section.offset.line,section.offset.column);}},findEntry:function(lineNumber,columnNumber)
{var first=0;var count=this._mappings.length;while(count>1){var step=count>>1;var middle=first+step;var mapping=this._mappings[middle];if(lineNumber<mapping.lineNumber||(lineNumber===mapping.lineNumber&&columnNumber<mapping.columnNumber))
count=step;else{first=middle;count-=step;}}
var entry=this._mappings[first];if(!first&&entry&&(lineNumber<entry.lineNumber||(lineNumber===entry.lineNumber&&columnNumber<entry.columnNumber)))
return null;return entry;},firstSourceLineMapping:function(sourceURL,lineNumber)
{var mappings=this._reversedMappings(sourceURL);var index=mappings.lowerBound(lineNumber,lineComparator);if(index>=mappings.length||mappings[index].sourceLineNumber!==lineNumber)
return null;return mappings[index];function lineComparator(lineNumber,mapping)
{return lineNumber-mapping.sourceLineNumber;}},_reversedMappings:function(sourceURL)
{var mappings=this._reverseMappingsBySourceURL.get(sourceURL);if(!mappings)
return[];if(!mappings._sorted){mappings.sort(sourceMappingComparator);mappings._sorted=true;}
return mappings;function sourceMappingComparator(a,b)
{if(a.sourceLineNumber!==b.sourceLineNumber)
return a.sourceLineNumber-b.sourceLineNumber;return a.sourceColumnNumber-b.sourceColumnNumber;}},_parseMap:function(map,lineNumber,columnNumber)
{var sourceIndex=0;var sourceLineNumber=0;var sourceColumnNumber=0;var nameIndex=0;var sources=[];var sourceRoot=map.sourceRoot||"";if(sourceRoot&&!sourceRoot.endsWith("/"))
sourceRoot+="/";for(var i=0;i<map.sources.length;++i){var href=sourceRoot+map.sources[i];var url=WebInspector.ParsedURL.completeURL(this._sourceMappingURL,href)||href;var hasSource=map.sourcesContent&&map.sourcesContent[i];if(url===this._compiledURL&&hasSource)
url+=WebInspector.UIString(" [sm]");sources.push(url);this._sources[url]=true;if(hasSource)
this._sourceContentByURL[url]=map.sourcesContent[i];}
var stringCharIterator=new WebInspector.SourceMap.StringCharIterator(map.mappings);var sourceURL=sources[sourceIndex];while(true){if(stringCharIterator.peek()===",")
stringCharIterator.next();else{while(stringCharIterator.peek()===";"){lineNumber+=1;columnNumber=0;stringCharIterator.next();}
if(!stringCharIterator.hasNext())
break;}
columnNumber+=this._decodeVLQ(stringCharIterator);if(!stringCharIterator.hasNext()||this._isSeparator(stringCharIterator.peek())){this._mappings.push(new WebInspector.SourceMap.Entry(lineNumber,columnNumber));continue;}
var sourceIndexDelta=this._decodeVLQ(stringCharIterator);if(sourceIndexDelta){sourceIndex+=sourceIndexDelta;sourceURL=sources[sourceIndex];}
sourceLineNumber+=this._decodeVLQ(stringCharIterator);sourceColumnNumber+=this._decodeVLQ(stringCharIterator);if(!this._isSeparator(stringCharIterator.peek()))
nameIndex+=this._decodeVLQ(stringCharIterator);this._mappings.push(new WebInspector.SourceMap.Entry(lineNumber,columnNumber,sourceURL,sourceLineNumber,sourceColumnNumber));}
for(var i=0;i<this._mappings.length;++i){var mapping=this._mappings[i];var url=mapping.sourceURL;if(!url)
continue;if(!this._reverseMappingsBySourceURL.has(url))
this._reverseMappingsBySourceURL.set(url,[]);var reverseMappings=this._reverseMappingsBySourceURL.get(url);reverseMappings.push(mapping);}},_isSeparator:function(char)
{return char===","||char===";";},_decodeVLQ:function(stringCharIterator)
{var result=0;var shift=0;do{var digit=this._base64Map[stringCharIterator.next()];result+=(digit&this._VLQ_BASE_MASK)<<shift;shift+=this._VLQ_BASE_SHIFT;}while(digit&this._VLQ_CONTINUATION_MASK);var negative=result&1;result>>=1;return negative?-result:result;},_VLQ_BASE_SHIFT:5,_VLQ_BASE_MASK:(1<<5)-1,_VLQ_CONTINUATION_MASK:1<<5}
WebInspector.SourceMap.StringCharIterator=function(string)
{this._string=string;this._position=0;}
WebInspector.SourceMap.StringCharIterator.prototype={next:function()
{return this._string.charAt(this._position++);},peek:function()
{return this._string.charAt(this._position);},hasNext:function()
{return this._position<this._string.length;}}
WebInspector.SourceMap.Entry=function(lineNumber,columnNumber,sourceURL,sourceLineNumber,sourceColumnNumber)
{this.lineNumber=lineNumber;this.columnNumber=columnNumber;this.sourceURL=sourceURL;this.sourceLineNumber=sourceLineNumber;this.sourceColumnNumber=sourceColumnNumber;};WebInspector.NetworkManager=function(target)
{WebInspector.SDKModel.call(this,WebInspector.NetworkManager,target);this._dispatcher=new WebInspector.NetworkDispatcher(this);this._target=target;this._networkAgent=target.networkAgent();target.registerNetworkDispatcher(this._dispatcher);if(WebInspector.moduleSetting("cacheDisabled").get())
this._networkAgent.setCacheDisabled(true);if(WebInspector.moduleSetting("monitoringXHREnabled").get())
this._networkAgent.setMonitoringXHREnabled(true);this._networkAgent.enable();this._certificateDetailsCache=new Map();WebInspector.moduleSetting("cacheDisabled").addChangeListener(this._cacheDisabledSettingChanged,this);}
WebInspector.NetworkManager.EventTypes={RequestStarted:"RequestStarted",RequestUpdated:"RequestUpdated",RequestFinished:"RequestFinished",RequestUpdateDropped:"RequestUpdateDropped",ResponseReceived:"ResponseReceived"}
WebInspector.NetworkManager._MIMETypes={"text/html":{"document":true},"text/xml":{"document":true},"text/plain":{"document":true},"application/xhtml+xml":{"document":true},"image/svg+xml":{"document":true},"text/css":{"stylesheet":true},"text/xsl":{"stylesheet":true},"text/vtt":{"texttrack":true},}
WebInspector.NetworkManager.Conditions;WebInspector.NetworkManager.prototype={inflightRequestForURL:function(url)
{return this._dispatcher._inflightRequestsByURL[url];},_cacheDisabledSettingChanged:function(event)
{var enabled=(event.data);this._networkAgent.setCacheDisabled(enabled);},dispose:function()
{WebInspector.moduleSetting("cacheDisabled").removeChangeListener(this._cacheDisabledSettingChanged,this);},certificateDetailsPromise:function(certificateId)
{var cachedPromise=this._certificateDetailsCache.get(certificateId);if(cachedPromise)
return cachedPromise;function executor(resolve,reject){function innerCallback(error,certificateDetails)
{if(error){console.error("Unable to get certificate details from the browser (for certificate ID ",certificateId,"): ",error);reject();}else{resolve(certificateDetails);}}
this._networkAgent.getCertificateDetails(certificateId,innerCallback);}
var promise=new Promise(executor.bind(this));this._certificateDetailsCache.set(certificateId,promise);return promise;},__proto__:WebInspector.SDKModel.prototype}
WebInspector.NetworkDispatcher=function(manager)
{this._manager=manager;this._inflightRequestsById={};this._inflightRequestsByURL={};}
WebInspector.NetworkDispatcher.prototype={_headersMapToHeadersArray:function(headersMap)
{var result=[];for(var name in headersMap){var values=headersMap[name].split("\n");for(var i=0;i<values.length;++i)
result.push({name:name,value:values[i]});}
return result;},_updateNetworkRequestWithRequest:function(networkRequest,request)
{networkRequest.requestMethod=request.method;networkRequest.setRequestHeaders(this._headersMapToHeadersArray(request.headers));networkRequest.requestFormData=request.postData;networkRequest.setInitialPriority(request.initialPriority);networkRequest.mixedContentType=request.mixedContentType||NetworkAgent.RequestMixedContentType.None;},_updateNetworkRequestWithResponse:function(networkRequest,response)
{if(response.url&&networkRequest.url!==response.url)
networkRequest.url=response.url;networkRequest.mimeType=response.mimeType;networkRequest.statusCode=response.status;networkRequest.statusText=response.statusText;networkRequest.responseHeaders=this._headersMapToHeadersArray(response.headers);if(response.encodedDataLength>=0)
networkRequest.setTransferSize(response.encodedDataLength);if(response.headersText)
networkRequest.responseHeadersText=response.headersText;if(response.requestHeaders){networkRequest.setRequestHeaders(this._headersMapToHeadersArray(response.requestHeaders));networkRequest.setRequestHeadersText(response.requestHeadersText||"");}
networkRequest.connectionReused=response.connectionReused;networkRequest.connectionId=String(response.connectionId);if(response.remoteIPAddress)
networkRequest.setRemoteAddress(response.remoteIPAddress,response.remotePort||-1);if(response.fromServiceWorker)
networkRequest.fetchedViaServiceWorker=true;if(response.fromDiskCache)
networkRequest.setFromDiskCache();networkRequest.timing=response.timing;networkRequest.protocol=response.protocol;networkRequest.setSecurityState(response.securityState);if(!this._mimeTypeIsConsistentWithType(networkRequest)){var consoleModel=this._manager._target.consoleModel;consoleModel.addMessage(new WebInspector.ConsoleMessage(consoleModel.target(),WebInspector.ConsoleMessage.MessageSource.Network,WebInspector.ConsoleMessage.MessageLevel.Log,WebInspector.UIString("Resource interpreted as %s but transferred with MIME type %s: \"%s\".",networkRequest.resourceType().title(),networkRequest.mimeType,networkRequest.url),WebInspector.ConsoleMessage.MessageType.Log,"",0,0,networkRequest.requestId));}
if(response.securityDetails)
networkRequest.setSecurityDetails(response.securityDetails);},_mimeTypeIsConsistentWithType:function(networkRequest)
{if(networkRequest.hasErrorStatusCode()||networkRequest.statusCode===304||networkRequest.statusCode===204)
return true;var resourceType=networkRequest.resourceType();if(resourceType!==WebInspector.resourceTypes.Stylesheet&&resourceType!==WebInspector.resourceTypes.Document&&resourceType!==WebInspector.resourceTypes.TextTrack){return true;}
if(!networkRequest.mimeType)
return true;if(networkRequest.mimeType in WebInspector.NetworkManager._MIMETypes)
return resourceType.name()in WebInspector.NetworkManager._MIMETypes[networkRequest.mimeType];return false;},requestWillBeSent:function(requestId,frameId,loaderId,documentURL,request,time,wallTime,initiator,redirectResponse,resourceType)
{var networkRequest=this._inflightRequestsById[requestId];if(networkRequest){if(!redirectResponse)
return;this.responseReceived(requestId,frameId,loaderId,time,PageAgent.ResourceType.Other,redirectResponse);networkRequest=this._appendRedirect(requestId,time,request.url);}else
networkRequest=this._createNetworkRequest(requestId,frameId,loaderId,request.url,documentURL,initiator);networkRequest.hasNetworkData=true;this._updateNetworkRequestWithRequest(networkRequest,request);networkRequest.setIssueTime(time,wallTime);networkRequest.setResourceType(WebInspector.resourceTypes[resourceType]);this._startNetworkRequest(networkRequest);},requestServedFromCache:function(requestId)
{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
return;networkRequest.setFromMemoryCache();},responseReceived:function(requestId,frameId,loaderId,time,resourceType,response)
{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest){var eventData={};eventData.url=response.url;eventData.frameId=frameId;eventData.loaderId=loaderId;eventData.resourceType=resourceType;eventData.mimeType=response.mimeType;this._manager.dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestUpdateDropped,eventData);return;}
networkRequest.responseReceivedTime=time;networkRequest.setResourceType(WebInspector.resourceTypes[resourceType]);this._updateNetworkRequestWithResponse(networkRequest,response);this._updateNetworkRequest(networkRequest);this._manager.dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.ResponseReceived,networkRequest);},dataReceived:function(requestId,time,dataLength,encodedDataLength)
{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
return;networkRequest.resourceSize+=dataLength;if(encodedDataLength!=-1)
networkRequest.increaseTransferSize(encodedDataLength);networkRequest.endTime=time;this._updateNetworkRequest(networkRequest);},loadingFinished:function(requestId,finishTime,encodedDataLength)
{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
return;this._finishNetworkRequest(networkRequest,finishTime,encodedDataLength);},loadingFailed:function(requestId,time,resourceType,localizedDescription,canceled,blockedReason)
{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
return;networkRequest.failed=true;networkRequest.setResourceType(WebInspector.resourceTypes[resourceType]);networkRequest.canceled=canceled;if(blockedReason){networkRequest.setBlockedReason(blockedReason);if(blockedReason===NetworkAgent.BlockedReason.Inspector){var consoleModel=this._manager._target.consoleModel;consoleModel.addMessage(new WebInspector.ConsoleMessage(consoleModel.target(),WebInspector.ConsoleMessage.MessageSource.Network,WebInspector.ConsoleMessage.MessageLevel.Warning,WebInspector.UIString("Request was blocked by DevTools: \"%s\".",networkRequest.url),WebInspector.ConsoleMessage.MessageType.Log,"",0,0,networkRequest.requestId));}}
networkRequest.localizedFailDescription=localizedDescription;this._finishNetworkRequest(networkRequest,time,-1);},webSocketCreated:function(requestId,requestURL)
{var networkRequest=new WebInspector.NetworkRequest(this._manager._target,requestId,requestURL,"","","",null);networkRequest.setResourceType(WebInspector.resourceTypes.WebSocket);this._startNetworkRequest(networkRequest);},webSocketWillSendHandshakeRequest:function(requestId,time,wallTime,request)
{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
return;networkRequest.requestMethod="GET";networkRequest.setRequestHeaders(this._headersMapToHeadersArray(request.headers));networkRequest.setIssueTime(time,wallTime);this._updateNetworkRequest(networkRequest);},webSocketHandshakeResponseReceived:function(requestId,time,response)
{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
return;networkRequest.statusCode=response.status;networkRequest.statusText=response.statusText;networkRequest.responseHeaders=this._headersMapToHeadersArray(response.headers);networkRequest.responseHeadersText=response.headersText;if(response.requestHeaders)
networkRequest.setRequestHeaders(this._headersMapToHeadersArray(response.requestHeaders));if(response.requestHeadersText)
networkRequest.setRequestHeadersText(response.requestHeadersText);networkRequest.responseReceivedTime=time;networkRequest.protocol="websocket";this._updateNetworkRequest(networkRequest);},webSocketFrameReceived:function(requestId,time,response)
{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
return;networkRequest.addFrame(response,time);networkRequest.responseReceivedTime=time;this._updateNetworkRequest(networkRequest);},webSocketFrameSent:function(requestId,time,response)
{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
return;networkRequest.addFrame(response,time,true);networkRequest.responseReceivedTime=time;this._updateNetworkRequest(networkRequest);},webSocketFrameError:function(requestId,time,errorMessage)
{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
return;networkRequest.addFrameError(errorMessage,time);networkRequest.responseReceivedTime=time;this._updateNetworkRequest(networkRequest);},webSocketClosed:function(requestId,time)
{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
return;this._finishNetworkRequest(networkRequest,time,-1);},eventSourceMessageReceived:function(requestId,time,eventName,eventId,data)
{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
return;networkRequest.addEventSourceMessage(time,eventName,eventId,data);},_appendRedirect:function(requestId,time,redirectURL)
{var originalNetworkRequest=this._inflightRequestsById[requestId];var previousRedirects=originalNetworkRequest.redirects||[];originalNetworkRequest.requestId=requestId+":redirected."+previousRedirects.length;delete originalNetworkRequest.redirects;if(previousRedirects.length>0)
originalNetworkRequest.redirectSource=previousRedirects[previousRedirects.length-1];this._finishNetworkRequest(originalNetworkRequest,time,-1);var newNetworkRequest=this._createNetworkRequest(requestId,originalNetworkRequest.frameId,originalNetworkRequest.loaderId,redirectURL,originalNetworkRequest.documentURL,originalNetworkRequest.initiator());newNetworkRequest.redirects=previousRedirects.concat(originalNetworkRequest);return newNetworkRequest;},_startNetworkRequest:function(networkRequest)
{this._inflightRequestsById[networkRequest.requestId]=networkRequest;this._inflightRequestsByURL[networkRequest.url]=networkRequest;this._dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestStarted,networkRequest);},_updateNetworkRequest:function(networkRequest)
{this._dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestUpdated,networkRequest);},_finishNetworkRequest:function(networkRequest,finishTime,encodedDataLength)
{networkRequest.endTime=finishTime;networkRequest.finished=true;if(encodedDataLength>=0)
networkRequest.setTransferSize(encodedDataLength);this._dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestFinished,networkRequest);delete this._inflightRequestsById[networkRequest.requestId];delete this._inflightRequestsByURL[networkRequest.url];},_dispatchEventToListeners:function(eventType,networkRequest)
{this._manager.dispatchEventToListeners(eventType,networkRequest);},_createNetworkRequest:function(requestId,frameId,loaderId,url,documentURL,initiator)
{return new WebInspector.NetworkRequest(this._manager._target,requestId,url,documentURL,frameId,loaderId,initiator);}}
WebInspector.MultitargetNetworkManager=function()
{WebInspector.Object.call(this);WebInspector.targetManager.observeTargets(this);this._blockedURLs=new Set();this._blockedSetting=WebInspector.moduleSetting("blockedURLs");this._blockedSetting.addChangeListener(this._updateBlockedURLs,this);this._blockedSetting.set([]);this._updateBlockedURLs();this._userAgentOverride="";this._agentsCapableOfEmulation=new Set();this._networkConditions={download:-1,upload:-1,latency:0};}
WebInspector.MultitargetNetworkManager.Events={ConditionsChanged:"ConditionsChanged",UserAgentChanged:"UserAgentChanged"}
WebInspector.MultitargetNetworkManager.prototype={targetAdded:function(target)
{var networkAgent=target.networkAgent();if(this._extraHeaders)
networkAgent.setExtraHTTPHeaders(this._extraHeaders);if(this._currentUserAgent())
networkAgent.setUserAgentOverride(this._currentUserAgent());for(var url of this._blockedURLs)
networkAgent.addBlockedURL(url);networkAgent.canEmulateNetworkConditions(callback.bind(this));function callback(error,canEmulate)
{if(error||!canEmulate)
return;this._agentsCapableOfEmulation.add(networkAgent);if(this.isThrottling())
this._updateNetworkConditions(networkAgent);}},targetRemoved:function(target)
{this._agentsCapableOfEmulation.delete(target.networkAgent());},isThrottling:function()
{return this._networkConditions.download>=0||this._networkConditions.upload>=0||this._networkConditions.latency>0;},isOffline:function()
{return!this._networkConditions.download&&!this._networkConditions.upload;},setNetworkConditions:function(conditions)
{this._networkConditions=conditions;for(var agent of this._agentsCapableOfEmulation)
this._updateNetworkConditions(agent);this.dispatchEventToListeners(WebInspector.MultitargetNetworkManager.Events.ConditionsChanged);},networkConditions:function()
{return this._networkConditions;},_updateNetworkConditions:function(networkAgent)
{var conditions=this._networkConditions;if(!this.isThrottling()){networkAgent.emulateNetworkConditions(false,0,0,0);}else{networkAgent.emulateNetworkConditions(this.isOffline(),conditions.latency,conditions.download<0?0:conditions.download,conditions.upload<0?0:conditions.upload);}},setExtraHTTPHeaders:function(headers)
{this._extraHeaders=headers;for(var target of WebInspector.targetManager.targets())
target.networkAgent().setExtraHTTPHeaders(this._extraHeaders);},_currentUserAgent:function()
{return this._customUserAgent?this._customUserAgent:this._userAgentOverride;},_updateUserAgentOverride:function()
{var userAgent=this._currentUserAgent();WebInspector.ResourceLoader.targetUserAgent=userAgent;for(var target of WebInspector.targetManager.targets())
target.networkAgent().setUserAgentOverride(userAgent);},setUserAgentOverride:function(userAgent)
{if(this._userAgentOverride===userAgent)
return;this._userAgentOverride=userAgent;if(!this._customUserAgent)
this._updateUserAgentOverride();this.dispatchEventToListeners(WebInspector.MultitargetNetworkManager.Events.UserAgentChanged);},userAgentOverride:function()
{return this._userAgentOverride;},setCustomUserAgentOverride:function(userAgent)
{this._customUserAgent=userAgent;this._updateUserAgentOverride();},_updateBlockedURLs:function()
{var blocked=this._blockedSetting.get();for(var url of blocked){if(!this._blockedURLs.has(url))
this._addBlockedURL(url);}
for(var url of this._blockedURLs){if(blocked.indexOf(url)===-1)
this._removeBlockedURL(url);}},_addBlockedURL:function(url)
{this._blockedURLs.add(url);for(var target of WebInspector.targetManager.targets())
target.networkAgent().addBlockedURL(url);},_removeBlockedURL:function(url)
{this._blockedURLs.delete(url);for(var target of WebInspector.targetManager.targets())
target.networkAgent().removeBlockedURL(url);},clearBrowserCache:function()
{for(var target of WebInspector.targetManager.targets())
target.networkAgent().clearBrowserCache();},clearBrowserCookies:function()
{for(var target of WebInspector.targetManager.targets())
target.networkAgent().clearBrowserCookies();},showCertificateViewer:function(certificateId)
{var target=WebInspector.targetManager.mainTarget();if(target)
target.networkAgent().showCertificateViewer(certificateId);},loadResource:function(url,callback)
{var headers={};var currentUserAgent=this._currentUserAgent();if(currentUserAgent)
headers["User-Agent"]=currentUserAgent;if(WebInspector.moduleSetting("cacheDisabled").get())
headers["Cache-Control"]="no-cache";WebInspector.ResourceLoader.load(url,headers,callback);},__proto__:WebInspector.Object.prototype}
WebInspector.multitargetNetworkManager;;WebInspector.NetworkRequest=function(target,requestId,url,documentURL,frameId,loaderId,initiator)
{WebInspector.SDKObject.call(this,target);this._requestId=requestId;this.url=url;this._documentURL=documentURL;this._frameId=frameId;this._loaderId=loaderId;this._initiator=initiator;this._issueTime=-1;this._startTime=-1;this._endTime=-1;this._blockedReason=undefined;this.statusCode=0;this.statusText="";this.requestMethod="";this.requestTime=0;this.protocol="";this.mixedContentType=NetworkAgent.RequestMixedContentType.None;this._initialPriority=null;this._resourceType=WebInspector.resourceTypes.Other;this._contentEncoded=false;this._pendingContentCallbacks=[];this._frames=[];this._eventSourceMessages=[];this._responseHeaderValues={};this._remoteAddress="";this._securityState=SecurityAgent.SecurityState.Unknown;this._securityDetails=null;this.connectionId="0";}
WebInspector.NetworkRequest.Events={FinishedLoading:"FinishedLoading",TimingChanged:"TimingChanged",RemoteAddressChanged:"RemoteAddressChanged",RequestHeadersChanged:"RequestHeadersChanged",ResponseHeadersChanged:"ResponseHeadersChanged",WebsocketFrameAdded:"WebsocketFrameAdded",EventSourceMessageAdded:"EventSourceMessageAdded",}
WebInspector.NetworkRequest.InitiatorType={Other:"other",Parser:"parser",Redirect:"redirect",Script:"script"}
WebInspector.NetworkRequest.NameValue;WebInspector.NetworkRequest.WebSocketFrameType={Send:"send",Receive:"receive",Error:"error"}
WebInspector.NetworkRequest.WebSocketFrame;WebInspector.NetworkRequest.EventSourceMessage;WebInspector.NetworkRequest.prototype={indentityCompare:function(other)
{if(this._requestId>other._requestId)
return 1;if(this._requestId<other._requestId)
return-1;return 0;},get requestId()
{return this._requestId;},set requestId(requestId)
{this._requestId=requestId;},get url()
{return this._url;},set url(x)
{if(this._url===x)
return;this._url=x;this._parsedURL=new WebInspector.ParsedURL(x);delete this._queryString;delete this._parsedQueryParameters;delete this._name;delete this._path;},get documentURL()
{return this._documentURL;},get parsedURL()
{return this._parsedURL;},get frameId()
{return this._frameId;},get loaderId()
{return this._loaderId;},setRemoteAddress:function(ip,port)
{if(ip.indexOf(":")!==-1)
ip="["+ip+"]";this._remoteAddress=ip+":"+port;this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.RemoteAddressChanged,this);},remoteAddress:function()
{return this._remoteAddress;},securityState:function()
{return this._securityState;},setSecurityState:function(securityState)
{this._securityState=securityState;},securityDetails:function()
{return this._securityDetails;},setSecurityDetails:function(securityDetails)
{this._securityDetails=securityDetails;},get startTime()
{return this._startTime||-1;},setIssueTime:function(monotonicTime,wallTime)
{this._issueTime=monotonicTime;this._wallIssueTime=wallTime;this._startTime=monotonicTime;},issueTime:function()
{return this._issueTime;},pseudoWallTime:function(monotonicTime)
{return this._wallIssueTime?this._wallIssueTime-this._issueTime+monotonicTime:monotonicTime;},get responseReceivedTime()
{return this._responseReceivedTime||-1;},set responseReceivedTime(x)
{this._responseReceivedTime=x;},get endTime()
{return this._endTime||-1;},set endTime(x)
{if(this.timing&&this.timing.requestTime){this._endTime=Math.max(x,this.responseReceivedTime);}else{this._endTime=x;if(this._responseReceivedTime>x)
this._responseReceivedTime=x;}
this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.TimingChanged,this);},get duration()
{if(this._endTime===-1||this._startTime===-1)
return-1;return this._endTime-this._startTime;},get latency()
{if(this._responseReceivedTime===-1||this._startTime===-1)
return-1;return this._responseReceivedTime-this._startTime;},get resourceSize()
{return this._resourceSize||0;},set resourceSize(x)
{this._resourceSize=x;},get transferSize()
{return this._transferSize||0;},increaseTransferSize:function(x)
{this._transferSize=(this._transferSize||0)+x;},setTransferSize:function(x)
{this._transferSize=x;},get finished()
{return this._finished;},set finished(x)
{if(this._finished===x)
return;this._finished=x;if(x){this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.FinishedLoading,this);if(this._pendingContentCallbacks.length)
this._innerRequestContent();}},get failed()
{return this._failed;},set failed(x)
{this._failed=x;},get canceled()
{return this._canceled;},set canceled(x)
{this._canceled=x;},blockedReason:function()
{return this._blockedReason;},setBlockedReason:function(reason)
{this._blockedReason=reason;},wasBlocked:function()
{return!!this._blockedReason;},cached:function()
{return(!!this._fromMemoryCache||!!this._fromDiskCache)&&!this._transferSize;},setFromMemoryCache:function()
{this._fromMemoryCache=true;delete this._timing;},setFromDiskCache:function()
{this._fromDiskCache=true;},get fetchedViaServiceWorker()
{return this._fetchedViaServiceWorker;},set fetchedViaServiceWorker(x)
{this._fetchedViaServiceWorker=x;},get timing()
{return this._timing;},set timing(x)
{if(x&&!this._fromMemoryCache){this._startTime=x.requestTime;this._responseReceivedTime=x.requestTime+x.receiveHeadersEnd/1000.0;this._timing=x;this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.TimingChanged,this);}},get mimeType()
{return this._mimeType;},set mimeType(x)
{this._mimeType=x;},get displayName()
{return this._parsedURL.displayName;},name:function()
{if(this._name)
return this._name;this._parseNameAndPathFromURL();return this._name;},path:function()
{if(this._path)
return this._path;this._parseNameAndPathFromURL();return this._path;},_parseNameAndPathFromURL:function()
{if(this._parsedURL.isDataURL()){this._name=this._parsedURL.dataURLDisplayName();this._path="";}else if(this._parsedURL.isAboutBlank()){this._name=this._parsedURL.url;this._path="";}else{this._path=this._parsedURL.host+this._parsedURL.folderPathComponents;this._path=this._path.trimURL(this.target().resourceTreeModel.inspectedPageDomain());if(this._parsedURL.lastPathComponent||this._parsedURL.queryParams)
this._name=this._parsedURL.lastPathComponent+(this._parsedURL.queryParams?"?"+this._parsedURL.queryParams:"");else if(this._parsedURL.folderPathComponents){this._name=this._parsedURL.folderPathComponents.substring(this._parsedURL.folderPathComponents.lastIndexOf("/")+1)+"/";this._path=this._path.substring(0,this._path.lastIndexOf("/"));}else{this._name=this._parsedURL.host;this._path="";}}},get folder()
{var path=this._parsedURL.path;var indexOfQuery=path.indexOf("?");if(indexOfQuery!==-1)
path=path.substring(0,indexOfQuery);var lastSlashIndex=path.lastIndexOf("/");return lastSlashIndex!==-1?path.substring(0,lastSlashIndex):"";},resourceType:function()
{return this._resourceType;},setResourceType:function(resourceType)
{this._resourceType=resourceType;},get domain()
{return this._parsedURL.host;},get scheme()
{return this._parsedURL.scheme;},get redirectSource()
{if(this.redirects&&this.redirects.length>0)
return this.redirects[this.redirects.length-1];return this._redirectSource;},set redirectSource(x)
{this._redirectSource=x;delete this._initiatorInfo;},requestHeaders:function()
{return this._requestHeaders||[];},setRequestHeaders:function(headers)
{this._requestHeaders=headers;delete this._requestCookies;this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.RequestHeadersChanged);},requestHeadersText:function()
{return this._requestHeadersText;},setRequestHeadersText:function(text)
{this._requestHeadersText=text;this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.RequestHeadersChanged);},requestHeaderValue:function(headerName)
{return this._headerValue(this.requestHeaders(),headerName);},get requestCookies()
{if(!this._requestCookies)
this._requestCookies=WebInspector.CookieParser.parseCookie(this.target(),this.requestHeaderValue("Cookie"));return this._requestCookies;},get requestFormData()
{return this._requestFormData;},set requestFormData(x)
{this._requestFormData=x;delete this._parsedFormParameters;},requestHttpVersion:function()
{var headersText=this.requestHeadersText();if(!headersText)
return this.requestHeaderValue("version")||this.requestHeaderValue(":version")||"unknown";var firstLine=headersText.split(/\r\n/)[0];var match=firstLine.match(/(HTTP\/\d+\.\d+)$/);return match?match[1]:"HTTP/0.9";},get responseHeaders()
{return this._responseHeaders||[];},set responseHeaders(x)
{this._responseHeaders=x;delete this._sortedResponseHeaders;delete this._responseCookies;this._responseHeaderValues={};this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.ResponseHeadersChanged);},get responseHeadersText()
{return this._responseHeadersText;},set responseHeadersText(x)
{this._responseHeadersText=x;this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.ResponseHeadersChanged);},get sortedResponseHeaders()
{if(this._sortedResponseHeaders!==undefined)
return this._sortedResponseHeaders;this._sortedResponseHeaders=this.responseHeaders.slice();this._sortedResponseHeaders.sort(function(a,b){return a.name.toLowerCase().compareTo(b.name.toLowerCase());});return this._sortedResponseHeaders;},responseHeaderValue:function(headerName)
{var value=this._responseHeaderValues[headerName];if(value===undefined){value=this._headerValue(this.responseHeaders,headerName);this._responseHeaderValues[headerName]=(value!==undefined)?value:null;}
return(value!==null)?value:undefined;},get responseCookies()
{if(!this._responseCookies)
this._responseCookies=WebInspector.CookieParser.parseSetCookie(this.target(),this.responseHeaderValue("Set-Cookie"));return this._responseCookies;},queryString:function()
{if(this._queryString!==undefined)
return this._queryString;var queryString=null;var url=this.url;var questionMarkPosition=url.indexOf("?");if(questionMarkPosition!==-1){queryString=url.substring(questionMarkPosition+1);var hashSignPosition=queryString.indexOf("#");if(hashSignPosition!==-1)
queryString=queryString.substring(0,hashSignPosition);}
this._queryString=queryString;return this._queryString;},get queryParameters()
{if(this._parsedQueryParameters)
return this._parsedQueryParameters;var queryString=this.queryString();if(!queryString)
return null;this._parsedQueryParameters=this._parseParameters(queryString);return this._parsedQueryParameters;},get formParameters()
{if(this._parsedFormParameters)
return this._parsedFormParameters;if(!this.requestFormData)
return null;var requestContentType=this.requestContentType();if(!requestContentType||!requestContentType.match(/^application\/x-www-form-urlencoded\s*(;.*)?$/i))
return null;this._parsedFormParameters=this._parseParameters(this.requestFormData);return this._parsedFormParameters;},responseHttpVersion:function()
{var headersText=this._responseHeadersText;if(!headersText)
return this.responseHeaderValue("version")||this.responseHeaderValue(":version")||"unknown";var firstLine=headersText.split(/\r\n/)[0];var match=firstLine.match(/^(HTTP\/\d+\.\d+)/);return match?match[1]:"HTTP/0.9";},_parseParameters:function(queryString)
{function parseNameValue(pair)
{var position=pair.indexOf("=");if(position===-1)
return{name:pair,value:""};else
return{name:pair.substring(0,position),value:pair.substring(position+1)};}
return queryString.split("&").map(parseNameValue);},_headerValue:function(headers,headerName)
{headerName=headerName.toLowerCase();var values=[];for(var i=0;i<headers.length;++i){if(headers[i].name.toLowerCase()===headerName)
values.push(headers[i].value);}
if(!values.length)
return undefined;if(headerName==="set-cookie")
return values.join("\n");return values.join(", ");},get content()
{return this._content;},contentError:function()
{return this._contentError;},get contentEncoded()
{return this._contentEncoded;},contentURL:function()
{return this._url;},contentType:function()
{return this._resourceType;},requestContent:function(callback)
{if(this._resourceType===WebInspector.resourceTypes.WebSocket){callback(null);return;}
if(typeof this._content!=="undefined"){callback(this.content||null);return;}
this._pendingContentCallbacks.push(callback);if(this.finished)
this._innerRequestContent();},searchInContent:function(query,caseSensitive,isRegex,callback)
{callback([]);},isHttpFamily:function()
{return!!this.url.match(/^https?:/i);},requestContentType:function()
{return this.requestHeaderValue("Content-Type");},hasErrorStatusCode:function()
{return this.statusCode>=400;},setInitialPriority:function(priority)
{this._initialPriority=priority;},initialPriority:function()
{return this._initialPriority;},populateImageSource:function(image)
{WebInspector.Resource.populateImageSource(this._url,this._mimeType,this,image);},asDataURL:function()
{var content=this._content;var charset=null;if(!this._contentEncoded){content=content.toBase64();charset="utf-8";}
return WebInspector.Resource.contentAsDataURL(content,this.mimeType,true,charset);},_innerRequestContent:function()
{if(this._contentRequested)
return;this._contentRequested=true;function onResourceContent(error,content,contentEncoded)
{this._content=error?null:content;this._contentError=error;this._contentEncoded=contentEncoded;var callbacks=this._pendingContentCallbacks.slice();for(var i=0;i<callbacks.length;++i)
callbacks[i](this._content);this._pendingContentCallbacks.length=0;delete this._contentRequested;}
this.target().networkAgent().getResponseBody(this._requestId,onResourceContent.bind(this));},initiator:function()
{return this._initiator;},initiatorInfo:function()
{if(this._initiatorInfo)
return this._initiatorInfo;var type=WebInspector.NetworkRequest.InitiatorType.Other;var url="";var lineNumber=-Infinity;var columnNumber=-Infinity;var initiator=this._initiator;if(this.redirectSource){type=WebInspector.NetworkRequest.InitiatorType.Redirect;url=this.redirectSource.url;}else if(initiator){if(initiator.type===NetworkAgent.InitiatorType.Parser){type=WebInspector.NetworkRequest.InitiatorType.Parser;url=initiator.url?initiator.url:url;lineNumber=initiator.lineNumber?initiator.lineNumber:lineNumber;}else if(initiator.type===NetworkAgent.InitiatorType.Script){var topFrame=initiator.stackTrace?initiator.stackTrace[0]:null;if(topFrame&&topFrame.url){type=WebInspector.NetworkRequest.InitiatorType.Script;url=topFrame.url;lineNumber=topFrame.lineNumber;columnNumber=topFrame.columnNumber;}}}
this._initiatorInfo={type:type,url:url,lineNumber:lineNumber,columnNumber:columnNumber};return this._initiatorInfo;},initiatorRequest:function()
{if(this._initiatorRequest===undefined)
this._initiatorRequest=this.target().networkLog.requestForURL(this.initiatorInfo().url);return this._initiatorRequest;},initiatorChain:function()
{if(this._initiatorChain)
return this._initiatorChain;this._initiatorChain=new Set();var request=this;while(request){this._initiatorChain.add(request);request=request.initiatorRequest();}
return this._initiatorChain;},frames:function()
{return this._frames;},addFrameError:function(errorMessage,time)
{this._addFrame({type:WebInspector.NetworkRequest.WebSocketFrameType.Error,text:errorMessage,time:this.pseudoWallTime(time),opCode:-1,mask:false});},addFrame:function(response,time,sent)
{var type=sent?WebInspector.NetworkRequest.WebSocketFrameType.Send:WebInspector.NetworkRequest.WebSocketFrameType.Receive;this._addFrame({type:type,text:response.payloadData,time:this.pseudoWallTime(time),opCode:response.opcode,mask:response.mask});},_addFrame:function(frame)
{this._frames.push(frame);this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.WebsocketFrameAdded,frame);},eventSourceMessages:function()
{return this._eventSourceMessages;},addEventSourceMessage:function(time,eventName,eventId,data)
{var message={time:this.pseudoWallTime(time),eventName:eventName,eventId:eventId,data:data};this._eventSourceMessages.push(message);this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.EventSourceMessageAdded,message);},replayXHR:function()
{this.target().networkAgent().replayXHR(this.requestId);},__proto__:WebInspector.SDKObject.prototype};WebInspector.PictureFragment;WebInspector.PaintProfilerSnapshot=function(target,snapshotId)
{this._target=target;this._id=snapshotId;}
WebInspector.PaintProfilerSnapshot.loadFromFragments=function(target,fragments,callback)
{var wrappedCallback=InspectorBackend.wrapClientCallback(callback,"LayerTreeAgent.loadSnapshot(): ",WebInspector.PaintProfilerSnapshot.bind(null,target));target.layerTreeAgent().loadSnapshot(fragments,wrappedCallback);}
WebInspector.PaintProfilerSnapshot.load=function(target,encodedPicture,callback)
{var fragment={x:0,y:0,picture:encodedPicture};WebInspector.PaintProfilerSnapshot.loadFromFragments(target,[fragment],callback);}
WebInspector.PaintProfilerSnapshot._processAnnotations=function(log)
{var result=[];var commentGroupStack=[];for(var i=0;i<log.length;++i){var method=log[i].method;switch(method){case"beginCommentGroup":commentGroupStack.push({});break;case"addComment":var group=commentGroupStack.peekLast();if(!group){console.assert(false,"Stray comment without a group");break;}
var key=String(log[i].params["key"]);var value=String(log[i].params["value"]);if(!key||typeof value==="undefined"){console.assert(false,"Missing key or value in addComment() params");break;}
if(key in group){console.assert(false,"Duplicate key in comment group");break;}
group[key]=value;break;case"endCommentGroup":if(!commentGroupStack.length)
console.assert(false,"Unbalanced commentGroupEnd call");else
commentGroupStack.pop();break;default:result.push(new WebInspector.PaintProfilerLogItem(log[i],i,commentGroupStack.peekLast()));}}
return result;}
WebInspector.PaintProfilerSnapshot.prototype={dispose:function()
{this._target.layerTreeAgent().releaseSnapshot(this._id);},target:function()
{return this._target;},requestImage:function(firstStep,lastStep,scale,callback)
{var wrappedCallback=InspectorBackend.wrapClientCallback(callback,"LayerTreeAgent.replaySnapshot(): ");this._target.layerTreeAgent().replaySnapshot(this._id,firstStep||undefined,lastStep||undefined,scale||1.0,wrappedCallback);},profile:function(clipRect,callback)
{var wrappedCallback=InspectorBackend.wrapClientCallback(callback,"LayerTreeAgent.profileSnapshot(): ");this._target.layerTreeAgent().profileSnapshot(this._id,5,1,clipRect||undefined,wrappedCallback);},commandLog:function(callback)
{function callbackWrapper(error,log)
{if(error){console.error("LayerTreeAgent.snapshotCommandLog(): "+error);callback();return;}
callback(WebInspector.PaintProfilerSnapshot._processAnnotations(log));}
this._target.layerTreeAgent().snapshotCommandLog(this._id,callbackWrapper);}};WebInspector.RawPaintProfilerLogItem;WebInspector.PaintProfilerLogItem=function(rawEntry,commandIndex,annotations)
{this.method=rawEntry.method;this.params=rawEntry.params;this.annotations=annotations;this.commandIndex=commandIndex;}
WebInspector.PaintProfilerLogItem.prototype={nodeId:function()
{if(!this.annotations)
return 0;var inspectorId=this.annotations["INSPECTOR_ID"];return Number(inspectorId);}};WebInspector.HeapProfilerModel=function(target)
{WebInspector.SDKModel.call(this,WebInspector.HeapProfilerModel,target);target.registerHeapProfilerDispatcher(new WebInspector.HeapProfilerDispatcher(this));this._enabled=false;this._heapProfilerAgent=target.heapProfilerAgent();}
WebInspector.HeapProfilerModel.Events={HeapStatsUpdate:"HeapStatsUpdate",LastSeenObjectId:"LastSeenObjectId",AddHeapSnapshotChunk:"AddHeapSnapshotChunk",ReportHeapSnapshotProgress:"ReportHeapSnapshotProgress",ResetProfiles:"ResetProfiles"}
WebInspector.HeapProfilerModel.prototype={enable:function()
{if(this._enabled)
return;this._enabled=true;this._heapProfilerAgent.enable();},heapStatsUpdate:function(samples)
{this.dispatchEventToListeners(WebInspector.HeapProfilerModel.Events.HeapStatsUpdate,samples);},lastSeenObjectId:function(lastSeenObjectId,timestamp)
{this.dispatchEventToListeners(WebInspector.HeapProfilerModel.Events.LastSeenObjectId,{lastSeenObjectId:lastSeenObjectId,timestamp:timestamp});},addHeapSnapshotChunk:function(chunk)
{this.dispatchEventToListeners(WebInspector.HeapProfilerModel.Events.AddHeapSnapshotChunk,chunk);},reportHeapSnapshotProgress:function(done,total,finished)
{this.dispatchEventToListeners(WebInspector.HeapProfilerModel.Events.ReportHeapSnapshotProgress,{done:done,total:total,finished:finished});},resetProfiles:function()
{this.dispatchEventToListeners(WebInspector.HeapProfilerModel.Events.ResetProfiles);},__proto__:WebInspector.SDKModel.prototype}
WebInspector.HeapProfilerDispatcher=function(model)
{this._heapProfilerModel=model;}
WebInspector.HeapProfilerDispatcher.prototype={heapStatsUpdate:function(samples)
{this._heapProfilerModel.heapStatsUpdate(samples);},lastSeenObjectId:function(lastSeenObjectId,timestamp)
{this._heapProfilerModel.lastSeenObjectId(lastSeenObjectId,timestamp);},addHeapSnapshotChunk:function(chunk)
{this._heapProfilerModel.addHeapSnapshotChunk(chunk);},reportHeapSnapshotProgress:function(done,total,finished)
{this._heapProfilerModel.reportHeapSnapshotProgress(done,total,finished);},resetProfiles:function()
{this._heapProfilerModel.resetProfiles();}};WebInspector.CSSMetadata.initializeWithSupportedProperties([{"name":"color"},{"name":"direction"},{"name":"font-family"},{"name":"font-kerning"},{"name":"font-size"},{"name":"font-size-adjust"},{"name":"font-stretch"},{"name":"font-style"},{"name":"font-variant"},{"name":"font-variant-ligatures"},{"name":"font-weight"},{"name":"font-feature-settings"},{"name":"-webkit-font-smoothing"},{"name":"-webkit-locale"},{"name":"text-orientation"},{"name":"-webkit-text-orientation"},{"name":"writing-mode"},{"name":"-webkit-writing-mode"},{"name":"text-rendering"},{"name":"zoom"},{"name":"align-content"},{"name":"align-items"},{"name":"alignment-baseline"},{"name":"align-self"},{"name":"animation-delay"},{"name":"animation-direction"},{"name":"animation-duration"},{"name":"animation-fill-mode"},{"name":"animation-iteration-count"},{"name":"animation-name"},{"name":"animation-play-state"},{"name":"animation-timing-function"},{"name":"backdrop-filter"},{"name":"backface-visibility"},{"name":"background-attachment"},{"name":"background-blend-mode"},{"name":"background-clip"},{"name":"background-color"},{"name":"background-image"},{"name":"background-origin"},{"name":"background-position-x"},{"name":"background-position-y"},{"name":"background-repeat-x"},{"name":"background-repeat-y"},{"name":"background-size"},{"name":"baseline-shift"},{"name":"border-bottom-color"},{"name":"border-bottom-left-radius"},{"name":"border-bottom-right-radius"},{"name":"border-bottom-style"},{"name":"border-bottom-width"},{"name":"border-collapse"},{"name":"border-image-outset"},{"name":"border-image-repeat"},{"name":"border-image-slice"},{"name":"border-image-source"},{"name":"border-image-width"},{"name":"border-left-color"},{"name":"border-left-style"},{"name":"border-left-width"},{"name":"border-right-color"},{"name":"border-right-style"},{"name":"border-right-width"},{"name":"border-top-color"},{"name":"border-top-left-radius"},{"name":"border-top-right-radius"},{"name":"border-top-style"},{"name":"border-top-width"},{"name":"bottom"},{"name":"box-shadow"},{"name":"box-sizing"},{"name":"buffered-rendering"},{"name":"caption-side"},{"name":"clear"},{"name":"clip"},{"name":"clip-path"},{"name":"clip-rule"},{"name":"color-interpolation"},{"name":"color-interpolation-filters"},{"name":"color-rendering"},{"name":"column-fill"},{"name":"contain"},{"name":"content"},{"name":"counter-increment"},{"name":"counter-reset"},{"name":"cursor"},{"name":"cx"},{"name":"cy"},{"name":"d"},{"name":"display"},{"name":"dominant-baseline"},{"name":"empty-cells"},{"name":"fill"},{"name":"fill-opacity"},{"name":"fill-rule"},{"name":"filter"},{"name":"flex-basis"},{"name":"flex-direction"},{"name":"flex-grow"},{"name":"flex-shrink"},{"name":"flex-wrap"},{"name":"float"},{"name":"flood-color"},{"name":"flood-opacity"},{"name":"grid-auto-columns"},{"name":"grid-auto-flow"},{"name":"grid-auto-rows"},{"name":"grid-column-end"},{"name":"grid-column-gap"},{"name":"grid-column-start"},{"name":"grid-row-end"},{"name":"grid-row-gap"},{"name":"grid-row-start"},{"name":"grid-template-areas"},{"name":"grid-template-columns"},{"name":"grid-template-rows"},{"name":"height"},{"name":"image-rendering"},{"name":"image-orientation"},{"name":"isolation"},{"name":"justify-content"},{"name":"justify-items"},{"name":"justify-self"},{"name":"left"},{"name":"letter-spacing"},{"name":"lighting-color"},{"name":"line-height"},{"name":"list-style-image"},{"name":"list-style-position"},{"name":"list-style-type"},{"name":"margin-bottom"},{"name":"margin-left"},{"name":"margin-right"},{"name":"margin-top"},{"name":"marker-end"},{"name":"marker-mid"},{"name":"marker-start"},{"name":"mask"},{"name":"mask-source-type"},{"name":"mask-type"},{"name":"max-height"},{"name":"max-width"},{"name":"min-height"},{"name":"min-width"},{"name":"mix-blend-mode"},{"name":"motion-offset"},{"name":"motion-path"},{"name":"motion-rotation"},{"name":"object-fit"},{"name":"object-position"},{"name":"opacity"},{"name":"order"},{"name":"orphans"},{"name":"outline-color"},{"name":"outline-offset"},{"name":"outline-style"},{"name":"outline-width"},{"name":"overflow-wrap"},{"name":"overflow-x"},{"name":"overflow-y"},{"name":"padding-bottom"},{"name":"padding-left"},{"name":"padding-right"},{"name":"padding-top"},{"name":"page-break-after"},{"name":"page-break-before"},{"name":"page-break-inside"},{"name":"paint-order"},{"name":"perspective"},{"name":"perspective-origin"},{"name":"pointer-events"},{"name":"position"},{"name":"quotes"},{"name":"resize"},{"name":"right"},{"name":"r"},{"name":"rx"},{"name":"ry"},{"name":"scroll-behavior"},{"name":"scroll-snap-type"},{"name":"scroll-snap-points-x"},{"name":"scroll-snap-points-y"},{"name":"scroll-snap-destination"},{"name":"scroll-snap-coordinate"},{"name":"shape-image-threshold"},{"name":"shape-margin"},{"name":"shape-outside"},{"name":"shape-rendering"},{"name":"size"},{"name":"speak"},{"name":"stop-color"},{"name":"stop-opacity"},{"name":"stroke"},{"name":"stroke-dasharray"},{"name":"stroke-dashoffset"},{"name":"stroke-linecap"},{"name":"stroke-linejoin"},{"name":"stroke-miterlimit"},{"name":"stroke-opacity"},{"name":"stroke-width"},{"name":"table-layout"},{"name":"tab-size"},{"name":"text-align"},{"name":"text-align-last"},{"name":"text-anchor"},{"name":"text-combine-upright"},{"longhands":["text-decoration-line","text-decoration-style","text-decoration-color"],"name":"text-decoration"},{"name":"text-decoration-color"},{"name":"text-decoration-line"},{"name":"text-decoration-style"},{"name":"text-indent"},{"name":"text-justify"},{"name":"text-overflow"},{"name":"text-shadow"},{"name":"text-transform"},{"name":"text-underline-position"},{"name":"top"},{"name":"touch-action"},{"name":"transform"},{"name":"transform-origin"},{"name":"transform-style"},{"name":"translate"},{"name":"rotate"},{"name":"scale"},{"name":"transition-delay"},{"name":"transition-duration"},{"name":"transition-property"},{"name":"transition-timing-function"},{"name":"unicode-bidi"},{"name":"vector-effect"},{"name":"vertical-align"},{"name":"visibility"},{"name":"x"},{"name":"y"},{"name":"-webkit-appearance"},{"name":"-webkit-app-region"},{"name":"-webkit-background-clip"},{"name":"-webkit-background-composite"},{"name":"-webkit-background-origin"},{"name":"-webkit-border-horizontal-spacing"},{"name":"-webkit-border-image"},{"name":"-webkit-border-vertical-spacing"},{"name":"-webkit-box-align"},{"name":"-webkit-box-decoration-break"},{"name":"-webkit-box-direction"},{"name":"-webkit-box-flex"},{"name":"-webkit-box-flex-group"},{"name":"-webkit-box-lines"},{"name":"-webkit-box-ordinal-group"},{"name":"-webkit-box-orient"},{"name":"-webkit-box-pack"},{"name":"-webkit-box-reflect"},{"name":"-webkit-clip-path"},{"name":"-webkit-column-break-after"},{"name":"-webkit-column-break-before"},{"name":"-webkit-column-break-inside"},{"name":"-webkit-column-count"},{"name":"-webkit-column-gap"},{"name":"-webkit-column-rule-color"},{"name":"-webkit-column-rule-style"},{"name":"-webkit-column-rule-width"},{"name":"-webkit-column-span"},{"name":"-webkit-column-width"},{"name":"-webkit-filter"},{"name":"-webkit-highlight"},{"name":"-webkit-hyphenate-character"},{"name":"-webkit-line-break"},{"name":"-webkit-line-clamp"},{"name":"-webkit-margin-after-collapse"},{"name":"-webkit-margin-before-collapse"},{"name":"-webkit-margin-bottom-collapse"},{"name":"-webkit-margin-top-collapse"},{"name":"-webkit-mask-box-image-outset"},{"name":"-webkit-mask-box-image-repeat"},{"name":"-webkit-mask-box-image-slice"},{"name":"-webkit-mask-box-image-source"},{"name":"-webkit-mask-box-image-width"},{"name":"-webkit-mask-clip"},{"name":"-webkit-mask-composite"},{"name":"-webkit-mask-image"},{"name":"-webkit-mask-origin"},{"name":"-webkit-mask-position-x"},{"name":"-webkit-mask-position-y"},{"name":"-webkit-mask-repeat-x"},{"name":"-webkit-mask-repeat-y"},{"name":"-webkit-mask-size"},{"name":"-webkit-perspective-origin-x"},{"name":"-webkit-perspective-origin-y"},{"name":"-webkit-print-color-adjust"},{"name":"-webkit-rtl-ordering"},{"name":"-webkit-ruby-position"},{"name":"-webkit-tap-highlight-color"},{"name":"-webkit-text-combine"},{"name":"-webkit-text-emphasis-color"},{"name":"-webkit-text-emphasis-position"},{"name":"-webkit-text-emphasis-style"},{"name":"-webkit-text-fill-color"},{"name":"-webkit-text-security"},{"name":"-webkit-text-stroke-color"},{"name":"-webkit-text-stroke-width"},{"name":"-webkit-transform-origin-x"},{"name":"-webkit-transform-origin-y"},{"name":"-webkit-transform-origin-z"},{"name":"-webkit-user-drag"},{"name":"-webkit-user-modify"},{"name":"-webkit-user-select"},{"name":"white-space"},{"name":"widows"},{"name":"width"},{"name":"will-change"},{"name":"word-break"},{"name":"word-spacing"},{"name":"word-wrap"},{"name":"z-index"},{"name":"-webkit-border-end-color"},{"name":"-webkit-border-end-style"},{"name":"-webkit-border-end-width"},{"name":"-webkit-border-start-color"},{"name":"-webkit-border-start-style"},{"name":"-webkit-border-start-width"},{"name":"-webkit-border-before-color"},{"name":"-webkit-border-before-style"},{"name":"-webkit-border-before-width"},{"name":"-webkit-border-after-color"},{"name":"-webkit-border-after-style"},{"name":"-webkit-border-after-width"},{"name":"-webkit-margin-end"},{"name":"-webkit-margin-start"},{"name":"-webkit-margin-before"},{"name":"-webkit-margin-after"},{"name":"-webkit-padding-end"},{"name":"-webkit-padding-start"},{"name":"-webkit-padding-before"},{"name":"-webkit-padding-after"},{"name":"-webkit-logical-width"},{"name":"-webkit-logical-height"},{"name":"-webkit-min-logical-width"},{"name":"-webkit-min-logical-height"},{"name":"-webkit-max-logical-width"},{"name":"-webkit-max-logical-height"},{"name":"all"},{"name":"font-display"},{"name":"max-zoom"},{"name":"min-zoom"},{"name":"orientation"},{"name":"page"},{"name":"src"},{"name":"unicode-range"},{"name":"user-zoom"},{"name":"-webkit-font-size-delta"},{"name":"-webkit-text-decorations-in-effect"},{"longhands":["animation-name","animation-duration","animation-timing-function","animation-delay","animation-iteration-count","animation-direction","animation-fill-mode","animation-play-state"],"name":"animation"},{"longhands":["background-image","background-position-x","background-position-y","background-size","background-repeat-x","background-repeat-y","background-attachment","background-origin","background-clip","background-color"],"name":"background"},{"longhands":["background-position-x","background-position-y"],"name":"background-position"},{"longhands":["background-repeat-x","background-repeat-y"],"name":"background-repeat"},{"longhands":["border-top-color","border-top-style","border-top-width","border-right-color","border-right-style","border-right-width","border-bottom-color","border-bottom-style","border-bottom-width","border-left-color","border-left-style","border-left-width","border-image-source","border-image-slice","border-image-width","border-image-outset","border-image-repeat"],"name":"border"},{"longhands":["border-bottom-width","border-bottom-style","border-bottom-color"],"name":"border-bottom"},{"longhands":["border-top-color","border-right-color","border-bottom-color","border-left-color"],"name":"border-color"},{"longhands":["border-image-source","border-image-slice","border-image-width","border-image-outset","border-image-repeat"],"name":"border-image"},{"longhands":["border-left-width","border-left-style","border-left-color"],"name":"border-left"},{"longhands":["border-top-left-radius","border-top-right-radius","border-bottom-right-radius","border-bottom-left-radius"],"name":"border-radius"},{"longhands":["border-right-width","border-right-style","border-right-color"],"name":"border-right"},{"longhands":["-webkit-border-horizontal-spacing","-webkit-border-vertical-spacing"],"name":"border-spacing"},{"longhands":["border-top-style","border-right-style","border-bottom-style","border-left-style"],"name":"border-style"},{"longhands":["border-top-width","border-top-style","border-top-color"],"name":"border-top"},{"longhands":["border-top-width","border-right-width","border-bottom-width","border-left-width"],"name":"border-width"},{"longhands":["flex-grow","flex-shrink","flex-basis"],"name":"flex"},{"longhands":["flex-direction","flex-wrap"],"name":"flex-flow"},{"longhands":["font-style","font-variant","font-weight","font-stretch","font-size","line-height","font-family"],"name":"font"},{"longhands":["grid-template-columns","grid-template-rows","grid-template-areas","grid-auto-flow","grid-auto-columns","grid-auto-rows"],"name":"grid"},{"longhands":["grid-row-start","grid-column-start","grid-row-end","grid-column-end"],"name":"grid-area"},{"longhands":["grid-column-start","grid-column-end"],"name":"grid-column"},{"longhands":["grid-column-gap","grid-row-gap"],"name":"grid-gap"},{"longhands":["grid-row-start","grid-row-end"],"name":"grid-row"},{"longhands":["grid-template-columns","grid-template-rows","grid-template-areas"],"name":"grid-template"},{"longhands":["list-style-type","list-style-position","list-style-image"],"name":"list-style"},{"longhands":["margin-top","margin-right","margin-bottom","margin-left"],"name":"margin"},{"longhands":["marker-start","marker-mid","marker-end"],"name":"marker"},{"longhands":["motion-path","motion-offset","motion-rotation"],"name":"motion"},{"longhands":["outline-color","outline-style","outline-width"],"name":"outline"},{"longhands":["overflow-x","overflow-y"],"name":"overflow"},{"longhands":["padding-top","padding-right","padding-bottom","padding-left"],"name":"padding"},{"longhands":["transition-property","transition-duration","transition-timing-function","transition-delay"],"name":"transition"},{"longhands":["-webkit-border-after-width","-webkit-border-after-style","-webkit-border-after-color"],"name":"-webkit-border-after"},{"longhands":["-webkit-border-before-width","-webkit-border-before-style","-webkit-border-before-color"],"name":"-webkit-border-before"},{"longhands":["-webkit-border-end-width","-webkit-border-end-style","-webkit-border-end-color"],"name":"-webkit-border-end"},{"longhands":["-webkit-border-start-width","-webkit-border-start-style","-webkit-border-start-color"],"name":"-webkit-border-start"},{"longhands":["-webkit-column-rule-width","-webkit-column-rule-style","-webkit-column-rule-color"],"name":"-webkit-column-rule"},{"longhands":["-webkit-column-width","-webkit-column-count"],"name":"-webkit-columns"},{"longhands":["-webkit-margin-before-collapse","-webkit-margin-after-collapse"],"name":"-webkit-margin-collapse"},{"longhands":["-webkit-mask-image","-webkit-mask-position-x","-webkit-mask-position-y","-webkit-mask-size","-webkit-mask-repeat-x","-webkit-mask-repeat-y","-webkit-mask-origin","-webkit-mask-clip"],"name":"-webkit-mask"},{"longhands":["-webkit-mask-box-image-source","-webkit-mask-box-image-slice","-webkit-mask-box-image-width","-webkit-mask-box-image-outset","-webkit-mask-box-image-repeat"],"name":"-webkit-mask-box-image"},{"longhands":["-webkit-mask-position-x","-webkit-mask-position-y"],"name":"-webkit-mask-position"},{"longhands":["-webkit-mask-repeat-x","-webkit-mask-repeat-y"],"name":"-webkit-mask-repeat"},{"longhands":["-webkit-text-emphasis-style","-webkit-text-emphasis-color"],"name":"-webkit-text-emphasis"},{"longhands":["-webkit-text-stroke-width","-webkit-text-stroke-color"],"name":"-webkit-text-stroke"}]);;WebInspector.FileManager=function()
{this._savedURLsSetting=WebInspector.settings.createLocalSetting("savedURLs",{});this._saveCallbacks={};InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.SavedURL,this._savedURL,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.CanceledSaveURL,this._canceledSaveURL,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.AppendedToURL,this._appendedToURL,this);}
WebInspector.FileManager.EventTypes={SavedURL:"SavedURL",AppendedToURL:"AppendedToURL"}
WebInspector.FileManager.prototype={save:function(url,content,forceSaveAs,callback)
{var savedURLs=this._savedURLsSetting.get();delete savedURLs[url];this._savedURLsSetting.set(savedURLs);this._saveCallbacks[url]=callback||null;InspectorFrontendHost.save(url,content,forceSaveAs);},_savedURL:function(event)
{var url=(event.data);var savedURLs=this._savedURLsSetting.get();savedURLs[url]=true;this._savedURLsSetting.set(savedURLs);this.dispatchEventToListeners(WebInspector.FileManager.EventTypes.SavedURL,url);this._invokeSaveCallback(url,true);},_invokeSaveCallback:function(url,accepted)
{var callback=this._saveCallbacks[url];delete this._saveCallbacks[url];if(callback)
callback(accepted);},_canceledSaveURL:function(event)
{var url=(event.data);this._invokeSaveCallback(url,false);},isURLSaved:function(url)
{var savedURLs=this._savedURLsSetting.get();return savedURLs[url];},append:function(url,content)
{InspectorFrontendHost.append(url,content);},close:function(url)
{},_appendedToURL:function(event)
{var url=(event.data);this.dispatchEventToListeners(WebInspector.FileManager.EventTypes.AppendedToURL,url);},__proto__:WebInspector.Object.prototype}
WebInspector.fileManager=null;;WebInspector.FileSystemMapping=function()
{WebInspector.Object.call(this);this._fileSystemMappingSetting=WebInspector.settings.createLocalSetting("fileSystemMapping",{});this._fileSystemMappings={};this._loadFromSettings();}
WebInspector.FileSystemMapping.Events={FileMappingAdded:"FileMappingAdded",FileMappingRemoved:"FileMappingRemoved"}
WebInspector.FileSystemMapping.prototype={_loadFromSettings:function()
{var savedMapping=this._fileSystemMappingSetting.get();this._fileSystemMappings={};for(var fileSystemPath in savedMapping){var savedFileSystemMappings=savedMapping[fileSystemPath];fileSystemPath=WebInspector.IsolatedFileSystemManager.normalizePath(fileSystemPath);this._fileSystemMappings[fileSystemPath]=[];var fileSystemMappings=this._fileSystemMappings[fileSystemPath];for(var i=0;i<savedFileSystemMappings.length;++i){var savedEntry=savedFileSystemMappings[i];var entry=new WebInspector.FileSystemMapping.Entry(fileSystemPath,savedEntry.urlPrefix,savedEntry.pathPrefix,true);fileSystemMappings.push(entry);}}
this._rebuildIndexes();},_saveToSettings:function()
{var setting={};for(var fileSystemPath in this._fileSystemMappings){setting[fileSystemPath]=[];var entries=this._fileSystemMappings[fileSystemPath];for(var entry of entries){if(entry.configurable)
setting[fileSystemPath].push(entry);}}
this._fileSystemMappingSetting.set(setting);},_rebuildIndexes:function()
{this._mappingForURLPrefix={};this._urlPrefixes=[];for(var fileSystemPath in this._fileSystemMappings){var fileSystemMapping=this._fileSystemMappings[fileSystemPath];for(var i=0;i<fileSystemMapping.length;++i){var entry=fileSystemMapping[i];if(this._mappingForURLPrefix[entry.urlPrefix]&&!entry.configurable)
continue;this._mappingForURLPrefix[entry.urlPrefix]=entry;if(this._urlPrefixes.indexOf(entry.urlPrefix)===-1)
this._urlPrefixes.push(entry.urlPrefix);}}
this._urlPrefixes.sort();},addFileSystem:function(fileSystemPath)
{if(this._fileSystemMappings[fileSystemPath])
return;this._fileSystemMappings[fileSystemPath]=[];this._saveToSettings();},removeFileSystem:function(fileSystemPath)
{if(!this._fileSystemMappings[fileSystemPath])
return;delete this._fileSystemMappings[fileSystemPath];this._rebuildIndexes();this._saveToSettings();},addFileMapping:function(fileSystemPath,urlPrefix,pathPrefix)
{if(!urlPrefix.endsWith("/"))
urlPrefix+="/";if(!pathPrefix.endsWith("/"))
pathPrefix+="/";if(!pathPrefix.startsWith("/"))
pathPrefix="/"+pathPrefix;this._innerAddFileMapping(fileSystemPath,urlPrefix,pathPrefix,true);this._saveToSettings();},addNonConfigurableFileMapping:function(fileSystemPath,urlPrefix,pathPrefix)
{this._innerAddFileMapping(fileSystemPath,urlPrefix,pathPrefix,false);},_innerAddFileMapping:function(fileSystemPath,urlPrefix,pathPrefix,configurable)
{var entry=new WebInspector.FileSystemMapping.Entry(fileSystemPath,urlPrefix,pathPrefix,configurable);this._fileSystemMappings[fileSystemPath].push(entry);this._rebuildIndexes();this.dispatchEventToListeners(WebInspector.FileSystemMapping.Events.FileMappingAdded,entry);},removeFileMapping:function(fileSystemPath,urlPrefix,pathPrefix)
{var entry=this._configurableMappingEntryForPathPrefix(fileSystemPath,pathPrefix);if(!entry)
return;this._fileSystemMappings[fileSystemPath].remove(entry);this._rebuildIndexes();this._saveToSettings();this.dispatchEventToListeners(WebInspector.FileSystemMapping.Events.FileMappingRemoved,entry);},_mappingEntryForURL:function(url)
{for(var i=this._urlPrefixes.length-1;i>=0;--i){var urlPrefix=this._urlPrefixes[i];if(url.startsWith(urlPrefix))
return this._mappingForURLPrefix[urlPrefix];}
return null;},_mappingEntryForPath:function(fileSystemPath,filePath)
{var entries=this._fileSystemMappings[fileSystemPath];if(!entries)
return null;var entry=null;for(var i=0;i<entries.length;++i){var pathPrefix=entries[i].pathPrefix;if(entry&&entry.configurable&&!entries[i].configurable)
continue;if(entry&&entry.pathPrefix.length>pathPrefix.length)
continue;if(filePath.startsWith(pathPrefix))
entry=entries[i];}
return entry;},_configurableMappingEntryForPathPrefix:function(fileSystemPath,pathPrefix)
{var entries=this._fileSystemMappings[fileSystemPath];for(var i=0;i<entries.length;++i){if(entries[i].configurable&&pathPrefix===entries[i].pathPrefix)
return entries[i];}
return null;},mappingEntries:function(fileSystemPath)
{return this._fileSystemMappings[fileSystemPath].slice();},hasMappingForNetworkURL:function(url)
{return!!this._mappingEntryForURL(url);},fileForURL:function(url)
{var entry=this._mappingEntryForURL(url);if(!entry)
return null;var file={};file.fileSystemPath=entry.fileSystemPath;file.fileURL=entry.fileSystemPath+entry.pathPrefix+url.substr(entry.urlPrefix.length);return file;},networkURLForFileSystemURL:function(fileSystemPath,filePath)
{var relativePath=filePath.substring(fileSystemPath.length);var entry=this._mappingEntryForPath(fileSystemPath,relativePath);if(!entry)
return"";return entry.urlPrefix+relativePath.substring(entry.pathPrefix.length);},removeMappingForURL:function(url)
{var entry=this._mappingEntryForURL(url);if(!entry||!entry.configurable)
return;this._fileSystemMappings[entry.fileSystemPath].remove(entry);this._saveToSettings();},addMappingForResource:function(url,fileSystemPath,filePath)
{var commonPathSuffixLength=0;for(var i=0;i<filePath.length;++i){var filePathCharacter=filePath[filePath.length-1-i];var urlCharacter=url[url.length-1-i];if(filePathCharacter!==urlCharacter)
break;if(filePathCharacter==="/")
commonPathSuffixLength=i;}
var pathPrefix=filePath.substring(fileSystemPath.length,filePath.length-commonPathSuffixLength);var urlPrefix=url.substr(0,url.length-commonPathSuffixLength);this.addFileMapping(fileSystemPath,urlPrefix,pathPrefix);},resetForTesting:function()
{this._fileSystemMappings={};},__proto__:WebInspector.Object.prototype}
WebInspector.FileSystemMapping.Entry=function(fileSystemPath,urlPrefix,pathPrefix,configurable)
{this.fileSystemPath=fileSystemPath;this.urlPrefix=urlPrefix;this.pathPrefix=pathPrefix;this.configurable=configurable;}
WebInspector.fileSystemMapping;;WebInspector.IsolatedFileSystem=function(manager,path,embedderPath,domFileSystem)
{this._manager=manager;this._path=path;this._embedderPath=embedderPath;this._domFileSystem=domFileSystem;this._excludedFoldersSetting=WebInspector.settings.createLocalSetting("workspaceExcludedFolders",{});this._excludedFolders=new Set(this._excludedFoldersSetting.get()[path]||[]);this._nonConfigurableExcludedFolders=new Set();}
WebInspector.IsolatedFileSystem.ImageExtensions=new Set(["jpeg","jpg","svg","gif","webp","png","ico","tiff","tif","bmp"]);WebInspector.IsolatedFileSystem.create=function(manager,path,embedderPath,name,rootURL)
{return new Promise(promiseBody);function promiseBody(resolve,reject)
{var domFileSystem=InspectorFrontendHost.isolatedFileSystem(name,rootURL);if(!domFileSystem){resolve(null);return;}
var fileSystem=new WebInspector.IsolatedFileSystem(manager,path,embedderPath,domFileSystem);fileSystem.requestFileContent(".devtools",onConfigAvailable);function onConfigAvailable(projectText)
{if(projectText){try{var projectObject=JSON.parse(projectText);fileSystem._initializeProject(typeof projectObject==="object"?(projectObject):null);}catch(e){WebInspector.console.error("Invalid project file: "+projectText);}}
resolve(fileSystem);}}}
WebInspector.IsolatedFileSystem.errorMessage=function(error)
{return WebInspector.UIString("File system error: %s",error.message);}
WebInspector.IsolatedFileSystem.prototype={path:function()
{return this._path;},embedderPath:function()
{return this._embedderPath;},_initializeProject:function(projectObject)
{this._projectObject=projectObject;var projectExcludes=this.projectProperty("excludes");if(Array.isArray(projectExcludes)){for(var folder of(projectExcludes)){if(typeof folder==="string")
this._nonConfigurableExcludedFolders.add(folder);}}},projectProperty:function(key)
{return this._projectObject?this._projectObject[key]:null;},requestFilesRecursive:function(path,fileCallback,finishedCallback)
{var pendingRequests=1;this._requestEntries(path,innerCallback.bind(this));function innerCallback(entries)
{for(var i=0;i<entries.length;++i){var entry=entries[i];if(!entry.isDirectory){if(this._isFileExcluded(entry.fullPath))
continue;fileCallback(entry.fullPath.substr(1));}else{if(this._isFileExcluded(entry.fullPath+"/"))
continue;++pendingRequests;this._requestEntries(entry.fullPath,innerCallback.bind(this));}}
if(finishedCallback&&(--pendingRequests===0))
finishedCallback();}},createFile:function(path,name,callback)
{var newFileIndex=1;if(!name)
name="NewFile";var nameCandidate;this._domFileSystem.root.getDirectory(path,null,dirEntryLoaded.bind(this),errorHandler.bind(this));function dirEntryLoaded(dirEntry)
{var nameCandidate=name;if(newFileIndex>1)
nameCandidate+=newFileIndex;++newFileIndex;dirEntry.getFile(nameCandidate,{create:true,exclusive:true},fileCreated,fileCreationError.bind(this));function fileCreated(entry)
{callback(entry.fullPath.substr(1));}
function fileCreationError(error)
{if(error.code===FileError.INVALID_MODIFICATION_ERR){dirEntryLoaded.call(this,dirEntry);return;}
var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when testing if file exists '"+(this._path+"/"+path+"/"+nameCandidate)+"'");callback(null);}}
function errorHandler(error)
{var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);var filePath=this._path+"/"+path;if(nameCandidate)
filePath+="/"+nameCandidate;console.error(errorMessage+" when getting content for file '"+(filePath)+"'");callback(null);}},deleteFile:function(path)
{this._domFileSystem.root.getFile(path,null,fileEntryLoaded.bind(this),errorHandler.bind(this));function fileEntryLoaded(fileEntry)
{fileEntry.remove(fileEntryRemoved,errorHandler.bind(this));}
function fileEntryRemoved()
{}
function errorHandler(error)
{var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when deleting file '"+(this._path+"/"+path)+"'");}},requestFileContent:function(path,callback)
{this._domFileSystem.root.getFile(path,null,fileEntryLoaded.bind(this),errorHandler.bind(this));function fileEntryLoaded(entry)
{entry.file(fileLoaded,errorHandler.bind(this));}
function fileLoaded(file)
{var reader=new FileReader();reader.onloadend=readerLoadEnd;if(WebInspector.IsolatedFileSystem.ImageExtensions.has(WebInspector.TextUtils.extension(path)))
reader.readAsDataURL(file);else
reader.readAsText(file);}
function readerLoadEnd()
{var string=null;try{string=(this.result);}catch(e){console.error("Can't read file: "+path+": "+e);}
callback(string);}
function errorHandler(error)
{if(error.code===FileError.NOT_FOUND_ERR){callback(null);return;}
var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when getting content for file '"+(this._path+"/"+path)+"'");callback(null);}},setFileContent:function(path,content,callback)
{WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.FileSavedInWorkspace);this._domFileSystem.root.getFile(path,{create:true},fileEntryLoaded.bind(this),errorHandler.bind(this));function fileEntryLoaded(entry)
{entry.createWriter(fileWriterCreated.bind(this),errorHandler.bind(this));}
function fileWriterCreated(fileWriter)
{fileWriter.onerror=errorHandler.bind(this);fileWriter.onwriteend=fileWritten;var blob=new Blob([content],{type:"text/plain"});fileWriter.write(blob);function fileWritten()
{fileWriter.onwriteend=callback;fileWriter.truncate(blob.size);}}
function errorHandler(error)
{var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when setting content for file '"+(this._path+"/"+path)+"'");callback();}},renameFile:function(path,newName,callback)
{newName=newName?newName.trim():newName;if(!newName||newName.indexOf("/")!==-1){callback(false);return;}
var fileEntry;var dirEntry;this._domFileSystem.root.getFile(path,null,fileEntryLoaded.bind(this),errorHandler.bind(this));function fileEntryLoaded(entry)
{if(entry.name===newName){callback(false);return;}
fileEntry=entry;fileEntry.getParent(dirEntryLoaded.bind(this),errorHandler.bind(this));}
function dirEntryLoaded(entry)
{dirEntry=entry;dirEntry.getFile(newName,null,newFileEntryLoaded,newFileEntryLoadErrorHandler.bind(this));}
function newFileEntryLoaded(entry)
{callback(false);}
function newFileEntryLoadErrorHandler(error)
{if(error.code!==FileError.NOT_FOUND_ERR){callback(false);return;}
fileEntry.moveTo(dirEntry,newName,fileRenamed,errorHandler.bind(this));}
function fileRenamed(entry)
{callback(true,entry.name);}
function errorHandler(error)
{var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when renaming file '"+(this._path+"/"+path)+"' to '"+newName+"'");callback(false);}},_readDirectory:function(dirEntry,callback)
{var dirReader=dirEntry.createReader();var entries=[];function innerCallback(results)
{if(!results.length){callback(entries.sort());}else{entries=entries.concat(toArray(results));dirReader.readEntries(innerCallback,errorHandler);}}
function toArray(list)
{return Array.prototype.slice.call(list||[],0);}
dirReader.readEntries(innerCallback,errorHandler);function errorHandler(error)
{var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when reading directory '"+dirEntry.fullPath+"'");callback([]);}},_requestEntries:function(path,callback)
{this._domFileSystem.root.getDirectory(path,null,innerCallback.bind(this),errorHandler);function innerCallback(dirEntry)
{this._readDirectory(dirEntry,callback);}
function errorHandler(error)
{var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when requesting entry '"+path+"'");callback([]);}},_saveExcludedFolders:function()
{var settingValue=this._excludedFoldersSetting.get();settingValue[this._path]=Array.from(this._excludedFolders.values());this._excludedFoldersSetting.set(settingValue);},addExcludedFolder:function(path)
{this._excludedFolders.add(path);this._saveExcludedFolders();this._manager.dispatchEventToListeners(WebInspector.IsolatedFileSystemManager.Events.ExcludedFolderAdded,path);},removeExcludedFolder:function(path)
{this._excludedFolders.delete(path);this._saveExcludedFolders();this._manager.dispatchEventToListeners(WebInspector.IsolatedFileSystemManager.Events.ExcludedFolderRemoved,path);},fileSystemRemoved:function()
{var settingValue=this._excludedFoldersSetting.get();delete settingValue[this._path];this._excludedFoldersSetting.set(settingValue);},_isFileExcluded:function(folderPath)
{if(this._nonConfigurableExcludedFolders.has(folderPath)||this._excludedFolders.has(folderPath))
return true;var regex=this._manager.workspaceFolderExcludePatternSetting().asRegExp();return!!(regex&&regex.test(folderPath));},excludedFolders:function()
{return this._excludedFolders;},nonConfigurableExcludedFolders:function()
{return this._nonConfigurableExcludedFolders;},searchInPath:function(query,progress,callback)
{var requestId=this._manager.registerCallback(innerCallback);InspectorFrontendHost.searchInPath(requestId,this._embedderPath,query);function innerCallback(files)
{files=files.map(embedderPath=>WebInspector.IsolatedFileSystemManager.normalizePath(embedderPath));progress.worked(1);callback(files);}},indexContent:function(progress)
{progress.setTotalWork(1);var requestId=this._manager.registerProgress(progress);InspectorFrontendHost.indexPath(requestId,this._embedderPath);}};WebInspector.IsolatedFileSystemManager=function()
{this._fileSystems={};this._callbacks={};this._progresses={};InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.FileSystemsLoaded,this._onFileSystemsLoaded,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.FileSystemRemoved,this._onFileSystemRemoved,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.FileSystemAdded,this._onFileSystemAdded,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.FileSystemFilesChanged,this._onFileSystemFilesChanged,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.IndexingTotalWorkCalculated,this._onIndexingTotalWorkCalculated,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.IndexingWorked,this._onIndexingWorked,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.IndexingDone,this._onIndexingDone,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.SearchCompleted,this._onSearchCompleted,this);this._initExcludePatterSetting();}
WebInspector.IsolatedFileSystemManager.FileSystem;WebInspector.IsolatedFileSystemManager.Events={FileSystemAdded:"FileSystemAdded",FileSystemRemoved:"FileSystemRemoved",FileSystemsLoaded:"FileSystemsLoaded",FileSystemFilesChanged:"FileSystemFilesChanged",ExcludedFolderAdded:"ExcludedFolderAdded",ExcludedFolderRemoved:"ExcludedFolderRemoved"}
WebInspector.IsolatedFileSystemManager._lastRequestId=0;WebInspector.IsolatedFileSystemManager.normalizePath=function(fileSystemPath)
{fileSystemPath=fileSystemPath.replace(/\\/g,"/");if(!fileSystemPath.startsWith("file://")){if(fileSystemPath.startsWith("/"))
fileSystemPath="file://"+fileSystemPath;else
fileSystemPath="file:///"+fileSystemPath;}
return fileSystemPath;}
WebInspector.IsolatedFileSystemManager.prototype={initialize:function(callback)
{this._initializeCallback=callback;InspectorFrontendHost.requestFileSystems();},addFileSystem:function()
{InspectorFrontendHost.addFileSystem("");},removeFileSystem:function(fileSystem)
{InspectorFrontendHost.removeFileSystem(fileSystem.embedderPath());},_onFileSystemsLoaded:function(event)
{var fileSystems=(event.data);var promises=[];for(var i=0;i<fileSystems.length;++i)
promises.push(this._innerAddFileSystem(fileSystems[i]));Promise.all(promises).then(fireFileSystemsLoaded.bind(this));function fireFileSystemsLoaded()
{this._initializeCallback();delete this._initializeCallback;this.dispatchEventToListeners(WebInspector.IsolatedFileSystemManager.Events.FileSystemsLoaded);}},fileSystemsLoaded:function()
{return!this._initializeCallback;},_innerAddFileSystem:function(fileSystem)
{var embedderPath=fileSystem.fileSystemPath;var fileSystemPath=WebInspector.IsolatedFileSystemManager.normalizePath(fileSystem.fileSystemPath);var promise=WebInspector.IsolatedFileSystem.create(this,fileSystemPath,embedderPath,fileSystem.fileSystemName,fileSystem.rootURL);return promise.then(storeFileSystem.bind(this));function storeFileSystem(fileSystem)
{if(!fileSystem)
return;this._fileSystems[fileSystemPath]=fileSystem;this.dispatchEventToListeners(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded,fileSystem);}},_onFileSystemAdded:function(event)
{var errorMessage=(event.data["errorMessage"]);var fileSystem=(event.data["fileSystem"]);if(errorMessage)
WebInspector.console.error(errorMessage);else if(fileSystem)
this._innerAddFileSystem(fileSystem);},_onFileSystemRemoved:function(event)
{this._fileSystemRemoved((event.data));},_onFileSystemFilesChanged:function(event)
{var embedderPaths=(event.data);var paths=embedderPaths.map(embedderPath=>WebInspector.IsolatedFileSystemManager.normalizePath(embedderPath));this.dispatchEventToListeners(WebInspector.IsolatedFileSystemManager.Events.FileSystemFilesChanged,paths);},_fileSystemRemoved:function(embedderPath)
{var fileSystemPath=WebInspector.IsolatedFileSystemManager.normalizePath(embedderPath);var isolatedFileSystem=this._fileSystems[fileSystemPath];delete this._fileSystems[fileSystemPath];if(isolatedFileSystem){isolatedFileSystem.fileSystemRemoved();this.dispatchEventToListeners(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved,isolatedFileSystem);}},fileSystemPaths:function()
{return Object.keys(this._fileSystems);},fileSystem:function(fileSystemPath)
{return this._fileSystems[fileSystemPath];},_initExcludePatterSetting:function()
{var defaultCommonExcludedFolders=["/\\.devtools","/\\.git/","/\\.sass-cache/","/\\.hg/","/\\.idea/","/\\.svn/","/\\.cache/","/\\.project/"];var defaultWinExcludedFolders=["/Thumbs.db$","/ehthumbs.db$","/Desktop.ini$","/\\$RECYCLE.BIN/"];var defaultMacExcludedFolders=["/\\.DS_Store$","/\\.Trashes$","/\\.Spotlight-V100$","/\\.AppleDouble$","/\\.LSOverride$","/Icon$","/\\._.*$"];var defaultLinuxExcludedFolders=["/.*~$"];var defaultExcludedFolders=defaultCommonExcludedFolders;if(WebInspector.isWin())
defaultExcludedFolders=defaultExcludedFolders.concat(defaultWinExcludedFolders);else if(WebInspector.isMac())
defaultExcludedFolders=defaultExcludedFolders.concat(defaultMacExcludedFolders);else
defaultExcludedFolders=defaultExcludedFolders.concat(defaultLinuxExcludedFolders);var defaultExcludedFoldersPattern=defaultExcludedFolders.join("|");this._workspaceFolderExcludePatternSetting=WebInspector.settings.createRegExpSetting("workspaceFolderExcludePattern",defaultExcludedFoldersPattern,WebInspector.isWin()?"i":"");},workspaceFolderExcludePatternSetting:function()
{return this._workspaceFolderExcludePatternSetting;},registerCallback:function(callback)
{var requestId=++WebInspector.IsolatedFileSystemManager._lastRequestId;this._callbacks[requestId]=callback;return requestId;},registerProgress:function(progress)
{var requestId=++WebInspector.IsolatedFileSystemManager._lastRequestId;this._progresses[requestId]=progress;return requestId;},_onIndexingTotalWorkCalculated:function(event)
{var requestId=(event.data["requestId"]);var totalWork=(event.data["totalWork"]);var progress=this._progresses[requestId];if(!progress)
return;progress.setTotalWork(totalWork);},_onIndexingWorked:function(event)
{var requestId=(event.data["requestId"]);var worked=(event.data["worked"]);var progress=this._progresses[requestId];if(!progress)
return;progress.worked(worked);if(progress.isCanceled()){InspectorFrontendHost.stopIndexing(requestId);this._onIndexingDone(event);}},_onIndexingDone:function(event)
{var requestId=(event.data["requestId"]);var progress=this._progresses[requestId];if(!progress)
return;progress.done();delete this._progresses[requestId];},_onSearchCompleted:function(event)
{var requestId=(event.data["requestId"]);var files=(event.data["files"]);var callback=this._callbacks[requestId];if(!callback)
return;callback.call(null,files);delete this._callbacks[requestId];},dispose:function()
{InspectorFrontendHost.events.removeEventListener(InspectorFrontendHostAPI.Events.IndexingTotalWorkCalculated,this._onIndexingTotalWorkCalculated,this);InspectorFrontendHost.events.removeEventListener(InspectorFrontendHostAPI.Events.IndexingWorked,this._onIndexingWorked,this);InspectorFrontendHost.events.removeEventListener(InspectorFrontendHostAPI.Events.IndexingDone,this._onIndexingDone,this);InspectorFrontendHost.events.removeEventListener(InspectorFrontendHostAPI.Events.SearchCompleted,this._onSearchCompleted,this);},__proto__:WebInspector.Object.prototype}
WebInspector.isolatedFileSystemManager;;WebInspector.SearchConfig=function(query,ignoreCase,isRegex)
{this._query=query;this._ignoreCase=ignoreCase;this._isRegex=isRegex;this._parse();}
WebInspector.SearchConfig.RegexQuery;WebInspector.SearchConfig.fromPlainObject=function(object)
{return new WebInspector.SearchConfig(object.query,object.ignoreCase,object.isRegex);}
WebInspector.SearchConfig.prototype={query:function()
{return this._query;},ignoreCase:function()
{return this._ignoreCase;},isRegex:function()
{return this._isRegex;},toPlainObject:function()
{return{query:this.query(),ignoreCase:this.ignoreCase(),isRegex:this.isRegex()};},_parse:function()
{var filePattern="-?f(ile)?:(([^\\\\ ]|\\\\.)+)";var quotedPattern="\"(([^\\\\\"]|\\\\.)+)\"";var unquotedWordPattern="(\\s*(?!-?f(ile)?:)[^\\\\ ]|\\\\.)+";var unquotedPattern=unquotedWordPattern+"( +"+unquotedWordPattern+")*";var pattern="("+filePattern+")|("+quotedPattern+")|("+unquotedPattern+")";var regexp=new RegExp(pattern,"g");var queryParts=this._query.match(regexp)||[];this._fileQueries=[];this._queries=[];for(var i=0;i<queryParts.length;++i){var queryPart=queryParts[i];if(!queryPart)
continue;var fileQuery=this._parseFileQuery(queryPart);if(fileQuery){this._fileQueries.push(fileQuery);this._fileRegexQueries=this._fileRegexQueries||[];this._fileRegexQueries.push({regex:new RegExp(fileQuery.text,this.ignoreCase?"i":""),isNegative:fileQuery.isNegative});continue;}
if(this._isRegex){this._queries.push(queryPart);continue;}
if(queryPart.startsWith("\"")){if(!queryPart.endsWith("\""))
continue;this._queries.push(this._parseQuotedQuery(queryPart));continue;}
this._queries.push(this._parseUnquotedQuery(queryPart));}},filePathMatchesFileQuery:function(filePath)
{if(!this._fileRegexQueries)
return true;for(var i=0;i<this._fileRegexQueries.length;++i){if(!!filePath.match(this._fileRegexQueries[i].regex)===this._fileRegexQueries[i].isNegative)
return false;}
return true;},queries:function()
{return this._queries;},_parseUnquotedQuery:function(query)
{return query.replace(/\\(.)/g,"$1");},_parseQuotedQuery:function(query)
{return query.substring(1,query.length-1).replace(/\\(.)/g,"$1");},_parseFileQuery:function(query)
{var match=query.match(/^(-)?f(ile)?:/);if(!match)
return null;var isNegative=!!match[1];query=query.substr(match[0].length);var result="";for(var i=0;i<query.length;++i){var char=query[i];if(char==="*"){result+=".*";}else if(char==="\\"){++i;var nextChar=query[i];if(nextChar===" ")
result+=" ";}else{if(String.regexSpecialCharacters().indexOf(query.charAt(i))!==-1)
result+="\\";result+=query.charAt(i);}}
return new WebInspector.SearchConfig.QueryTerm(result,isNegative);}}
WebInspector.SearchConfig.QueryTerm=function(text,isNegative)
{this.text=text;this.isNegative=isNegative;};WebInspector.UISourceCode=function(project,url,contentType)
{this._project=project;this._url=url;var pathComponents=WebInspector.ParsedURL.splitURLIntoPathComponents(url);this._origin=pathComponents[0];this._parentURL=pathComponents.slice(0,-1).join("/");this._name=pathComponents[pathComponents.length-1];this._contentType=contentType;this._requestContentCallbacks=[];this.history=[];this._hasUnsavedCommittedChanges=false;this._messages=[];}
WebInspector.UISourceCode.Events={WorkingCopyChanged:"WorkingCopyChanged",WorkingCopyCommitted:"WorkingCopyCommitted",TitleChanged:"TitleChanged",SourceMappingChanged:"SourceMappingChanged",MessageAdded:"MessageAdded",MessageRemoved:"MessageRemoved",}
WebInspector.UISourceCode.prototype={name:function()
{return this._name;},url:function()
{return this._url;},parentURL:function()
{return this._parentURL;},origin:function()
{return this._origin;},fullDisplayName:function()
{var parentPath=this._parentURL.replace(/^(?:https?|file)\:\/\//,"");try{parentPath=decodeURI(parentPath);}catch(e){}
return parentPath+"/"+this.displayName(true);},displayName:function(skipTrim)
{if(!this._name)
return WebInspector.UIString("(index)");var name=this._name;try{name=decodeURI(name);}catch(e){}
return skipTrim?name:name.trimEnd(100);},isFromServiceProject:function()
{return WebInspector.Project.isServiceProject(this._project);},canRename:function()
{return this._project.canRename();},rename:function(newName,callback)
{this._project.rename(this,newName,innerCallback.bind(this));function innerCallback(success,newName,newURL,newContentType)
{if(success)
this._updateName((newName),(newURL),(newContentType));callback(success);}},remove:function()
{this._project.deleteFile(this.url());},_updateName:function(name,url,contentType)
{var oldURД=this.url();this._url=this._url.substring(0,this._url.length-this._name.length)+name;this._name=name;if(url)
this._url=url;if(contentType)
this._contentType=contentType;this.dispatchEventToListeners(WebInspector.UISourceCode.Events.TitleChanged,oldURД);},contentURL:function()
{return this.url();},contentType:function()
{return this._contentType;},project:function()
{return this._project;},requestContent:function(callback)
{if(this._content||this._contentLoaded){callback(this._content);return;}
this._requestContentCallbacks.push(callback);if(this._requestContentCallbacks.length===1)
this._project.requestFileContent(this,this._fireContentAvailable.bind(this));},requestContentPromise:function()
{return new Promise(succ=>this.requestContent(succ));},_pushCheckContentUpdatedCallback:function(callback)
{if(!this._checkContentUpdatedCallbacks)
this._checkContentUpdatedCallbacks=[];this._checkContentUpdatedCallbacks.push(callback);},_terminateContentCheck:function()
{delete this._checkingContent;if(this._checkContentUpdatedCallbacks){this._checkContentUpdatedCallbacks.forEach(function(callback){callback();});delete this._checkContentUpdatedCallbacks;}},checkContentUpdated:function(forceLoad,callback)
{callback=callback||function(){};forceLoad=forceLoad||this._forceLoadOnCheckContent;if(!this.contentLoaded()&&!forceLoad){callback();return;}
if(!this._project.canSetFileContent()){callback();return;}
this._pushCheckContentUpdatedCallback(callback);if(this._checkingContent)
return;this._checkingContent=true;this._project.requestFileContent(this,contentLoaded.bind(this));function contentLoaded(updatedContent)
{if(updatedContent===null){var workingCopy=this.workingCopy();this._contentCommitted("",true,false);this.setWorkingCopy(workingCopy);this._terminateContentCheck();return;}
if(typeof this._lastAcceptedContent==="string"&&this._lastAcceptedContent===updatedContent){this._terminateContentCheck();return;}
if(this._content===updatedContent){delete this._lastAcceptedContent;this._terminateContentCheck();return;}
if(!this.isDirty()||this._workingCopy===updatedContent){this._contentCommitted(updatedContent,true,false);this._terminateContentCheck();return;}
var shouldUpdate=window.confirm(WebInspector.UIString("This file was changed externally. Would you like to reload it?"));if(shouldUpdate)
this._contentCommitted(updatedContent,true,false);else
this._lastAcceptedContent=updatedContent;this._terminateContentCheck();}},forceLoadOnCheckContent:function()
{this._forceLoadOnCheckContent=true;},requestOriginalContent:function(callback)
{this._project.requestFileContent(this,callback);},_commitContent:function(content)
{var wasPersisted=false;if(this._project.canSetFileContent()){this._project.setFileContent(this,content,function(){});wasPersisted=true;}else if(this._project.workspace().hasResourceContentTrackingExtensions()){wasPersisted=true;}else if(this._url&&WebInspector.fileManager.isURLSaved(this._url)){WebInspector.fileManager.save(this._url,content,false,function(){});WebInspector.fileManager.close(this._url);wasPersisted=true;}
this._contentCommitted(content,wasPersisted,true);},_contentCommitted:function(content,wasPersisted,committedByUser)
{delete this._lastAcceptedContent;this._content=content;this._contentLoaded=true;var lastRevision=this.history.length?this.history[this.history.length-1]:null;if(!lastRevision||lastRevision._content!==this._content){var revision=new WebInspector.Revision(this,this._content,new Date());this.history.push(revision);}
this._innerResetWorkingCopy();this._hasUnsavedCommittedChanges=!wasPersisted;this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyCommitted);this._project.workspace().dispatchEventToListeners(WebInspector.Workspace.Events.WorkingCopyCommitted,{uiSourceCode:this,content:content});if(committedByUser)
this._project.workspace().dispatchEventToListeners(WebInspector.Workspace.Events.WorkingCopyCommittedByUser,{uiSourceCode:this,content:content});},saveAs:function()
{WebInspector.fileManager.save(this._url,this.workingCopy(),true,callback.bind(this));WebInspector.fileManager.close(this._url);function callback(accepted)
{if(accepted)
this._contentCommitted(this.workingCopy(),true,true);}},hasUnsavedCommittedChanges:function()
{return this._hasUnsavedCommittedChanges;},addRevision:function(content)
{this._commitContent(content);},revertToOriginal:function()
{function callback(content)
{if(typeof content!=="string")
return;this.addRevision(content);}
WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.RevisionApplied);this.requestOriginalContent(callback.bind(this));},revertAndClearHistory:function(callback)
{function revert(content)
{if(typeof content!=="string")
return;this.addRevision(content);this.history=[];callback(this);}
WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.RevisionApplied);this.requestOriginalContent(revert.bind(this));},workingCopy:function()
{if(this._workingCopyGetter){this._workingCopy=this._workingCopyGetter();delete this._workingCopyGetter;}
if(this.isDirty())
return this._workingCopy;return this._content;},resetWorkingCopy:function()
{this._innerResetWorkingCopy();this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);},_innerResetWorkingCopy:function()
{delete this._workingCopy;delete this._workingCopyGetter;},setWorkingCopy:function(newWorkingCopy)
{this._workingCopy=newWorkingCopy;delete this._workingCopyGetter;this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);this._project.workspace().dispatchEventToListeners(WebInspector.Workspace.Events.WorkingCopyChanged,{uiSourceCode:this});},setWorkingCopyGetter:function(workingCopyGetter)
{this._workingCopyGetter=workingCopyGetter;this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);this._project.workspace().dispatchEventToListeners(WebInspector.Workspace.Events.WorkingCopyChanged,{uiSourceCode:this});},removeWorkingCopyGetter:function()
{if(!this._workingCopyGetter)
return;this._workingCopy=this._workingCopyGetter();delete this._workingCopyGetter;},commitWorkingCopy:function()
{if(this.isDirty())
this._commitContent(this.workingCopy());},isDirty:function()
{return typeof this._workingCopy!=="undefined"||typeof this._workingCopyGetter!=="undefined";},extension:function()
{return WebInspector.TextUtils.extension(this._name);},content:function()
{return this._content;},searchInContent:function(query,caseSensitive,isRegex,callback)
{var content=this.content();if(content){WebInspector.StaticContentProvider.searchInContent(content,query,caseSensitive,isRegex,callback);return;}
this._project.searchInFileContent(this,query,caseSensitive,isRegex,callback);},_fireContentAvailable:function(content)
{this._contentLoaded=true;this._content=content;var callbacks=this._requestContentCallbacks.slice();this._requestContentCallbacks=[];for(var i=0;i<callbacks.length;++i)
callbacks[i](content);},contentLoaded:function()
{return this._contentLoaded;},uiLocation:function(lineNumber,columnNumber)
{if(typeof columnNumber==="undefined")
columnNumber=0;return new WebInspector.UILocation(this,lineNumber,columnNumber);},messages:function()
{return this._messages.slice();},addLineMessage:function(level,text,lineNumber,columnNumber)
{return this.addMessage(level,text,new WebInspector.TextRange(lineNumber,columnNumber||0,lineNumber,columnNumber||0));},addMessage:function(level,text,range)
{var message=new WebInspector.UISourceCode.Message(this,level,text,range);this._messages.push(message);this.dispatchEventToListeners(WebInspector.UISourceCode.Events.MessageAdded,message);return message;},removeMessage:function(message)
{if(this._messages.remove(message))
this.dispatchEventToListeners(WebInspector.UISourceCode.Events.MessageRemoved,message);},removeAllMessages:function()
{var messages=this._messages;this._messages=[];for(var message of messages)
this.dispatchEventToListeners(WebInspector.UISourceCode.Events.MessageRemoved,message);},__proto__:WebInspector.Object.prototype}
WebInspector.UILocation=function(uiSourceCode,lineNumber,columnNumber)
{this.uiSourceCode=uiSourceCode;this.lineNumber=lineNumber;this.columnNumber=columnNumber;}
WebInspector.UILocation.prototype={linkText:function()
{var linkText=this.uiSourceCode.displayName();if(typeof this.lineNumber==="number")
linkText+=":"+(this.lineNumber+1);return linkText;},id:function()
{return this.uiSourceCode.project().id()+":"+this.uiSourceCode.url()+":"+this.lineNumber+":"+this.columnNumber;},toUIString:function()
{return this.uiSourceCode.url()+":"+(this.lineNumber+1);}}
WebInspector.Revision=function(uiSourceCode,content,timestamp)
{this._uiSourceCode=uiSourceCode;this._content=content;this._timestamp=timestamp;}
WebInspector.Revision.prototype={get uiSourceCode()
{return this._uiSourceCode;},get timestamp()
{return this._timestamp;},get content()
{return this._content||null;},revertToThis:function()
{function revert(content)
{if(this._uiSourceCode._content!==content)
this._uiSourceCode.addRevision(content);}
WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.RevisionApplied);this.requestContent(revert.bind(this));},contentURL:function()
{return this._uiSourceCode.url();},contentType:function()
{return this._uiSourceCode.contentType();},requestContent:function(callback)
{callback(this._content||"");},searchInContent:function(query,caseSensitive,isRegex,callback)
{callback([]);}}
WebInspector.UISourceCode.Message=function(uiSourceCode,level,text,range)
{this._uiSourceCode=uiSourceCode;this._level=level;this._text=text;this._range=range;}
WebInspector.UISourceCode.Message.Level={Error:"Error",Warning:"Warning"}
WebInspector.UISourceCode.Message.prototype={uiSourceCode:function()
{return this._uiSourceCode;},level:function()
{return this._level;},text:function()
{return this._text;},range:function(){return this._range;},lineNumber:function()
{return this._range.startLine;},columnNumber:function()
{return this._range.startColumn;},isEqual:function(another)
{return this._uiSourceCode===another._uiSourceCode&&this.text()===another.text()&&this.level()===another.level()&&this.range().equal(another.range());},remove:function()
{this._uiSourceCode.removeMessage(this);}};WebInspector.ProjectSearchConfig=function(){}
WebInspector.ProjectSearchConfig.prototype={query:function(){},ignoreCase:function(){},isRegex:function(){},queries:function(){},filePathMatchesFileQuery:function(filePath){}}
WebInspector.Project=function(){}
WebInspector.Project.isServiceProject=function(project)
{return project.type()===WebInspector.projectTypes.Debugger||project.type()===WebInspector.projectTypes.Formatter||project.type()===WebInspector.projectTypes.Service;}
WebInspector.Project.prototype={workspace:function(){},id:function(){},type:function(){},displayName:function(){},requestFileContent:function(uiSourceCode,callback){},canSetFileContent:function(){},setFileContent:function(uiSourceCode,newContent,callback){},canRename:function(){},rename:function(uiSourceCode,newName,callback){},refresh:function(path,callback){},excludeFolder:function(path){},createFile:function(path,name,content,callback){},deleteFile:function(path){},remove:function(){},searchInFileContent:function(uiSourceCode,query,caseSensitive,isRegex,callback){},findFilesMatchingSearchRequest:function(searchConfig,filesMathingFileQuery,progress,callback){},indexContent:function(progress){},uiSourceCodeForURL:function(url){},uiSourceCodes:function(){}}
WebInspector.projectTypes={Debugger:"debugger",Formatter:"formatter",Network:"network",Snippets:"snippets",FileSystem:"filesystem",ContentScripts:"contentscripts",Service:"service"}
WebInspector.ProjectStore=function(workspace,id,type,displayName)
{this._workspace=workspace;this._id=id;this._type=type;this._displayName=displayName;this._uiSourceCodesMap=new Map();this._uiSourceCodesList=[];this._project=(this);}
WebInspector.ProjectStore.prototype={id:function()
{return this._id;},type:function()
{return this._type;},displayName:function()
{return this._displayName;},workspace:function()
{return this._workspace;},createUISourceCode:function(url,contentType)
{return new WebInspector.UISourceCode(this._project,url,contentType);},addUISourceCode:function(uiSourceCode,replace)
{var url=uiSourceCode.url();if(this.uiSourceCodeForURL(url)){if(replace)
this.removeUISourceCode(url);else
return false;}
this._uiSourceCodesMap.set(url,{uiSourceCode:uiSourceCode,index:this._uiSourceCodesList.length});this._uiSourceCodesList.push(uiSourceCode);this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.UISourceCodeAdded,uiSourceCode);return true;},removeUISourceCode:function(url)
{var uiSourceCode=this.uiSourceCodeForURL(url);if(!uiSourceCode)
return;var entry=this._uiSourceCodesMap.get(url);var movedUISourceCode=this._uiSourceCodesList[this._uiSourceCodesList.length-1];this._uiSourceCodesList[entry.index]=movedUISourceCode;var movedEntry=this._uiSourceCodesMap.get(movedUISourceCode.url());movedEntry.index=entry.index;this._uiSourceCodesList.splice(this._uiSourceCodesList.length-1,1);this._uiSourceCodesMap.delete(url);this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.UISourceCodeRemoved,entry.uiSourceCode);},removeProject:function()
{this._workspace._removeProject(this._project);this._uiSourceCodesMap=new Map();this._uiSourceCodesList=[];},uiSourceCodeForURL:function(url)
{var entry=this._uiSourceCodesMap.get(url);return entry?entry.uiSourceCode:null;},uiSourceCodes:function()
{return this._uiSourceCodesList;},renameUISourceCode:function(uiSourceCode,newName)
{var oldPath=uiSourceCode.url();var newPath=uiSourceCode.parentURL()?uiSourceCode.parentURL()+"/"+newName:newName;var value=(this._uiSourceCodesMap.get(oldPath));this._uiSourceCodesMap.set(newPath,value);this._uiSourceCodesMap.delete(oldPath);}}
WebInspector.Workspace=function()
{this._projects=new Map();this._hasResourceContentTrackingExtensions=false;}
WebInspector.Workspace.Events={UISourceCodeAdded:"UISourceCodeAdded",UISourceCodeRemoved:"UISourceCodeRemoved",WorkingCopyChanged:"WorkingCopyChanged",WorkingCopyCommitted:"WorkingCopyCommitted",WorkingCopyCommittedByUser:"WorkingCopyCommittedByUser",ProjectAdded:"ProjectAdded",ProjectRemoved:"ProjectRemoved"}
WebInspector.Workspace.prototype={unsavedSourceCodes:function()
{function filterUnsaved(sourceCode)
{return sourceCode.isDirty();}
var unsavedSourceCodes=[];var projects=this.projectsForType(WebInspector.projectTypes.FileSystem);for(var i=0;i<projects.length;++i)
unsavedSourceCodes=unsavedSourceCodes.concat(projects[i].uiSourceCodes().filter(filterUnsaved));return unsavedSourceCodes;},uiSourceCode:function(projectId,url)
{var project=this._projects.get(projectId);return project?project.uiSourceCodeForURL(url):null;},uiSourceCodeForURL:function(url)
{for(var project of this._projects.values()){var uiSourceCode=project.uiSourceCodeForURL(url);if(uiSourceCode)
return uiSourceCode;}
return null;},uiSourceCodesForProjectType:function(type)
{var result=[];for(var project of this._projects.values()){if(project.type()===type)
result=result.concat(project.uiSourceCodes());}
return result;},addProject:function(project)
{this._projects.set(project.id(),project);this.dispatchEventToListeners(WebInspector.Workspace.Events.ProjectAdded,project);},_removeProject:function(project)
{this._projects.delete(project.id());this.dispatchEventToListeners(WebInspector.Workspace.Events.ProjectRemoved,project);},project:function(projectId)
{return this._projects.get(projectId)||null;},projects:function()
{return Array.from(this._projects.values());},projectsForType:function(type)
{function filterByType(project)
{return project.type()===type;}
return this.projects().filter(filterByType);},uiSourceCodes:function()
{var result=[];for(var project of this._projects.values())
result=result.concat(project.uiSourceCodes());return result;},setHasResourceContentTrackingExtensions:function(hasExtensions)
{this._hasResourceContentTrackingExtensions=hasExtensions;},hasResourceContentTrackingExtensions:function()
{return this._hasResourceContentTrackingExtensions;},__proto__:WebInspector.Object.prototype}
WebInspector.workspace;;WebInspector.LiveLocation=function(updateDelegate)
{this._updateDelegate=updateDelegate;}
WebInspector.LiveLocation.prototype={update:function()
{var uiLocation=this.uiLocation();if(!uiLocation)
return;if(this._updateDelegate(uiLocation))
this.dispose();},uiLocation:function()
{throw"Not implemented";},dispose:function()
{}};WebInspector.CompilerScriptMapping=function(debuggerModel,workspace,networkMapping,networkProject,debuggerWorkspaceBinding)
{this._target=debuggerModel.target();this._debuggerModel=debuggerModel;this._workspace=workspace;this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAddedToWorkspace,this);this._networkMapping=networkMapping;this._networkProject=networkProject;this._debuggerWorkspaceBinding=debuggerWorkspaceBinding;this._sourceMapForSourceMapURL={};this._pendingSourceMapLoadingCallbacks={};this._sourceMapForScriptId={};this._scriptForSourceMap=new Map();this._sourceMapForURL=new Map();this._stubUISourceCodes=new Map();this._stubProjectID="compiler-script-project";this._stubProject=new WebInspector.ContentProviderBasedProject(this._workspace,this._stubProjectID,WebInspector.projectTypes.Service,"");debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._debuggerReset,this);}
WebInspector.CompilerScriptMapping.StubProjectID="compiler-script-project";WebInspector.CompilerScriptMapping._originSymbol=Symbol("origin");WebInspector.CompilerScriptMapping.uiSourceCodeOrigin=function(uiSourceCode)
{return uiSourceCode[WebInspector.CompilerScriptMapping._originSymbol]||null;}
WebInspector.CompilerScriptMapping.prototype={mapsToSourceCode:function(rawLocation){var sourceMap=this._sourceMapForScriptId[rawLocation.scriptId];if(!sourceMap){return true;}
return!!sourceMap.findEntry(rawLocation.lineNumber,rawLocation.columnNumber);},rawLocationToUILocation:function(rawLocation)
{var debuggerModelLocation=(rawLocation);var stubUISourceCode=this._stubUISourceCodes.get(debuggerModelLocation.scriptId);if(stubUISourceCode)
return new WebInspector.UILocation(stubUISourceCode,rawLocation.lineNumber,rawLocation.columnNumber);var sourceMap=this._sourceMapForScriptId[debuggerModelLocation.scriptId];if(!sourceMap)
return null;var lineNumber=debuggerModelLocation.lineNumber;var columnNumber=debuggerModelLocation.columnNumber||0;var entry=sourceMap.findEntry(lineNumber,columnNumber);if(!entry||!entry.sourceURL)
return null;var uiSourceCode=this._networkMapping.uiSourceCodeForScriptURL((entry.sourceURL),rawLocation.script());if(!uiSourceCode)
return null;return uiSourceCode.uiLocation((entry.sourceLineNumber),(entry.sourceColumnNumber));},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
{if(uiSourceCode.project().type()===WebInspector.projectTypes.Service)
return null;var networkURL=this._networkMapping.networkURL(uiSourceCode);if(!networkURL)
return null;var sourceMap=this._sourceMapForURL.get(networkURL);if(!sourceMap)
return null;var script=(this._scriptForSourceMap.get(sourceMap));console.assert(script);var entry=sourceMap.firstSourceLineMapping(networkURL,lineNumber);if(!entry)
return null;return this._debuggerModel.createRawLocation(script,entry.lineNumber,entry.columnNumber);},addScript:function(script)
{if(!script.sourceMapURL){script.addEventListener(WebInspector.Script.Events.SourceMapURLAdded,this._sourceMapURLAdded.bind(this));return;}
this._processScript(script);},_sourceMapURLAdded:function(event)
{var script=(event.target);if(!script.sourceMapURL)
return;this._processScript(script);},_processScript:function(script)
{var stubUISourceCode=this._stubProject.addContentProvider(script.sourceURL,new WebInspector.StaticContentProvider(WebInspector.resourceTypes.Script,"\n\n\n\n\n// Please wait a bit.\n// Compiled script is not shown while source map is being loaded!",script.sourceURL));this._stubUISourceCodes.set(script.scriptId,stubUISourceCode);this._debuggerWorkspaceBinding.pushSourceMapping(script,this);this._loadSourceMapForScript(script,this._sourceMapLoaded.bind(this,script,stubUISourceCode.url()));},_sourceMapLoaded:function(script,uiSourceCodePath,sourceMap)
{this._stubUISourceCodes.delete(script.scriptId);this._stubProject.removeFile(uiSourceCodePath);if(!sourceMap){this._debuggerWorkspaceBinding.updateLocations(script);return;}
if(this._scriptForSourceMap.get(sourceMap)){this._sourceMapForScriptId[script.scriptId]=sourceMap;this._debuggerWorkspaceBinding.updateLocations(script);return;}
this._sourceMapForScriptId[script.scriptId]=sourceMap;this._scriptForSourceMap.set(sourceMap,script);var sourceURLs=sourceMap.sources();var missingSources=[];for(var i=0;i<sourceURLs.length;++i){var sourceURL=sourceURLs[i];if(this._sourceMapForURL.get(sourceURL))
continue;this._sourceMapForURL.set(sourceURL,sourceMap);var uiSourceCode=this._networkMapping.uiSourceCodeForScriptURL(sourceURL,script);if(!uiSourceCode&&!this._networkMapping.hasMappingForNetworkURL(sourceURL)){var contentProvider=sourceMap.sourceContentProvider(sourceURL,WebInspector.resourceTypes.SourceMapScript);uiSourceCode=this._networkProject.addFileForURL(sourceURL,contentProvider,WebInspector.ResourceTreeFrame.fromScript(script),script.isContentScript());uiSourceCode[WebInspector.CompilerScriptMapping._originSymbol]=script.sourceURL;}
if(uiSourceCode){this._bindUISourceCode(uiSourceCode);}else{if(missingSources.length<3)
missingSources.push(sourceURL);else if(missingSources.peekLast()!=="\u2026")
missingSources.push("\u2026");}}
if(missingSources.length){WebInspector.console.warn(WebInspector.UIString("Source map %s points to the files missing from the workspace: [%s]",sourceMap.url(),missingSources.join(", ")));}
this._debuggerWorkspaceBinding.updateLocations(script);},isIdentity:function()
{return false;},uiLineHasMapping:function(uiSourceCode,lineNumber)
{var networkURL=this._networkMapping.networkURL(uiSourceCode);if(!networkURL)
return true;var sourceMap=this._sourceMapForURL.get(networkURL);if(!sourceMap)
return true;return!!sourceMap.firstSourceLineMapping(networkURL,lineNumber);},_bindUISourceCode:function(uiSourceCode)
{this._debuggerWorkspaceBinding.setSourceMapping(this._target,uiSourceCode,this);},_unbindUISourceCode:function(uiSourceCode)
{this._debuggerWorkspaceBinding.setSourceMapping(this._target,uiSourceCode,null);},_uiSourceCodeAddedToWorkspace:function(event)
{var uiSourceCode=(event.data);var networkURL=this._networkMapping.networkURL(uiSourceCode);if(!networkURL||!this._sourceMapForURL.get(networkURL))
return;this._bindUISourceCode(uiSourceCode);},_loadSourceMapForScript:function(script,callback)
{var scriptURL=WebInspector.ParsedURL.completeURL(this._target.resourceTreeModel.inspectedPageURL(),script.sourceURL);if(!scriptURL){callback(null);return;}
console.assert(script.sourceMapURL);var scriptSourceMapURL=(script.sourceMapURL);var sourceMapURL=WebInspector.ParsedURL.completeURL(scriptURL,scriptSourceMapURL);if(!sourceMapURL){callback(null);return;}
var sourceMap=this._sourceMapForSourceMapURL[sourceMapURL];if(sourceMap){callback(sourceMap);return;}
var pendingCallbacks=this._pendingSourceMapLoadingCallbacks[sourceMapURL];if(pendingCallbacks){pendingCallbacks.push(callback);return;}
pendingCallbacks=[callback];this._pendingSourceMapLoadingCallbacks[sourceMapURL]=pendingCallbacks;WebInspector.SourceMap.load(sourceMapURL,scriptURL,sourceMapLoaded.bind(this));function sourceMapLoaded(sourceMap)
{var url=(sourceMapURL);var callbacks=this._pendingSourceMapLoadingCallbacks[url];delete this._pendingSourceMapLoadingCallbacks[url];if(!callbacks)
return;if(sourceMap)
this._sourceMapForSourceMapURL[url]=sourceMap;for(var i=0;i<callbacks.length;++i)
callbacks[i](sourceMap);}},_debuggerReset:function()
{function unbindSourceMapSources(sourceMap)
{var script=this._scriptForSourceMap.get(sourceMap);if(!script)
return;var sourceURLs=sourceMap.sources();for(var i=0;i<sourceURLs.length;++i){var uiSourceCode=this._networkMapping.uiSourceCodeForScriptURL(sourceURLs[i],script);if(uiSourceCode)
this._unbindUISourceCode(uiSourceCode);}}
this._sourceMapForURL.valuesArray().forEach(unbindSourceMapSources.bind(this));this._sourceMapForSourceMapURL={};this._pendingSourceMapLoadingCallbacks={};this._sourceMapForScriptId={};this._scriptForSourceMap.clear();this._sourceMapForURL.clear();},dispose:function()
{this._workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAddedToWorkspace,this);}};WebInspector.ResourceScriptMapping=function(debuggerModel,workspace,networkMapping,debuggerWorkspaceBinding)
{this._target=debuggerModel.target();this._debuggerModel=debuggerModel;this._workspace=workspace;this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAdded,this);this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved,this._uiSourceCodeRemoved,this);this._networkMapping=networkMapping;this._debuggerWorkspaceBinding=debuggerWorkspaceBinding;this._boundUISourceCodes=[];this._uiSourceCodeToScriptFile=new Map();debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._debuggerReset,this);}
WebInspector.ResourceScriptMapping.prototype={rawLocationToUILocation:function(rawLocation)
{var debuggerModelLocation=(rawLocation);var script=debuggerModelLocation.script();var uiSourceCode=this._workspaceUISourceCodeForScript(script);if(!uiSourceCode)
return null;var scriptFile=this.scriptFile(uiSourceCode);if(scriptFile&&((scriptFile.hasDivergedFromVM()&&!scriptFile.isMergingToVM())||scriptFile.isDivergingFromVM()))
return null;var lineNumber=debuggerModelLocation.lineNumber-(script.isInlineScriptWithSourceURL()?script.lineOffset:0);var columnNumber=debuggerModelLocation.columnNumber||0;if(script.isInlineScriptWithSourceURL()&&!lineNumber&&columnNumber)
columnNumber-=script.columnOffset;return uiSourceCode.uiLocation(lineNumber,columnNumber);},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
{var scripts=this._scriptsForUISourceCode(uiSourceCode);console.assert(scripts.length);var script=scripts[0];if(script.isInlineScriptWithSourceURL())
return this._debuggerModel.createRawLocation(script,lineNumber+script.lineOffset,lineNumber?columnNumber:columnNumber+script.columnOffset);return this._debuggerModel.createRawLocation(script,lineNumber,columnNumber);},addScript:function(script)
{if(script.isAnonymousScript())
return;this._debuggerWorkspaceBinding.pushSourceMapping(script,this);var uiSourceCode=this._workspaceUISourceCodeForScript(script);if(!uiSourceCode)
return;this._bindUISourceCodeToScripts(uiSourceCode,[script]);},isIdentity:function()
{return true;},uiLineHasMapping:function(uiSourceCode,lineNumber)
{return true;},scriptFile:function(uiSourceCode)
{return this._uiSourceCodeToScriptFile.get(uiSourceCode)||null;},_setScriptFile:function(uiSourceCode,scriptFile)
{if(scriptFile)
this._uiSourceCodeToScriptFile.set(uiSourceCode,scriptFile);else
this._uiSourceCodeToScriptFile.remove(uiSourceCode);},_uiSourceCodeAdded:function(event)
{var uiSourceCode=(event.data);if(!this._networkMapping.networkURL(uiSourceCode))
return;if(uiSourceCode.isFromServiceProject())
return;var scripts=this._scriptsForUISourceCode(uiSourceCode);if(!scripts.length)
return;this._bindUISourceCodeToScripts(uiSourceCode,scripts);},_uiSourceCodeRemoved:function(event)
{var uiSourceCode=(event.data);if(!this._networkMapping.networkURL(uiSourceCode))
return;if(uiSourceCode.isFromServiceProject())
return;this._unbindUISourceCode(uiSourceCode);},_updateLocations:function(uiSourceCode)
{var scripts=this._scriptsForUISourceCode(uiSourceCode);if(!scripts.length)
return;for(var i=0;i<scripts.length;++i)
this._debuggerWorkspaceBinding.updateLocations(scripts[i]);},_workspaceUISourceCodeForScript:function(script)
{if(script.isAnonymousScript())
return null;return this._networkMapping.uiSourceCodeForScriptURL(script.sourceURL,script);},_scriptsForUISourceCode:function(uiSourceCode)
{var target=WebInspector.NetworkProject.targetForUISourceCode(uiSourceCode);if(target&&target!==this._debuggerModel.target())
return[];if(!this._networkMapping.networkURL(uiSourceCode))
return[];return this._debuggerModel.scriptsForSourceURL(this._networkMapping.networkURL(uiSourceCode));},_bindUISourceCodeToScripts:function(uiSourceCode,scripts)
{console.assert(scripts.length);var boundScriptFile=this.scriptFile(uiSourceCode);if(boundScriptFile&&boundScriptFile._hasScripts(scripts))
return;var scriptFile=new WebInspector.ResourceScriptFile(this,uiSourceCode,scripts);this._setScriptFile(uiSourceCode,scriptFile);for(var i=0;i<scripts.length;++i)
this._debuggerWorkspaceBinding.updateLocations(scripts[i]);this._debuggerWorkspaceBinding.setSourceMapping(this._target,uiSourceCode,this);this._boundUISourceCodes.push(uiSourceCode);},_unbindUISourceCode:function(uiSourceCode)
{var scriptFile=this.scriptFile(uiSourceCode);if(scriptFile){scriptFile.dispose();this._setScriptFile(uiSourceCode,null);}
this._debuggerWorkspaceBinding.setSourceMapping(this._target,uiSourceCode,null);this._boundUISourceCodes.remove(uiSourceCode);},_debuggerReset:function()
{var sourceCodes=this._boundUISourceCodes;this._boundUISourceCodes=[];sourceCodes.forEach(this._unbindUISourceCode.bind(this));console.assert(!this._uiSourceCodeToScriptFile.size);},dispose:function()
{this._debuggerReset();this._workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAdded,this);this._workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved,this._uiSourceCodeRemoved,this);}}
WebInspector.ResourceScriptFile=function(resourceScriptMapping,uiSourceCode,scripts)
{console.assert(scripts.length);this._resourceScriptMapping=resourceScriptMapping;this._uiSourceCode=uiSourceCode;this._uiSourceCode.forceLoadOnCheckContent();if(this._uiSourceCode.contentType().isScript())
this._script=scripts[0];this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._workingCopyChanged,this);this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._workingCopyCommitted,this);}
WebInspector.ResourceScriptFile.Events={DidMergeToVM:"DidMergeToVM",DidDivergeFromVM:"DidDivergeFromVM",}
WebInspector.ResourceScriptFile.prototype={_hasScripts:function(scripts)
{return this._script&&this._script===scripts[0];},_isDiverged:function()
{if(this._uiSourceCode.isDirty())
return true;if(!this._script)
return false;if(typeof this._scriptSource==="undefined")
return false;if(!this._uiSourceCode.workingCopy().startsWith(this._scriptSource.trimRight()))
return true;var suffix=this._uiSourceCode.workingCopy().substr(this._scriptSource.length);return!!suffix.length&&!suffix.match(WebInspector.Script.sourceURLRegex);},_workingCopyChanged:function(event)
{this._update();},_workingCopyCommitted:function(event)
{if(this._uiSourceCode.project().type()===WebInspector.projectTypes.Snippets)
return;if(!this._script)
return;var debuggerModel=this._resourceScriptMapping._debuggerModel;var source=this._uiSourceCode.workingCopy();debuggerModel.setScriptSource(this._script.scriptId,source,scriptSourceWasSet.bind(this));function scriptSourceWasSet(error,errorData)
{if(!error)
this._scriptSource=source;this._update();if(!error)
return;var warningLevel=WebInspector.Console.MessageLevel.Warning;if(!errorData){WebInspector.console.addMessage(WebInspector.UIString("LiveEdit failed: %s",error),warningLevel);return;}
var compileError=errorData.compileError;if(compileError){var messageText=WebInspector.UIString("LiveEdit compile failed: %s",compileError.message);this._uiSourceCode.addLineMessage(WebInspector.UISourceCode.Message.Level.Error,messageText,compileError.lineNumber-1,compileError.columnNumber+1);}else{WebInspector.console.addMessage(WebInspector.UIString("Unknown LiveEdit error: %s; %s",JSON.stringify(errorData),error),warningLevel);}}},_update:function()
{if(this._isDiverged()&&!this._hasDivergedFromVM)
this._divergeFromVM();else if(!this._isDiverged()&&this._hasDivergedFromVM)
this._mergeToVM();},_divergeFromVM:function()
{this._isDivergingFromVM=true;this._resourceScriptMapping._updateLocations(this._uiSourceCode);delete this._isDivergingFromVM;this._hasDivergedFromVM=true;this.dispatchEventToListeners(WebInspector.ResourceScriptFile.Events.DidDivergeFromVM,this._uiSourceCode);},_mergeToVM:function()
{delete this._hasDivergedFromVM;this._isMergingToVM=true;this._resourceScriptMapping._updateLocations(this._uiSourceCode);delete this._isMergingToVM;this.dispatchEventToListeners(WebInspector.ResourceScriptFile.Events.DidMergeToVM,this._uiSourceCode);},hasDivergedFromVM:function()
{return this._hasDivergedFromVM;},isDivergingFromVM:function()
{return this._isDivergingFromVM;},isMergingToVM:function()
{return this._isMergingToVM;},checkMapping:function()
{if(!this._script)
return;if(typeof this._scriptSource!=="undefined")
return;this._script.requestContent(callback.bind(this));function callback(source)
{this._scriptSource=source;this._update();}},target:function()
{if(!this._script)
return null;return this._script.target();},dispose:function()
{this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._workingCopyChanged,this);this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._workingCopyCommitted,this);},addSourceMapURL:function(sourceMapURL)
{if(!this._script)
return;this._script.addSourceMapURL(sourceMapURL);},hasSourceMapURL:function()
{return this._script&&!!this._script.sourceMapURL;},__proto__:WebInspector.Object.prototype};WebInspector.SASSSourceMapping=function(cssModel,networkMapping,networkProject)
{this._cssModel=cssModel;this._networkProject=networkProject;this._reset();WebInspector.moduleSetting("cssSourceMapsEnabled").addChangeListener(this._toggleSourceMapSupport,this);this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged,this._styleSheetChanged,this);cssModel.target().resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._reset,this);this._networkMapping=networkMapping;}
WebInspector.SASSSourceMapping.prototype={_styleSheetChanged:function(event)
{var id=(event.data.styleSheetId);var header=this._cssModel.styleSheetHeaderForId(id);if(!header)
return;this.removeHeader(header);this.addHeader(header);},_toggleSourceMapSupport:function(event)
{var enabled=(event.data);var headers=this._cssModel.styleSheetHeaders();for(var i=0;i<headers.length;++i){if(enabled)
this.addHeader(headers[i]);else
this.removeHeader(headers[i]);}},addHeader:function(header)
{if(!header.sourceMapURL||!header.sourceURL||!WebInspector.moduleSetting("cssSourceMapsEnabled").get())
return;var completeSourceMapURL=WebInspector.ParsedURL.completeURL(header.sourceURL,header.sourceMapURL);if(!completeSourceMapURL)
return;this._loadSourceMap(completeSourceMapURL,header,sourceMapLoaded.bind(this));function sourceMapLoaded(sourceMap)
{if(sourceMap)
this._sourceMapByStyleSheetURL[header.sourceURL]=sourceMap;else
delete this._sourceMapByStyleSheetURL[header.sourceURL];WebInspector.cssWorkspaceBinding.pushSourceMapping(header,this);}},removeHeader:function(header)
{if(!header.sourceURL)
return;delete this._sourceMapByStyleSheetURL[header.sourceURL];WebInspector.cssWorkspaceBinding.updateLocations(header);},_loadSourceMap:function(completeSourceMapURL,header,callback)
{var sourceMap=this._sourceMapByURL[completeSourceMapURL];if(sourceMap){callback(sourceMap);return;}
var pendingCallbacks=this._pendingSourceMapLoadingCallbacks[completeSourceMapURL];if(pendingCallbacks){pendingCallbacks.push(callback);return;}
pendingCallbacks=[callback];this._pendingSourceMapLoadingCallbacks[completeSourceMapURL]=pendingCallbacks;WebInspector.SourceMap.load(completeSourceMapURL,header.sourceURL,sourceMapLoaded.bind(this));function sourceMapLoaded(sourceMap)
{var callbacks=this._pendingSourceMapLoadingCallbacks[completeSourceMapURL];delete this._pendingSourceMapLoadingCallbacks[completeSourceMapURL];if(sourceMap)
this._sourceMapByURL[completeSourceMapURL]=sourceMap;else
delete this._sourceMapByURL[completeSourceMapURL];var sources=sourceMap?sourceMap.sources():[];for(var i=0;i<sources.length;++i){var sassURL=sources[i];if(!this._networkMapping.hasMappingForNetworkURL(sassURL)){var contentProvider=sourceMap.sourceContentProvider(sassURL,WebInspector.resourceTypes.SourceMapStyleSheet);this._networkProject.addFileForURL(sassURL,contentProvider,WebInspector.ResourceTreeFrame.fromStyleSheet(header));}}
for(var i=0;callbacks&&i<callbacks.length;++i)
callbacks[i](sourceMap);}},rawLocationToUILocation:function(rawLocation)
{var sourceMap=this._sourceMapByStyleSheetURL[rawLocation.url];if(!sourceMap)
return null;var entry=sourceMap.findEntry(rawLocation.lineNumber,rawLocation.columnNumber);if(!entry||!entry.sourceURL)
return null;var uiSourceCode=this._networkMapping.uiSourceCodeForStyleURL(entry.sourceURL,rawLocation.header());if(!uiSourceCode)
return null;return uiSourceCode.uiLocation(entry.sourceLineNumber,entry.sourceColumnNumber);},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
{return null;},isIdentity:function()
{return false;},uiLineHasMapping:function(uiSourceCode,lineNumber)
{return true;},target:function()
{return this._cssModel.target();},_reset:function()
{this._pendingSourceMapLoadingCallbacks={};this._sourceMapByURL={};this._sourceMapByStyleSheetURL={};}};WebInspector.StylesSourceMapping=function(cssModel,workspace,networkMapping)
{this._cssModel=cssModel;this._workspace=workspace;this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved,this._projectRemoved,this);this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAddedToWorkspace,this);this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved,this._uiSourceCodeRemoved,this);this._networkMapping=networkMapping;cssModel.target().resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._unbindAllUISourceCodes,this);this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged,this._styleSheetChanged,this);this._urlToHeadersByFrameId={};this._styleFiles=new Map();}
WebInspector.StylesSourceMapping.ChangeUpdateTimeoutMs=200;WebInspector.StylesSourceMapping.prototype={rawLocationToUILocation:function(rawLocation)
{var uiSourceCode=this._networkMapping.uiSourceCodeForStyleURL(rawLocation.url,rawLocation.header());if(!uiSourceCode)
return null;var lineNumber=rawLocation.lineNumber;var columnNumber=rawLocation.columnNumber;var header=this._cssModel.styleSheetHeaderForId(rawLocation.styleSheetId);if(header&&header.isInline&&header.hasSourceURL){lineNumber-=header.lineNumberInSource(0);columnNumber-=header.columnNumberInSource(lineNumber,0);}
return uiSourceCode.uiLocation(lineNumber,columnNumber);},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
{return null;},isIdentity:function()
{return true;},uiLineHasMapping:function(uiSourceCode,lineNumber)
{return true;},target:function()
{return this._cssModel.target();},addHeader:function(header)
{var url=header.resourceURL();if(!url)
return;WebInspector.cssWorkspaceBinding.pushSourceMapping(header,this);var map=this._urlToHeadersByFrameId[url];if(!map){map=(new Map());this._urlToHeadersByFrameId[url]=map;}
var headersById=map.get(header.frameId);if(!headersById){headersById=(new Map());map.set(header.frameId,headersById);}
headersById.set(header.id,header);var uiSourceCode=this._networkMapping.uiSourceCodeForStyleURL(url,header);if(uiSourceCode)
this._bindUISourceCode(uiSourceCode,header);},removeHeader:function(header)
{var url=header.resourceURL();if(!url)
return;var map=this._urlToHeadersByFrameId[url];console.assert(map);var headersById=map.get(header.frameId);console.assert(headersById);headersById.remove(header.id);if(!headersById.size){map.remove(header.frameId);if(!map.size){delete this._urlToHeadersByFrameId[url];var uiSourceCode=this._networkMapping.uiSourceCodeForStyleURL(url,header);if(uiSourceCode)
this._unbindUISourceCode(uiSourceCode);}}},_unbindUISourceCode:function(uiSourceCode)
{var styleFile=this._styleFiles.get(uiSourceCode);if(!styleFile)
return;styleFile.dispose();this._styleFiles.remove(uiSourceCode);},_unbindAllUISourceCodes:function()
{for(var styleFile of this._styleFiles.keys())
styleFile.dispose();this._styleFiles.clear();this._urlToHeadersByFrameId={};},_uiSourceCodeAddedToWorkspace:function(event)
{var uiSourceCode=(event.data);var networkURL=this._networkMapping.networkURL(uiSourceCode);if(!networkURL||!this._urlToHeadersByFrameId[networkURL])
return;this._bindUISourceCode(uiSourceCode,this._urlToHeadersByFrameId[networkURL].valuesArray()[0].valuesArray()[0]);},_bindUISourceCode:function(uiSourceCode,header)
{if(this._styleFiles.get(uiSourceCode)||(header.isInline&&!header.hasSourceURL))
return;this._styleFiles.set(uiSourceCode,new WebInspector.StyleFile(uiSourceCode,this));WebInspector.cssWorkspaceBinding.updateLocations(header);},_projectRemoved:function(event)
{var project=(event.data);var uiSourceCodes=project.uiSourceCodes();for(var i=0;i<uiSourceCodes.length;++i)
this._unbindUISourceCode(uiSourceCodes[i]);},_uiSourceCodeRemoved:function(event)
{var uiSourceCode=(event.data);this._unbindUISourceCode(uiSourceCode);},_initialize:function()
{},_setStyleContent:function(uiSourceCode,content,majorChange)
{var networkURL=this._networkMapping.networkURL(uiSourceCode);var styleSheetIds=this._cssModel.styleSheetIdsForURL(networkURL);if(!styleSheetIds.length)
return Promise.resolve(("No stylesheet found: "+networkURL));this._isSettingContent=true;function callback(error)
{delete this._isSettingContent;return error||null;}
var promises=[];for(var i=0;i<styleSheetIds.length;++i)
promises.push(this._cssModel.setStyleSheetText(styleSheetIds[i],content,majorChange));return Promise.all(promises).spread(callback.bind(this));},_styleSheetChanged:function(event)
{if(this._isSettingContent)
return;this._updateStyleSheetTextSoon(event.data.styleSheetId);},_updateStyleSheetTextSoon:function(styleSheetId)
{if(this._updateStyleSheetTextTimer)
clearTimeout(this._updateStyleSheetTextTimer);this._updateStyleSheetTextTimer=setTimeout(this._updateStyleSheetText.bind(this,styleSheetId),WebInspector.StylesSourceMapping.ChangeUpdateTimeoutMs);},_updateStyleSheetText:function(styleSheetId)
{if(this._updateStyleSheetTextTimer){clearTimeout(this._updateStyleSheetTextTimer);delete this._updateStyleSheetTextTimer;}
var header=this._cssModel.styleSheetHeaderForId(styleSheetId);if(!header)
return;var styleSheetURL=header.resourceURL();if(!styleSheetURL)
return;var uiSourceCode=this._networkMapping.uiSourceCodeForStyleURL(styleSheetURL,header);if(!uiSourceCode)
return;header.requestContent(callback.bind(this,uiSourceCode));function callback(uiSourceCode,content)
{var styleFile=this._styleFiles.get(uiSourceCode);if(styleFile)
styleFile.addRevision(content||"");}}}
WebInspector.StyleFile=function(uiSourceCode,mapping)
{this._uiSourceCode=uiSourceCode;this._mapping=mapping;this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._workingCopyChanged,this);this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._workingCopyCommitted,this);this._uiSourceCode.forceLoadOnCheckContent();this._commitThrottler=new WebInspector.Throttler(WebInspector.StyleFile.updateTimeout);}
WebInspector.StyleFile.updateTimeout=200;WebInspector.StyleFile.prototype={_workingCopyCommitted:function(event)
{if(this._isAddingRevision)
return;this._isMajorChangePending=true;this._commitThrottler.schedule(this._commitIncrementalEdit.bind(this),true);},_workingCopyChanged:function(event)
{if(this._isAddingRevision)
return;this._commitThrottler.schedule(this._commitIncrementalEdit.bind(this),false);},_commitIncrementalEdit:function()
{var promise=this._mapping._setStyleContent(this._uiSourceCode,this._uiSourceCode.workingCopy(),this._isMajorChangePending).then(this._styleContentSet.bind(this))
this._isMajorChangePending=false;return promise;},_styleContentSet:function(error)
{if(error)
WebInspector.console.error(error);},addRevision:function(content)
{this._isAddingRevision=true;this._uiSourceCode.addRevision(content);delete this._isAddingRevision;},dispose:function()
{this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._workingCopyCommitted,this);this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._workingCopyChanged,this);}};WebInspector.CSSWorkspaceBinding=function(targetManager,workspace,networkMapping)
{this._workspace=workspace;this._networkMapping=networkMapping;this._modelToTargetInfo=new Map();targetManager.observeTargets(this);targetManager.addModelListener(WebInspector.ResourceTreeModel,WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._mainFrameCreatedOrNavigated,this);}
WebInspector.CSSWorkspaceBinding.prototype={targetAdded:function(target)
{var cssModel=WebInspector.CSSStyleModel.fromTarget(target);if(cssModel)
this._modelToTargetInfo.set(cssModel,new WebInspector.CSSWorkspaceBinding.TargetInfo(cssModel,this._workspace,this._networkMapping));},targetRemoved:function(target)
{var cssModel=WebInspector.CSSStyleModel.fromTarget(target);if(cssModel)
this._modelToTargetInfo.remove(cssModel)._dispose();},pushSourceMapping:function(header,mapping)
{this._ensureInfoForHeader(header)._pushSourceMapping(mapping);},_headerInfo:function(header)
{var map=this._modelToTargetInfo.get(header.cssModel());return map._headerInfo(header.id)||null;},_ensureInfoForHeader:function(header)
{var targetInfo=this._modelToTargetInfo.get(header.cssModel());if(!targetInfo){targetInfo=new WebInspector.CSSWorkspaceBinding.TargetInfo(header.cssModel(),this._workspace,this._networkMapping);this._modelToTargetInfo.set(header.cssModel(),targetInfo);}
return targetInfo._ensureInfoForHeader(header);},_mainFrameCreatedOrNavigated:function(event)
{var target=(event.target).target();var cssModel=WebInspector.CSSStyleModel.fromTarget(target);if(cssModel)
this._modelToTargetInfo.get(cssModel)._reset();},updateLocations:function(header)
{var info=this._headerInfo(header);if(info)
info._updateLocations();},createLiveLocation:function(rawLocation,updateDelegate)
{var header=rawLocation.styleSheetId?rawLocation.cssModel().styleSheetHeaderForId(rawLocation.styleSheetId):null;return new WebInspector.CSSWorkspaceBinding.LiveLocation(rawLocation.cssModel(),header,rawLocation,this,updateDelegate);},_addLiveLocation:function(location)
{this._ensureInfoForHeader(location._header)._addLocation(location);},_removeLiveLocation:function(location)
{var info=this._headerInfo(location._header);if(info)
info._removeLocation(location);},propertyUILocation:function(cssProperty,forName)
{var style=cssProperty.ownerStyle;if(!style||!style.parentRule||!style.styleSheetId)
return null;var range=cssProperty.range;if(!range)
return null;var header=style.cssModel().styleSheetHeaderForId(style.styleSheetId);if(!header)
return null;var line=forName?range.startLine:range.endLine;var column=forName?range.startColumn:range.endColumn-(cssProperty.text&&cssProperty.text.endsWith(";")?2:1);var rawLocation=new WebInspector.CSSLocation(header,header.lineNumberInSource(line),header.columnNumberInSource(line,column));return this.rawLocationToUILocation(rawLocation);},rawLocationToUILocation:function(rawLocation)
{if(!rawLocation)
return null;var header=rawLocation.cssModel().styleSheetHeaderForId(rawLocation.styleSheetId);if(!header)
return null;var info=this._headerInfo(header);return info?info._rawLocationToUILocation(rawLocation.lineNumber,rawLocation.columnNumber):null;}}
WebInspector.CSSWorkspaceBinding.TargetInfo=function(cssModel,workspace,networkMapping)
{this._cssModel=cssModel;this._stylesSourceMapping=new WebInspector.StylesSourceMapping(cssModel,workspace,networkMapping);this._sassSourceMapping=new WebInspector.SASSSourceMapping(cssModel,networkMapping,WebInspector.NetworkProject.forTarget(cssModel.target()));this._headerInfoById=new Map();cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._styleSheetAdded,this);cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._styleSheetRemoved,this);}
WebInspector.CSSWorkspaceBinding.TargetInfo.prototype={_styleSheetAdded:function(event)
{var header=(event.data);this._stylesSourceMapping.addHeader(header);this._sassSourceMapping.addHeader(header);},_styleSheetRemoved:function(event)
{var header=(event.data);this._stylesSourceMapping.removeHeader(header);this._sassSourceMapping.removeHeader(header);this._headerInfoById.remove(header.id);},_headerInfo:function(id)
{return this._headerInfoById.get(id);},_ensureInfoForHeader:function(header)
{var info=this._headerInfoById.get(header.id);if(!info){info=new WebInspector.CSSWorkspaceBinding.HeaderInfo(header);this._headerInfoById.set(header.id,info);}
return info;},_dispose:function()
{this._reset();this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._styleSheetAdded,this);this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._styleSheetRemoved,this);},_reset:function()
{this._headerInfoById.clear();}}
WebInspector.CSSWorkspaceBinding.HeaderInfo=function(header)
{this._header=header;this._sourceMappings=[];this._locations=new Set();}
WebInspector.CSSWorkspaceBinding.HeaderInfo.prototype={_addLocation:function(location)
{this._locations.add(location);location.update();},_removeLocation:function(location)
{this._locations.delete(location);},_updateLocations:function()
{var items=this._locations.valuesArray();for(var i=0;i<items.length;++i)
items[i].update();},_rawLocationToUILocation:function(lineNumber,columnNumber)
{var uiLocation=null;var rawLocation=new WebInspector.CSSLocation(this._header,lineNumber,columnNumber);for(var i=this._sourceMappings.length-1;!uiLocation&&i>=0;--i)
uiLocation=this._sourceMappings[i].rawLocationToUILocation(rawLocation);return uiLocation;},_pushSourceMapping:function(sourceMapping)
{if(this._sourceMappings.indexOf(sourceMapping)!==-1)
return;this._sourceMappings.push(sourceMapping);this._updateLocations();}}
WebInspector.CSSWorkspaceBinding.LiveLocation=function(cssModel,header,rawLocation,binding,updateDelegate)
{WebInspector.LiveLocation.call(this,updateDelegate);this._cssModel=cssModel;this._rawLocation=rawLocation;this._binding=binding;if(!header)
this._clearStyleSheet();else
this._setStyleSheet(header);}
WebInspector.CSSWorkspaceBinding.LiveLocation.prototype={_styleSheetAdded:function(event)
{console.assert(!this._header);var header=(event.data);if(header.sourceURL&&header.sourceURL===this._rawLocation.url)
this._setStyleSheet(header);},_styleSheetRemoved:function(event)
{console.assert(this._header);var header=(event.data);if(this._header!==header)
return;this._binding._removeLiveLocation(this);this._clearStyleSheet();},_setStyleSheet:function(header)
{this._header=header;this._binding._addLiveLocation(this);this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._styleSheetAdded,this);this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._styleSheetRemoved,this);},_clearStyleSheet:function()
{delete this._header;this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._styleSheetRemoved,this);this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._styleSheetAdded,this);},uiLocation:function()
{var cssLocation=this._rawLocation;if(this._header){var headerInfo=this._binding._headerInfo(this._header);return headerInfo._rawLocationToUILocation(cssLocation.lineNumber,cssLocation.columnNumber);}
var uiSourceCode=this._binding._networkMapping.uiSourceCodeForStyleURL(cssLocation.url,cssLocation.header());if(!uiSourceCode)
return null;return uiSourceCode.uiLocation(cssLocation.lineNumber,cssLocation.columnNumber);},dispose:function()
{WebInspector.LiveLocation.prototype.dispose.call(this);if(this._header)
this._binding._removeLiveLocation(this);this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._styleSheetAdded,this);this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._styleSheetRemoved,this);},__proto__:WebInspector.LiveLocation.prototype}
WebInspector.CSSSourceMapping=function()
{}
WebInspector.CSSSourceMapping.prototype={rawLocationToUILocation:function(rawLocation){},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber){},isIdentity:function(){},uiLineHasMapping:function(uiSourceCode,lineNumber){}}
WebInspector.cssWorkspaceBinding;;WebInspector.DebuggerWorkspaceBinding=function(targetManager,workspace,networkMapping)
{this._workspace=workspace;this._networkMapping=networkMapping;this._targetToData=new Map();targetManager.observeTargets(this);targetManager.addModelListener(WebInspector.DebuggerModel,WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._globalObjectCleared,this);targetManager.addModelListener(WebInspector.DebuggerModel,WebInspector.DebuggerModel.Events.BeforeDebuggerPaused,this._beforeDebuggerPaused,this);targetManager.addModelListener(WebInspector.DebuggerModel,WebInspector.DebuggerModel.Events.DebuggerResumed,this._debuggerResumed,this);workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved,this._uiSourceCodeRemoved,this);workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved,this._projectRemoved,this);}
WebInspector.DebuggerWorkspaceBinding.prototype={targetAdded:function(target)
{var debuggerModel=WebInspector.DebuggerModel.fromTarget(target);if(debuggerModel)
this._targetToData.set(target,new WebInspector.DebuggerWorkspaceBinding.TargetData(debuggerModel,this));},targetRemoved:function(target)
{if(!WebInspector.DebuggerModel.fromTarget(target))
return;var targetData=this._targetToData.get(target);targetData._dispose();this._targetToData.remove(target);},_uiSourceCodeRemoved:function(event)
{var uiSourceCode=(event.data);var targetDatas=this._targetToData.valuesArray();for(var i=0;i<targetDatas.length;++i)
targetDatas[i]._uiSourceCodeRemoved(uiSourceCode);},_projectRemoved:function(event)
{var project=(event.data);var targetDatas=this._targetToData.valuesArray();var uiSourceCodes=project.uiSourceCodes();for(var i=0;i<targetDatas.length;++i){for(var j=0;j<uiSourceCodes.length;++j)
targetDatas[i]._uiSourceCodeRemoved(uiSourceCodes[j]);}},pushSourceMapping:function(script,sourceMapping)
{var info=this._ensureInfoForScript(script);info._pushSourceMapping(sourceMapping);},popSourceMapping:function(script)
{var info=this._infoForScript(script.target(),script.scriptId);console.assert(info);return info._popSourceMapping();},setSourceMapping:function(target,uiSourceCode,sourceMapping)
{var data=this._targetToData.get(target);if(data)
data._setSourceMapping(uiSourceCode,sourceMapping);},updateLocations:function(script)
{var info=this._infoForScript(script.target(),script.scriptId);if(info)
info._updateLocations();},createLiveLocation:function(rawLocation,updateDelegate)
{var info=this._infoForScript(rawLocation.target(),rawLocation.scriptId);console.assert(info);var location=new WebInspector.DebuggerWorkspaceBinding.Location(info._script,rawLocation,this,updateDelegate);info._addLocation(location);return location;},createCallFrameLiveLocation:function(callFrame,updateDelegate)
{var target=callFrame.target();this._ensureInfoForScript(callFrame.script);var location=this.createLiveLocation(callFrame.location(),updateDelegate);this._registerCallFrameLiveLocation(target,location);return location;},rawLocationToUILocation:function(rawLocation)
{var info=this._infoForScript(rawLocation.target(),rawLocation.scriptId);console.assert(info);return info._rawLocationToUILocation(rawLocation);},uiLocationToRawLocation:function(target,uiSourceCode,lineNumber,columnNumber)
{var targetData=this._targetToData.get(target);return targetData?(targetData._uiLocationToRawLocation(uiSourceCode,lineNumber,columnNumber)):null;},uiLocationToRawLocations:function(uiSourceCode,lineNumber,columnNumber)
{var result=[];var targetDatas=this._targetToData.valuesArray();for(var i=0;i<targetDatas.length;++i){var rawLocation=targetDatas[i]._uiLocationToRawLocation(uiSourceCode,lineNumber,columnNumber);if(rawLocation)
result.push(rawLocation);}
return result;},normalizeUILocation:function(uiLocation)
{var target=WebInspector.NetworkProject.targetForUISourceCode(uiLocation.uiSourceCode);if(target){var rawLocation=this.uiLocationToRawLocation(target,uiLocation.uiSourceCode,uiLocation.lineNumber,uiLocation.columnNumber);if(rawLocation)
return this.rawLocationToUILocation(rawLocation);}
return uiLocation;},uiLineHasMapping:function(uiSourceCode,lineNumber)
{var targetDatas=this._targetToData.valuesArray();for(var i=0;i<targetDatas.length;++i){if(!targetDatas[i]._uiLineHasMapping(uiSourceCode,lineNumber))
return false;}
return true;},scriptFile:function(uiSourceCode,target)
{var targetData=this._targetToData.get(target);return targetData?targetData._resourceMapping.scriptFile(uiSourceCode):null;},_globalObjectCleared:function(event)
{var debuggerModel=(event.target);this._reset(debuggerModel.target());},_reset:function(target)
{var targetData=this._targetToData.get(target);targetData.callFrameLocations.valuesArray().forEach(function(location){location.dispose();});targetData.callFrameLocations.clear();},_ensureInfoForScript:function(script)
{var scriptDataMap=this._targetToData.get(script.target()).scriptDataMap;var info=scriptDataMap.get(script.scriptId);if(!info){info=new WebInspector.DebuggerWorkspaceBinding.ScriptInfo(script);scriptDataMap.set(script.scriptId,info);}
return info;},_infoForScript:function(target,scriptId)
{var data=this._targetToData.get(target);if(!data)
return null;return data.scriptDataMap.get(scriptId)||null;},_registerCallFrameLiveLocation:function(target,location)
{var locations=this._targetToData.get(target).callFrameLocations;locations.add(location);},_removeLiveLocation:function(location)
{var info=this._infoForScript(location._script.target(),location._script.scriptId);if(info)
info._removeLocation(location);},_debuggerResumed:function(event)
{var debuggerModel=(event.target);this._reset(debuggerModel.target());},_beforeDebuggerPaused:function(event)
{var rawLocation=event.data.callFrames[0].location();var targetData=this._targetToData.get(rawLocation.target());if(!targetData._compilerMapping.mapsToSourceCode(rawLocation)){event.stopPropagation();event.preventDefault();}}}
WebInspector.DebuggerWorkspaceBinding.TargetData=function(debuggerModel,debuggerWorkspaceBinding)
{this._target=debuggerModel.target();this.scriptDataMap=new Map();this.callFrameLocations=new Set();var workspace=debuggerWorkspaceBinding._workspace;var networkMapping=debuggerWorkspaceBinding._networkMapping;this._defaultMapping=new WebInspector.DefaultScriptMapping(debuggerModel,workspace,debuggerWorkspaceBinding);this._resourceMapping=new WebInspector.ResourceScriptMapping(debuggerModel,workspace,networkMapping,debuggerWorkspaceBinding);this._compilerMapping=new WebInspector.CompilerScriptMapping(debuggerModel,workspace,networkMapping,WebInspector.NetworkProject.forTarget(this._target),debuggerWorkspaceBinding);this._uiSourceCodeToSourceMapping=new Map();debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource,this._parsedScriptSource,this);debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.FailedToParseScriptSource,this._parsedScriptSource,this);}
WebInspector.DebuggerWorkspaceBinding.TargetData.prototype={_parsedScriptSource:function(event)
{var script=(event.data);this._defaultMapping.addScript(script);this._resourceMapping.addScript(script);if(WebInspector.moduleSetting("jsSourceMapsEnabled").get())
this._compilerMapping.addScript(script);},_setSourceMapping:function(uiSourceCode,sourceMapping)
{if(this._uiSourceCodeToSourceMapping.get(uiSourceCode)===sourceMapping)
return;if(sourceMapping)
this._uiSourceCodeToSourceMapping.set(uiSourceCode,sourceMapping);else
this._uiSourceCodeToSourceMapping.remove(uiSourceCode);uiSourceCode.dispatchEventToListeners(WebInspector.UISourceCode.Events.SourceMappingChanged,{target:this._target,isIdentity:sourceMapping?sourceMapping.isIdentity():false});},_uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
{var sourceMapping=this._uiSourceCodeToSourceMapping.get(uiSourceCode);return sourceMapping?sourceMapping.uiLocationToRawLocation(uiSourceCode,lineNumber,columnNumber):null;},_uiLineHasMapping:function(uiSourceCode,lineNumber)
{var sourceMapping=this._uiSourceCodeToSourceMapping.get(uiSourceCode);return sourceMapping?sourceMapping.uiLineHasMapping(uiSourceCode,lineNumber):true;},_uiSourceCodeRemoved:function(uiSourceCode)
{this._uiSourceCodeToSourceMapping.remove(uiSourceCode);},_dispose:function()
{this._compilerMapping.dispose();this._resourceMapping.dispose();this._defaultMapping.dispose();this._uiSourceCodeToSourceMapping.clear();}}
WebInspector.DebuggerWorkspaceBinding.ScriptInfo=function(script)
{this._script=script;this._sourceMappings=[];this._locations=new Set();}
WebInspector.DebuggerWorkspaceBinding.ScriptInfo.prototype={_pushSourceMapping:function(sourceMapping)
{this._sourceMappings.push(sourceMapping);this._updateLocations();},_popSourceMapping:function()
{var sourceMapping=this._sourceMappings.pop();this._updateLocations();return sourceMapping;},_addLocation:function(location)
{this._locations.add(location);location.update();},_removeLocation:function(location)
{this._locations.delete(location);},_updateLocations:function()
{for(var location of this._locations)
location.update();},_rawLocationToUILocation:function(rawLocation)
{var uiLocation;for(var i=this._sourceMappings.length-1;!uiLocation&&i>=0;--i)
uiLocation=this._sourceMappings[i].rawLocationToUILocation(rawLocation);console.assert(uiLocation,"Script raw location cannot be mapped to any UI location.");return(uiLocation);}}
WebInspector.DebuggerWorkspaceBinding.Location=function(script,rawLocation,binding,updateDelegate)
{WebInspector.LiveLocation.call(this,updateDelegate);this._script=script;this._rawLocation=rawLocation;this._binding=binding;}
WebInspector.DebuggerWorkspaceBinding.Location.prototype={uiLocation:function()
{var debuggerModelLocation=this._rawLocation;return this._binding.rawLocationToUILocation(debuggerModelLocation);},dispose:function()
{WebInspector.LiveLocation.prototype.dispose.call(this);this._binding._removeLiveLocation(this);},__proto__:WebInspector.LiveLocation.prototype}
WebInspector.DebuggerSourceMapping=function()
{}
WebInspector.DebuggerSourceMapping.prototype={rawLocationToUILocation:function(rawLocation){},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber){},isIdentity:function(){},uiLineHasMapping:function(uiSourceCode,lineNumber){}}
WebInspector.debuggerWorkspaceBinding;;WebInspector.BreakpointManager=function(breakpointsSetting,workspace,networkMapping,targetManager,debuggerWorkspaceBinding)
{this._storage=new WebInspector.BreakpointManager.Storage(this,breakpointsSetting);this._workspace=workspace;this._networkMapping=networkMapping;this._targetManager=targetManager;this._debuggerWorkspaceBinding=debuggerWorkspaceBinding;this._breakpointsActive=true;this._breakpointsForUISourceCode=new Map();this._breakpointsForPrimaryUISourceCode=new Map();this._provisionalBreakpoints=new Multimap();this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved,this._projectRemoved,this);this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAdded,this);this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved,this._uiSourceCodeRemoved,this);}
WebInspector.BreakpointManager.Events={BreakpointAdded:"breakpoint-added",BreakpointRemoved:"breakpoint-removed",BreakpointsActiveStateChanged:"BreakpointsActiveStateChanged"}
WebInspector.BreakpointManager._breakpointStorageId=function(sourceFileId,lineNumber,columnNumber)
{if(!sourceFileId)
return"";return sourceFileId+":"+lineNumber+":"+columnNumber;}
WebInspector.BreakpointManager.prototype={_sourceFileId:function(uiSourceCode)
{var networkURL=this._networkMapping.networkURL(uiSourceCode)
if(!networkURL)
return"";return uiSourceCode.url();},targetAdded:function(target)
{var debuggerModel=WebInspector.DebuggerModel.fromTarget(target);if(debuggerModel&&!this._breakpointsActive)
debuggerModel.setBreakpointsActive(this._breakpointsActive);},targetRemoved:function(target){},_provisionalBreakpointsForSourceFileId:function(sourceFileId)
{var result=new Map();var breakpoints=this._provisionalBreakpoints.get(sourceFileId).valuesArray();for(var i=0;i<breakpoints.length;++i)
result.set(breakpoints[i]._breakpointStorageId(),breakpoints[i]);return result;},removeProvisionalBreakpointsForTest:function()
{var breakpoints=this._provisionalBreakpoints.valuesArray();for(var i=0;i<breakpoints.length;++i)
breakpoints[i].remove();this._provisionalBreakpoints.clear();},_restoreBreakpoints:function(uiSourceCode)
{var sourceFileId=this._sourceFileId(uiSourceCode);if(!sourceFileId)
return;this._storage.mute();var breakpointItems=this._storage.breakpointItems(this._sourceFileId(uiSourceCode));var provisionalBreakpoints=this._provisionalBreakpointsForSourceFileId(sourceFileId);for(var i=0;i<breakpointItems.length;++i){var breakpointItem=breakpointItems[i];var itemStorageId=WebInspector.BreakpointManager._breakpointStorageId(breakpointItem.sourceFileId,breakpointItem.lineNumber,breakpointItem.columnNumber);var provisionalBreakpoint=provisionalBreakpoints.get(itemStorageId);if(provisionalBreakpoint){if(!this._breakpointsForPrimaryUISourceCode.get(uiSourceCode))
this._breakpointsForPrimaryUISourceCode.set(uiSourceCode,[]);this._breakpointsForPrimaryUISourceCode.get(uiSourceCode).push(provisionalBreakpoint);provisionalBreakpoint._updateBreakpoint();}else{this._innerSetBreakpoint(uiSourceCode,breakpointItem.lineNumber,breakpointItem.columnNumber,breakpointItem.condition,breakpointItem.enabled);}}
this._provisionalBreakpoints.removeAll(sourceFileId);this._storage.unmute();},_uiSourceCodeAdded:function(event)
{var uiSourceCode=(event.data);this._restoreBreakpoints(uiSourceCode);if(uiSourceCode.contentType().hasScripts())
uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.SourceMappingChanged,this._uiSourceCodeMappingChanged,this);},_uiSourceCodeRemoved:function(event)
{var uiSourceCode=(event.data);this._removeUISourceCode(uiSourceCode);},_uiSourceCodeMappingChanged:function(event)
{var uiSourceCode=(event.target);var isIdentity=(event.data.isIdentity);var target=(event.data.target);if(isIdentity)
return;var breakpoints=this._breakpointsForPrimaryUISourceCode.get(uiSourceCode)||[];for(var i=0;i<breakpoints.length;++i)
breakpoints[i]._updateInDebuggerForTarget(target);},_removeUISourceCode:function(uiSourceCode)
{var breakpoints=this._breakpointsForPrimaryUISourceCode.get(uiSourceCode)||[];var sourceFileId=this._sourceFileId(uiSourceCode);for(var i=0;i<breakpoints.length;++i){breakpoints[i]._resetLocations();if(breakpoints[i].enabled())
this._provisionalBreakpoints.set(sourceFileId,breakpoints[i]);}
uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.SourceMappingChanged,this._uiSourceCodeMappingChanged,this);this._breakpointsForPrimaryUISourceCode.remove(uiSourceCode);},setBreakpoint:function(uiSourceCode,lineNumber,columnNumber,condition,enabled)
{var uiLocation=new WebInspector.UILocation(uiSourceCode,lineNumber,columnNumber);var normalizedLocation=this._debuggerWorkspaceBinding.normalizeUILocation(uiLocation);if(normalizedLocation.id()!==uiLocation.id()){WebInspector.Revealer.reveal(normalizedLocation);uiLocation=normalizedLocation;}
this.setBreakpointsActive(true);return this._innerSetBreakpoint(uiLocation.uiSourceCode,uiLocation.lineNumber,uiLocation.columnNumber,condition,enabled);},_innerSetBreakpoint:function(uiSourceCode,lineNumber,columnNumber,condition,enabled)
{var breakpoint=this.findBreakpoint(uiSourceCode,lineNumber,columnNumber);if(breakpoint){breakpoint._updateState(condition,enabled);return breakpoint;}
var projectId=uiSourceCode.project().id();var path=uiSourceCode.url();var sourceFileId=this._sourceFileId(uiSourceCode);breakpoint=new WebInspector.BreakpointManager.Breakpoint(this,projectId,path,sourceFileId,lineNumber,columnNumber,condition,enabled);if(!this._breakpointsForPrimaryUISourceCode.get(uiSourceCode))
this._breakpointsForPrimaryUISourceCode.set(uiSourceCode,[]);this._breakpointsForPrimaryUISourceCode.get(uiSourceCode).push(breakpoint);return breakpoint;},findBreakpoint:function(uiSourceCode,lineNumber,columnNumber)
{var breakpoints=this._breakpointsForUISourceCode.get(uiSourceCode);var lineBreakpoints=breakpoints?breakpoints.get(String(lineNumber)):null;var columnBreakpoints=lineBreakpoints?lineBreakpoints.get(String(columnNumber)):null;return columnBreakpoints?columnBreakpoints[0]:null;},findBreakpointOnLine:function(uiSourceCode,lineNumber)
{var breakpoints=this._breakpointsForUISourceCode.get(uiSourceCode);var lineBreakpoints=breakpoints?breakpoints.get(String(lineNumber)):null;return lineBreakpoints?lineBreakpoints.valuesArray()[0][0]:null;},breakpointsForUISourceCode:function(uiSourceCode)
{var result=[];var uiSourceCodeBreakpoints=this._breakpointsForUISourceCode.get(uiSourceCode);var breakpoints=uiSourceCodeBreakpoints?uiSourceCodeBreakpoints.valuesArray():[];for(var i=0;i<breakpoints.length;++i){var lineBreakpoints=breakpoints[i];var columnBreakpointArrays=lineBreakpoints?lineBreakpoints.valuesArray():[];result=result.concat.apply(result,columnBreakpointArrays);}
return result;},allBreakpoints:function()
{var result=[];var uiSourceCodes=this._breakpointsForUISourceCode.keysArray();for(var i=0;i<uiSourceCodes.length;++i)
result=result.concat(this.breakpointsForUISourceCode(uiSourceCodes[i]));return result;},breakpointLocationsForUISourceCode:function(uiSourceCode)
{var uiSourceCodeBreakpoints=this._breakpointsForUISourceCode.get(uiSourceCode);var lineNumbers=uiSourceCodeBreakpoints?uiSourceCodeBreakpoints.keysArray():[];var result=[];for(var i=0;i<lineNumbers.length;++i){var lineBreakpoints=uiSourceCodeBreakpoints.get(lineNumbers[i]);var columnNumbers=lineBreakpoints.keysArray();for(var j=0;j<columnNumbers.length;++j){var columnBreakpoints=lineBreakpoints.get(columnNumbers[j]);var lineNumber=parseInt(lineNumbers[i],10);var columnNumber=parseInt(columnNumbers[j],10);for(var k=0;k<columnBreakpoints.length;++k){var breakpoint=columnBreakpoints[k];var uiLocation=uiSourceCode.uiLocation(lineNumber,columnNumber);result.push({breakpoint:breakpoint,uiLocation:uiLocation});}}}
return result;},allBreakpointLocations:function()
{var result=[];var uiSourceCodes=this._breakpointsForUISourceCode.keysArray();for(var i=0;i<uiSourceCodes.length;++i)
result=result.concat(this.breakpointLocationsForUISourceCode(uiSourceCodes[i]));return result;},toggleAllBreakpoints:function(toggleState)
{var breakpoints=this.allBreakpoints();for(var i=0;i<breakpoints.length;++i)
breakpoints[i].setEnabled(toggleState);},removeAllBreakpoints:function()
{var breakpoints=this.allBreakpoints();for(var i=0;i<breakpoints.length;++i)
breakpoints[i].remove();},_projectRemoved:function(event)
{var project=(event.data);var uiSourceCodes=project.uiSourceCodes();for(var i=0;i<uiSourceCodes.length;++i)
this._removeUISourceCode(uiSourceCodes[i]);},_removeBreakpoint:function(breakpoint,removeFromStorage)
{var uiSourceCode=breakpoint.uiSourceCode();var breakpoints=uiSourceCode?this._breakpointsForPrimaryUISourceCode.get(uiSourceCode)||[]:[];breakpoints.remove(breakpoint);if(removeFromStorage)
this._storage._removeBreakpoint(breakpoint);this._provisionalBreakpoints.remove(breakpoint._sourceFileId,breakpoint);},_uiLocationAdded:function(breakpoint,uiLocation)
{var breakpoints=this._breakpointsForUISourceCode.get(uiLocation.uiSourceCode);if(!breakpoints){breakpoints=new Map();this._breakpointsForUISourceCode.set(uiLocation.uiSourceCode,breakpoints);}
var lineBreakpoints=breakpoints.get(String(uiLocation.lineNumber));if(!lineBreakpoints){lineBreakpoints=new Map();breakpoints.set(String(uiLocation.lineNumber),lineBreakpoints);}
var columnBreakpoints=lineBreakpoints.get(String(uiLocation.columnNumber));if(!columnBreakpoints){columnBreakpoints=[];lineBreakpoints.set(String(uiLocation.columnNumber),columnBreakpoints);}
columnBreakpoints.push(breakpoint);this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.BreakpointAdded,{breakpoint:breakpoint,uiLocation:uiLocation});},_uiLocationRemoved:function(breakpoint,uiLocation)
{var breakpoints=this._breakpointsForUISourceCode.get(uiLocation.uiSourceCode);if(!breakpoints)
return;var lineBreakpoints=breakpoints.get(String(uiLocation.lineNumber));if(!lineBreakpoints)
return;var columnBreakpoints=lineBreakpoints.get(String(uiLocation.columnNumber));if(!columnBreakpoints)
return;columnBreakpoints.remove(breakpoint);if(!columnBreakpoints.length)
lineBreakpoints.remove(String(uiLocation.columnNumber));if(!lineBreakpoints.size)
breakpoints.remove(String(uiLocation.lineNumber));if(!breakpoints.size)
this._breakpointsForUISourceCode.remove(uiLocation.uiSourceCode);this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.BreakpointRemoved,{breakpoint:breakpoint,uiLocation:uiLocation});},setBreakpointsActive:function(active)
{if(this._breakpointsActive===active)
return;this._breakpointsActive=active;var debuggerModels=WebInspector.DebuggerModel.instances();for(var i=0;i<debuggerModels.length;++i)
debuggerModels[i].setBreakpointsActive(active);this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.BreakpointsActiveStateChanged,active);},breakpointsActive:function()
{return this._breakpointsActive;},__proto__:WebInspector.Object.prototype}
WebInspector.BreakpointManager.Breakpoint=function(breakpointManager,projectId,path,sourceFileId,lineNumber,columnNumber,condition,enabled)
{this._breakpointManager=breakpointManager;this._projectId=projectId;this._path=path;this._lineNumber=lineNumber;this._columnNumber=columnNumber;this._sourceFileId=sourceFileId;this._numberOfDebuggerLocationForUILocation={};this._condition;this._enabled;this._isRemoved;this._fakePrimaryLocation;this._currentState=null;this._targetBreakpoints=new Map();this._updateState(condition,enabled);this._breakpointManager._targetManager.observeTargets(this);}
WebInspector.BreakpointManager.Breakpoint.prototype={targetAdded:function(target)
{var debuggerModel=WebInspector.DebuggerModel.fromTarget(target);if(!debuggerModel)
return;var networkMapping=this._breakpointManager._networkMapping;var debuggerWorkspaceBinding=this._breakpointManager._debuggerWorkspaceBinding;this._targetBreakpoints.set(target,new WebInspector.BreakpointManager.TargetBreakpoint(debuggerModel,this,networkMapping,debuggerWorkspaceBinding));},targetRemoved:function(target)
{var debuggerModel=WebInspector.DebuggerModel.fromTarget(target);if(!debuggerModel)
return;var targetBreakpoint=this._targetBreakpoints.remove(target);targetBreakpoint._cleanUpAfterDebuggerIsGone();targetBreakpoint._removeEventListeners();},projectId:function()
{return this._projectId;},path:function()
{return this._path;},lineNumber:function()
{return this._lineNumber;},columnNumber:function()
{return this._columnNumber;},uiSourceCode:function()
{return this._breakpointManager._workspace.uiSourceCode(this._projectId,this._path);},_replaceUILocation:function(oldUILocation,newUILocation)
{if(this._isRemoved)
return;this._removeUILocation(oldUILocation,true);this._removeFakeBreakpointAtPrimaryLocation();if(!this._numberOfDebuggerLocationForUILocation[newUILocation.id()])
this._numberOfDebuggerLocationForUILocation[newUILocation.id()]=0;if(++this._numberOfDebuggerLocationForUILocation[newUILocation.id()]===1)
this._breakpointManager._uiLocationAdded(this,newUILocation);},_removeUILocation:function(uiLocation,muteCreationFakeBreakpoint)
{if(!uiLocation||--this._numberOfDebuggerLocationForUILocation[uiLocation.id()]!==0)
return;delete this._numberOfDebuggerLocationForUILocation[uiLocation.id()];this._breakpointManager._uiLocationRemoved(this,uiLocation);if(!muteCreationFakeBreakpoint)
this._fakeBreakpointAtPrimaryLocation();},enabled:function()
{return this._enabled;},setEnabled:function(enabled)
{this._updateState(this._condition,enabled);},condition:function()
{return this._condition;},setCondition:function(condition)
{this._updateState(condition,this._enabled);},_updateState:function(condition,enabled)
{if(this._enabled===enabled&&this._condition===condition)
return;this._enabled=enabled;this._condition=condition;this._breakpointManager._storage._updateBreakpoint(this);this._updateBreakpoint();},_updateBreakpoint:function()
{this._removeFakeBreakpointAtPrimaryLocation();this._fakeBreakpointAtPrimaryLocation();var targetBreakpoints=this._targetBreakpoints.valuesArray();for(var i=0;i<targetBreakpoints.length;++i)
targetBreakpoints[i]._scheduleUpdateInDebugger();},remove:function(keepInStorage)
{this._isRemoved=true;var removeFromStorage=!keepInStorage;this._removeFakeBreakpointAtPrimaryLocation();var targetBreakpoints=this._targetBreakpoints.valuesArray();for(var i=0;i<targetBreakpoints.length;++i){targetBreakpoints[i]._scheduleUpdateInDebugger();targetBreakpoints[i]._removeEventListeners();}
this._breakpointManager._removeBreakpoint(this,removeFromStorage);this._breakpointManager._targetManager.unobserveTargets(this);},_updateInDebuggerForTarget:function(target)
{this._targetBreakpoints.get(target)._scheduleUpdateInDebugger();},_breakpointStorageId:function()
{return WebInspector.BreakpointManager._breakpointStorageId(this._sourceFileId,this._lineNumber,this._columnNumber);},_fakeBreakpointAtPrimaryLocation:function()
{if(this._isRemoved||!Object.isEmpty(this._numberOfDebuggerLocationForUILocation)||this._fakePrimaryLocation)
return;var uiSourceCode=this._breakpointManager._workspace.uiSourceCode(this._projectId,this._path);if(!uiSourceCode)
return;this._fakePrimaryLocation=uiSourceCode.uiLocation(this._lineNumber,this._columnNumber);if(this._fakePrimaryLocation)
this._breakpointManager._uiLocationAdded(this,this._fakePrimaryLocation);},_removeFakeBreakpointAtPrimaryLocation:function()
{if(this._fakePrimaryLocation){this._breakpointManager._uiLocationRemoved(this,this._fakePrimaryLocation);delete this._fakePrimaryLocation;}},_resetLocations:function()
{this._removeFakeBreakpointAtPrimaryLocation();var targetBreakpoints=this._targetBreakpoints.valuesArray();for(var i=0;i<targetBreakpoints.length;++i)
targetBreakpoints[i]._resetLocations();}}
WebInspector.BreakpointManager.TargetBreakpoint=function(debuggerModel,breakpoint,networkMapping,debuggerWorkspaceBinding)
{WebInspector.SDKObject.call(this,debuggerModel.target());this._debuggerModel=debuggerModel;this._breakpoint=breakpoint;this._networkMapping=networkMapping;this._debuggerWorkspaceBinding=debuggerWorkspaceBinding;this._liveLocations=[];this._uiLocations={};this._debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerWasDisabled,this._cleanUpAfterDebuggerIsGone,this);this._debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerWasEnabled,this._scheduleUpdateInDebugger,this);this._hasPendingUpdate=false;this._isUpdating=false;this._cancelCallback=false;this._currentState=null;if(this._debuggerModel.debuggerEnabled())
this._scheduleUpdateInDebugger();}
WebInspector.BreakpointManager.TargetBreakpoint.prototype={_resetLocations:function()
{var uiLocations=Object.values(this._uiLocations);for(var i=0;i<uiLocations.length;++i)
this._breakpoint._removeUILocation(uiLocations[i]);this._uiLocations={};for(var i=0;i<this._liveLocations.length;++i)
this._liveLocations[i].dispose();this._liveLocations=[];},_scheduleUpdateInDebugger:function()
{if(this._isUpdating){this._hasPendingUpdate=true;return;}
this._isUpdating=true;this._updateInDebugger(this._didUpdateInDebugger.bind(this));},_didUpdateInDebugger:function()
{this._isUpdating=false;if(this._hasPendingUpdate){this._hasPendingUpdate=false;this._scheduleUpdateInDebugger();}},_scriptDiverged:function()
{var uiSourceCode=this._breakpoint.uiSourceCode();if(!uiSourceCode)
return false;var scriptFile=this._debuggerWorkspaceBinding.scriptFile(uiSourceCode,this.target());return!!scriptFile&&scriptFile.hasDivergedFromVM();},_updateInDebugger:function(callback)
{if(this.target().isDetached()){this._cleanUpAfterDebuggerIsGone();callback();return;}
var uiSourceCode=this._breakpoint.uiSourceCode();var lineNumber=this._breakpoint._lineNumber;var columnNumber=this._breakpoint._columnNumber;var condition=this._breakpoint.condition();var debuggerLocation=uiSourceCode?this._debuggerWorkspaceBinding.uiLocationToRawLocation(this.target(),uiSourceCode,lineNumber,columnNumber):null;var newState;if(this._breakpoint._isRemoved||!this._breakpoint.enabled()||this._scriptDiverged())
newState=null;else if(debuggerLocation){var script=debuggerLocation.script();if(script.sourceURL)
newState=new WebInspector.BreakpointManager.Breakpoint.State(script.sourceURL,null,debuggerLocation.lineNumber,debuggerLocation.columnNumber,condition);else
newState=new WebInspector.BreakpointManager.Breakpoint.State(null,debuggerLocation.scriptId,debuggerLocation.lineNumber,debuggerLocation.columnNumber,condition);}else if(this._breakpoint._currentState&&this._breakpoint._currentState.url){var position=this._breakpoint._currentState;newState=new WebInspector.BreakpointManager.Breakpoint.State(position.url,null,position.lineNumber,position.columnNumber,condition);}else if(uiSourceCode){var networkURL=this._networkMapping.networkURL(uiSourceCode);if(networkURL)
newState=new WebInspector.BreakpointManager.Breakpoint.State(networkURL,null,lineNumber,columnNumber,condition);}
if(this._debuggerId&&WebInspector.BreakpointManager.Breakpoint.State.equals(newState,this._currentState)){callback();return;}
this._breakpoint._currentState=newState;if(this._debuggerId){this._resetLocations();this._debuggerModel.removeBreakpoint(this._debuggerId,this._didRemoveFromDebugger.bind(this,callback));this._scheduleUpdateInDebugger();this._currentState=null;return;}
if(!newState){callback();return;}
var updateCallback=this._didSetBreakpointInDebugger.bind(this,callback);if(newState.url)
this._debuggerModel.setBreakpointByURL(newState.url,newState.lineNumber,newState.columnNumber,this._breakpoint.condition(),updateCallback);else if(newState.scriptId)
this._debuggerModel.setBreakpointBySourceId((debuggerLocation),condition,updateCallback);this._currentState=newState;},_didSetBreakpointInDebugger:function(callback,breakpointId,locations)
{if(this._cancelCallback){this._cancelCallback=false;callback();return;}
if(!breakpointId){this._breakpoint.remove(true);callback();return;}
this._debuggerId=breakpointId;this._debuggerModel.addBreakpointListener(this._debuggerId,this._breakpointResolved,this);for(var i=0;i<locations.length;++i){if(!this._addResolvedLocation(locations[i]))
break;}
callback();},_didRemoveFromDebugger:function(callback)
{if(this._cancelCallback){this._cancelCallback=false;callback();return;}
this._resetLocations();this._debuggerModel.removeBreakpointListener(this._debuggerId,this._breakpointResolved,this);delete this._debuggerId;callback();},_breakpointResolved:function(event)
{this._addResolvedLocation((event.data));},_locationUpdated:function(location,uiLocation)
{var oldUILocation=this._uiLocations[location.id()]||null;this._uiLocations[location.id()]=uiLocation;this._breakpoint._replaceUILocation(oldUILocation,uiLocation);},_addResolvedLocation:function(location)
{var uiLocation=this._debuggerWorkspaceBinding.rawLocationToUILocation(location);var breakpoint=this._breakpoint._breakpointManager.findBreakpoint(uiLocation.uiSourceCode,uiLocation.lineNumber,uiLocation.columnNumber);if(breakpoint&&breakpoint!==this._breakpoint){this._breakpoint.remove();return false;}
this._liveLocations.push(this._debuggerWorkspaceBinding.createLiveLocation(location,this._locationUpdated.bind(this,location)));return true;},_cleanUpAfterDebuggerIsGone:function()
{if(this._isUpdating)
this._cancelCallback=true;this._resetLocations();this._currentState=null;if(this._debuggerId)
this._didRemoveFromDebugger(function(){});},_removeEventListeners:function()
{this._debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.DebuggerWasDisabled,this._cleanUpAfterDebuggerIsGone,this);this._debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.DebuggerWasEnabled,this._scheduleUpdateInDebugger,this);},__proto__:WebInspector.SDKObject.prototype}
WebInspector.BreakpointManager.Breakpoint.State=function(url,scriptId,lineNumber,columnNumber,condition)
{this.url=url;this.scriptId=scriptId;this.lineNumber=lineNumber;this.columnNumber=columnNumber;this.condition=condition;}
WebInspector.BreakpointManager.Breakpoint.State.equals=function(stateA,stateB)
{if(!stateA||!stateB)
return false;if(stateA.scriptId||stateB.scriptId)
return false;return stateA.url===stateB.url&&stateA.lineNumber===stateB.lineNumber&&stateA.columnNumber===stateB.columnNumber&&stateA.condition===stateB.condition;}
WebInspector.BreakpointManager.Storage=function(breakpointManager,setting)
{this._breakpointManager=breakpointManager;this._setting=setting||WebInspector.settings.createLocalSetting("breakpoints",[]);var breakpoints=this._setting.get();this._breakpoints={};for(var i=0;i<breakpoints.length;++i){var breakpoint=(breakpoints[i]);breakpoint.columnNumber=breakpoint.columnNumber||0;this._breakpoints[breakpoint.sourceFileId+":"+breakpoint.lineNumber+":"+breakpoint.columnNumber]=breakpoint;}}
WebInspector.BreakpointManager.Storage.prototype={mute:function()
{this._muted=true;},unmute:function()
{delete this._muted;},breakpointItems:function(sourceFileId)
{var result=[];for(var id in this._breakpoints){var breakpoint=this._breakpoints[id];if(breakpoint.sourceFileId===sourceFileId)
result.push(breakpoint);}
return result;},_updateBreakpoint:function(breakpoint)
{if(this._muted||!breakpoint._breakpointStorageId())
return;this._breakpoints[breakpoint._breakpointStorageId()]=new WebInspector.BreakpointManager.Storage.Item(breakpoint);this._save();},_removeBreakpoint:function(breakpoint)
{if(this._muted)
return;delete this._breakpoints[breakpoint._breakpointStorageId()];this._save();},_save:function()
{var breakpointsArray=[];for(var id in this._breakpoints)
breakpointsArray.push(this._breakpoints[id]);this._setting.set(breakpointsArray);}}
WebInspector.BreakpointManager.Storage.Item=function(breakpoint)
{this.sourceFileId=breakpoint._sourceFileId;this.lineNumber=breakpoint.lineNumber();this.columnNumber=breakpoint.columnNumber();this.condition=breakpoint.condition();this.enabled=breakpoint.enabled();}
WebInspector.breakpointManager;;WebInspector.ContentProviderBasedProject=function(workspace,id,type,displayName)
{WebInspector.ProjectStore.call(this,workspace,id,type,displayName);this._contentProviders={};workspace.addProject(this);}
WebInspector.ContentProviderBasedProject.prototype={requestFileContent:function(uiSourceCode,callback)
{var contentProvider=this._contentProviders[uiSourceCode.url()];contentProvider.requestContent(callback);function innerCallback(content,encoded,mimeType)
{callback(content);}},canSetFileContent:function()
{return false;},setFileContent:function(uiSourceCode,newContent,callback)
{callback(null);},canRename:function()
{return false;},rename:function(uiSourceCode,newName,callback)
{var path=uiSourceCode.url();this.performRename(path,newName,innerCallback.bind(this));function innerCallback(success,newName)
{if(success&&newName){var copyOfPath=path.split("/");copyOfPath[copyOfPath.length-1]=newName;var newPath=copyOfPath.join("/");this._contentProviders[newPath]=this._contentProviders[path];delete this._contentProviders[path];this.renameUISourceCode(uiSourceCode,newName);}
callback(success,newName);}},refresh:function(path,callback)
{if(callback)
callback();},excludeFolder:function(path)
{},createFile:function(path,name,content,callback)
{},deleteFile:function(path)
{},remove:function()
{},performRename:function(path,newName,callback)
{callback(false);},searchInFileContent:function(uiSourceCode,query,caseSensitive,isRegex,callback)
{var contentProvider=this._contentProviders[uiSourceCode.url()];contentProvider.searchInContent(query,caseSensitive,isRegex,callback);},findFilesMatchingSearchRequest:function(searchConfig,filesMathingFileQuery,progress,callback)
{var result=[];var paths=filesMathingFileQuery;var totalCount=paths.length;if(totalCount===0){setTimeout(doneCallback,0);return;}
var barrier=new CallbackBarrier();progress.setTotalWork(paths.length);for(var i=0;i<paths.length;++i)
searchInContent.call(this,paths[i],barrier.createCallback(searchInContentCallback.bind(null,paths[i])));barrier.callWhenDone(doneCallback);function searchInContent(path,callback)
{var queriesToRun=searchConfig.queries().slice();searchNextQuery.call(this);function searchNextQuery()
{if(!queriesToRun.length){callback(true);return;}
var query=queriesToRun.shift();this._contentProviders[path].searchInContent(query,!searchConfig.ignoreCase(),searchConfig.isRegex(),contentCallback.bind(this));}
function contentCallback(searchMatches)
{if(!searchMatches.length){callback(false);return;}
searchNextQuery.call(this);}}
function searchInContentCallback(path,matches)
{if(matches)
result.push(path);progress.worked(1);}
function doneCallback()
{callback(result);progress.done();}},indexContent:function(progress)
{setImmediate(progress.done.bind(progress));},addUISourceCodeWithProvider:function(uiSourceCode,contentProvider)
{this._contentProviders[uiSourceCode.url()]=contentProvider;this.addUISourceCode(uiSourceCode,true);},addContentProvider:function(url,contentProvider)
{var uiSourceCode=this.createUISourceCode(url,contentProvider.contentType());this.addUISourceCodeWithProvider(uiSourceCode,contentProvider);return uiSourceCode;},removeFile:function(path)
{delete this._contentProviders[path];this.removeUISourceCode(path);},reset:function()
{this._contentProviders={};this.removeProject();this.workspace().addProject(this);},dispose:function()
{this._contentProviders={};this.removeProject();},__proto__:WebInspector.ProjectStore.prototype};WebInspector.DefaultScriptMapping=function(debuggerModel,workspace,debuggerWorkspaceBinding)
{this._debuggerModel=debuggerModel;this._debuggerWorkspaceBinding=debuggerWorkspaceBinding;this._workspace=workspace;this._projectId=WebInspector.DefaultScriptMapping.projectIdForTarget(debuggerModel.target());this._project=new WebInspector.ContentProviderBasedProject(this._workspace,this._projectId,WebInspector.projectTypes.Debugger,"");debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._debuggerReset,this);this._debuggerReset();}
WebInspector.DefaultScriptMapping.prototype={rawLocationToUILocation:function(rawLocation)
{var debuggerModelLocation=(rawLocation);var script=debuggerModelLocation.script();var uiSourceCode=this._uiSourceCodeForScriptId.get(script.scriptId);var lineNumber=debuggerModelLocation.lineNumber-(script.isInlineScriptWithSourceURL()?script.lineOffset:0);var columnNumber=debuggerModelLocation.columnNumber||0;if(script.isInlineScriptWithSourceURL()&&!lineNumber&&columnNumber)
columnNumber-=script.columnOffset;return uiSourceCode.uiLocation(lineNumber,columnNumber);},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
{var scriptId=this._scriptIdForUISourceCode.get(uiSourceCode);var script=this._debuggerModel.scriptForId(scriptId);if(script.isInlineScriptWithSourceURL())
return this._debuggerModel.createRawLocation(script,lineNumber+script.lineOffset,lineNumber?columnNumber:columnNumber+script.columnOffset);return this._debuggerModel.createRawLocation(script,lineNumber,columnNumber);},addScript:function(script)
{var splitURL=WebInspector.ParsedURL.splitURLIntoPathComponents(script.sourceURL);var url=splitURL[splitURL.length-1];url="debugger:///VM"+script.scriptId+(url?" "+url:"");var uiSourceCode=this._project.createUISourceCode(url,WebInspector.resourceTypes.Script);this._uiSourceCodeForScriptId.set(script.scriptId,uiSourceCode);this._scriptIdForUISourceCode.set(uiSourceCode,script.scriptId);this._project.addUISourceCodeWithProvider(uiSourceCode,script);this._debuggerWorkspaceBinding.setSourceMapping(this._debuggerModel.target(),uiSourceCode,this);this._debuggerWorkspaceBinding.pushSourceMapping(script,this);},isIdentity:function()
{return true;},uiLineHasMapping:function(uiSourceCode,lineNumber)
{return true;},_debuggerReset:function()
{this._uiSourceCodeForScriptId=new Map();this._scriptIdForUISourceCode=new Map();this._project.reset();},dispose:function()
{this._project.dispose();}}
WebInspector.DefaultScriptMapping.projectIdForTarget=function(target)
{return"debugger:"+target.id();};WebInspector.FileSystemWorkspaceBinding=function(isolatedFileSystemManager,workspace)
{this._isolatedFileSystemManager=isolatedFileSystemManager;this._workspace=workspace;this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded,this._fileSystemAdded,this);this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved,this._fileSystemRemoved,this);this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemFilesChanged,this._fileSystemFilesChanged,this);this._boundFileSystems=new Map();}
WebInspector.FileSystemWorkspaceBinding._styleSheetExtensions=new Set(["css","scss","sass","less"]);WebInspector.FileSystemWorkspaceBinding._documentExtensions=new Set(["htm","html","asp","aspx","phtml","jsp"]);WebInspector.FileSystemWorkspaceBinding._scriptExtensions=new Set(["asp","aspx","c","cc","cljs","coffee","cpp","cs","dart","java","js","jsp","h","m","mm","py","sh","ts"]);WebInspector.FileSystemWorkspaceBinding._imageExtensions=WebInspector.IsolatedFileSystem.ImageExtensions;WebInspector.FileSystemWorkspaceBinding.projectId=function(fileSystemPath)
{return fileSystemPath;}
WebInspector.FileSystemWorkspaceBinding.relativePath=function(uiSourceCode)
{var baseURL=(uiSourceCode.project())._fileSystemBaseURL;return uiSourceCode.url().substring(baseURL.length).split("/");}
WebInspector.FileSystemWorkspaceBinding.completeURL=function(project,relativePath)
{var fsProject=(project);return fsProject._fileSystemBaseURL+relativePath;}
WebInspector.FileSystemWorkspaceBinding._contentTypeForExtension=function(extension)
{if(WebInspector.FileSystemWorkspaceBinding._styleSheetExtensions.has(extension))
return WebInspector.resourceTypes.Stylesheet;if(WebInspector.FileSystemWorkspaceBinding._documentExtensions.has(extension))
return WebInspector.resourceTypes.Document;if(WebInspector.FileSystemWorkspaceBinding._imageExtensions.has(extension))
return WebInspector.resourceTypes.Image;if(WebInspector.FileSystemWorkspaceBinding._scriptExtensions.has(extension))
return WebInspector.resourceTypes.Script;return WebInspector.resourceTypes.Other;}
WebInspector.FileSystemWorkspaceBinding.prototype={fileSystemManager:function()
{return this._isolatedFileSystemManager;},_fileSystemAdded:function(event)
{var fileSystem=(event.data);var boundFileSystem=new WebInspector.FileSystemWorkspaceBinding.FileSystem(this,fileSystem,this._workspace);this._boundFileSystems.set(fileSystem.path(),boundFileSystem);},_fileSystemRemoved:function(event)
{var fileSystem=(event.data);var boundFileSystem=this._boundFileSystems.get(fileSystem.path());boundFileSystem.dispose();this._boundFileSystems.remove(fileSystem.path());},_fileSystemFilesChanged:function(event)
{var paths=(event.data);for(var path of paths){for(var key of this._boundFileSystems.keys()){if(!path.startsWith(key))
continue;this._boundFileSystems.get(key)._fileChanged(path);}}},fileSystemPath:function(projectId)
{return projectId;},dispose:function()
{this._isolatedFileSystemManager.removeEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded,this._fileSystemAdded,this);this._isolatedFileSystemManager.removeEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved,this._fileSystemRemoved,this);this._isolatedFileSystemManager.dispose();for(var fileSystem of this._boundFileSystems.values()){fileSystem.dispose();this._boundFileSystems.remove(fileSystem._fileSystem.path());}}}
WebInspector.FileSystemWorkspaceBinding.FileSystem=function(fileSystemWorkspaceBinding,isolatedFileSystem,workspace)
{this._fileSystemWorkspaceBinding=fileSystemWorkspaceBinding;this._fileSystem=isolatedFileSystem;this._fileSystemBaseURL=this._fileSystem.path()+"/";this._fileSystemPath=this._fileSystem.path();var id=WebInspector.FileSystemWorkspaceBinding.projectId(this._fileSystemPath);console.assert(!workspace.project(id));var displayName=this._fileSystemPath.substr(this._fileSystemPath.lastIndexOf("/")+1);WebInspector.ProjectStore.call(this,workspace,id,WebInspector.projectTypes.FileSystem,displayName);workspace.addProject(this);this.populate();}
WebInspector.FileSystemWorkspaceBinding.FileSystem.prototype={fileSystemPath:function()
{return this._fileSystemPath;},_filePathForUISourceCode:function(uiSourceCode)
{return uiSourceCode.url().substring(this._fileSystemPath.length);},requestFileContent:function(uiSourceCode,callback)
{var filePath=this._filePathForUISourceCode(uiSourceCode);var isImage=WebInspector.FileSystemWorkspaceBinding._imageExtensions.has(WebInspector.TextUtils.extension(filePath));this._fileSystem.requestFileContent(filePath,isImage?base64CallbackWrapper:callback);function base64CallbackWrapper(result)
{if(!result){callback(result);return;}
var index=result.indexOf(",");callback(result.substring(index+1));}},canSetFileContent:function()
{return true;},setFileContent:function(uiSourceCode,newContent,callback)
{var filePath=this._filePathForUISourceCode(uiSourceCode);this._fileSystem.setFileContent(filePath,newContent,callback.bind(this,""));},canRename:function()
{return true;},rename:function(uiSourceCode,newName,callback)
{if(newName===uiSourceCode.name()){callback(true,uiSourceCode.name(),uiSourceCode.url(),uiSourceCode.contentType());return;}
var filePath=this._filePathForUISourceCode(uiSourceCode);this._fileSystem.renameFile(filePath,newName,innerCallback.bind(this));function innerCallback(success,newName)
{if(!success||!newName){callback(false,newName);return;}
console.assert(newName);var slash=filePath.lastIndexOf("/");var parentPath=filePath.substring(0,slash);filePath=parentPath+"/"+newName;filePath=filePath.substr(1);var extension=this._extensionForPath(newName);var newURL=this._fileSystemBaseURL+filePath;var newContentType=WebInspector.FileSystemWorkspaceBinding._contentTypeForExtension(extension);this.renameUISourceCode(uiSourceCode,newName);callback(true,newName,newURL,newContentType);}},searchInFileContent:function(uiSourceCode,query,caseSensitive,isRegex,callback)
{var filePath=this._filePathForUISourceCode(uiSourceCode);this._fileSystem.requestFileContent(filePath,contentCallback);function contentCallback(content)
{var result=[];if(content!==null)
result=WebInspector.ContentProvider.performSearchInContent(content,query,caseSensitive,isRegex);callback(result);}},findFilesMatchingSearchRequest:function(searchConfig,filesMathingFileQuery,progress,callback)
{var result=filesMathingFileQuery;var queriesToRun=searchConfig.queries().slice();if(!queriesToRun.length)
queriesToRun.push("");progress.setTotalWork(queriesToRun.length);searchNextQuery.call(this);function searchNextQuery()
{if(!queriesToRun.length){progress.done();callback(result);return;}
var query=queriesToRun.shift();this._fileSystem.searchInPath(searchConfig.isRegex()?"":query,progress,innerCallback.bind(this));}
function innerCallback(files)
{files=files.sort();progress.worked(1);result=result.intersectOrdered(files,String.naturalOrderComparator);searchNextQuery.call(this);}},indexContent:function(progress)
{this._fileSystem.indexContent(progress);},_extensionForPath:function(path)
{var extensionIndex=path.lastIndexOf(".");if(extensionIndex===-1)
return"";return path.substring(extensionIndex+1).toLowerCase();},populate:function()
{this._fileSystem.requestFilesRecursive("",this._addFile.bind(this));},refresh:function(path,callback)
{this._fileSystem.requestFilesRecursive(path,this._addFile.bind(this),callback);},excludeFolder:function(url)
{var relativeFolder=url.substring(this._fileSystemBaseURL.length);if(!relativeFolder.startsWith("/"))
relativeFolder="/"+relativeFolder;if(!relativeFolder.endsWith("/"))
relativeFolder+="/";this._fileSystem.addExcludedFolder(relativeFolder);var uiSourceCodes=this.uiSourceCodes().slice();for(var i=0;i<uiSourceCodes.length;++i){var uiSourceCode=uiSourceCodes[i];if(uiSourceCode.url().startsWith(url))
this.removeUISourceCode(uiSourceCode.url());}},createFile:function(path,name,content,callback)
{this._fileSystem.createFile(path,name,innerCallback.bind(this));var createFilePath;function innerCallback(filePath)
{if(!filePath){callback(null);return;}
createFilePath=filePath;if(!content){contentSet.call(this);return;}
this._fileSystem.setFileContent(filePath,content,contentSet.bind(this));}
function contentSet()
{callback(this._addFile(createFilePath));}},deleteFile:function(path)
{this._fileSystem.deleteFile(path);this.removeUISourceCode(path);},remove:function()
{this._fileSystemWorkspaceBinding._isolatedFileSystemManager.removeFileSystem(this._fileSystem);},_addFile:function(filePath)
{if(!filePath)
console.assert(false);var extension=this._extensionForPath(filePath);var contentType=WebInspector.FileSystemWorkspaceBinding._contentTypeForExtension(extension);var uiSourceCode=this.createUISourceCode(this._fileSystemBaseURL+filePath,contentType);this.addUISourceCode(uiSourceCode);return uiSourceCode;},_fileChanged:function(path)
{var uiSourceCode=this.uiSourceCodeForURL(path);if(!uiSourceCode){this._addFile(path);return;}
uiSourceCode.checkContentUpdated();},dispose:function()
{this.removeProject();},__proto__:WebInspector.ProjectStore.prototype};WebInspector.OutputStreamDelegate=function()
{}
WebInspector.OutputStreamDelegate.prototype={onTransferStarted:function(){},onTransferFinished:function(){},onChunkTransferred:function(reader){},onError:function(reader,event){},}
WebInspector.ChunkedReader=function()
{}
WebInspector.ChunkedReader.prototype={fileSize:function(){},loadedSize:function(){},fileName:function(){},cancel:function(){}}
WebInspector.ChunkedFileReader=function(file,chunkSize,delegate)
{this._file=file;this._fileSize=file.size;this._loadedSize=0;this._chunkSize=chunkSize;this._delegate=delegate;this._decoder=new TextDecoder();this._isCanceled=false;}
WebInspector.ChunkedFileReader.prototype={start:function(output)
{this._output=output;this._reader=new FileReader();this._reader.onload=this._onChunkLoaded.bind(this);this._reader.onerror=this._delegate.onError.bind(this._delegate,this);this._delegate.onTransferStarted();this._loadChunk();},cancel:function()
{this._isCanceled=true;},loadedSize:function()
{return this._loadedSize;},fileSize:function()
{return this._fileSize;},fileName:function()
{return this._file.name;},_onChunkLoaded:function(event)
{if(this._isCanceled)
return;if(event.target.readyState!==FileReader.DONE)
return;var buffer=event.target.result;this._loadedSize+=buffer.byteLength;var endOfFile=this._loadedSize===this._fileSize;var decodedString=this._decoder.decode(buffer,{stream:!endOfFile});this._output.write(decodedString);if(this._isCanceled)
return;this._delegate.onChunkTransferred(this);if(endOfFile){this._file=null;this._reader=null;this._output.close();this._delegate.onTransferFinished();return;}
this._loadChunk();},_loadChunk:function()
{var chunkStart=this._loadedSize;var chunkEnd=Math.min(this._fileSize,chunkStart+this._chunkSize);var nextPart=this._file.slice(chunkStart,chunkEnd);this._reader.readAsArrayBuffer(nextPart);}}
WebInspector.createFileSelectorElement=function(callback)
{var fileSelectorElement=createElement("input");fileSelectorElement.type="file";fileSelectorElement.style.display="none";fileSelectorElement.setAttribute("tabindex",-1);fileSelectorElement.onchange=onChange;function onChange(event)
{callback(fileSelectorElement.files[0]);};return fileSelectorElement;}
WebInspector.FileOutputStream=function()
{}
WebInspector.FileOutputStream.prototype={open:function(fileName,callback)
{this._closed=false;this._writeCallbacks=[];this._fileName=fileName;function callbackWrapper(accepted)
{if(accepted)
WebInspector.fileManager.addEventListener(WebInspector.FileManager.EventTypes.AppendedToURL,this._onAppendDone,this);callback(accepted);}
WebInspector.fileManager.save(this._fileName,"",true,callbackWrapper.bind(this));},write:function(data,callback)
{this._writeCallbacks.push(callback);WebInspector.fileManager.append(this._fileName,data);},close:function()
{this._closed=true;if(this._writeCallbacks.length)
return;WebInspector.fileManager.removeEventListener(WebInspector.FileManager.EventTypes.AppendedToURL,this._onAppendDone,this);WebInspector.fileManager.close(this._fileName);},_onAppendDone:function(event)
{if(event.data!==this._fileName)
return;var callback=this._writeCallbacks.shift();if(callback)
callback(this);if(!this._writeCallbacks.length){if(this._closed){WebInspector.fileManager.removeEventListener(WebInspector.FileManager.EventTypes.AppendedToURL,this._onAppendDone,this);WebInspector.fileManager.close(this._fileName);}}}};WebInspector.BlackboxSupport={}
WebInspector.BlackboxSupport._urlToRegExpString=function(url)
{var parsedURL=new WebInspector.ParsedURL(url);if(parsedURL.isAboutBlank()||parsedURL.isDataURL())
return"";if(!parsedURL.isValid)
return"^"+url.escapeForRegExp()+"$";var name=parsedURL.lastPathComponent;if(name)
name="/"+name;else if(parsedURL.folderPathComponents)
name=parsedURL.folderPathComponents+"/";if(!name)
name=parsedURL.host;if(!name)
return"";var scheme=parsedURL.scheme;var prefix="";if(scheme&&scheme!=="http"&&scheme!=="https"){prefix="^"+scheme+"://";if(scheme==="chrome-extension")
prefix+=parsedURL.host+"\\b";prefix+=".*";}
return prefix+name.escapeForRegExp()+(url.endsWith(name)?"$":"\\b");}
WebInspector.BlackboxSupport.canBlackboxURL=function(url)
{return!!WebInspector.BlackboxSupport._urlToRegExpString(url);}
WebInspector.BlackboxSupport.blackboxURL=function(url)
{var regexPatterns=WebInspector.moduleSetting("skipStackFramesPattern").getAsArray();var regexValue=WebInspector.BlackboxSupport._urlToRegExpString(url);if(!regexValue)
return;var found=false;for(var i=0;i<regexPatterns.length;++i){var item=regexPatterns[i];if(item.pattern===regexValue){item.disabled=false;found=true;break;}}
if(!found)
regexPatterns.push({pattern:regexValue});WebInspector.moduleSetting("skipStackFramesPattern").setAsArray(regexPatterns);}
WebInspector.BlackboxSupport.unblackbox=function(url,isContentScript)
{if(isContentScript)
WebInspector.moduleSetting("skipContentScripts").set(false);var regexPatterns=WebInspector.moduleSetting("skipStackFramesPattern").getAsArray();var regexValue=WebInspector.BlackboxSupport._urlToRegExpString(url);if(!regexValue)
return;regexPatterns=regexPatterns.filter(function(item){return item.pattern!==regexValue;});for(var i=0;i<regexPatterns.length;++i){var item=regexPatterns[i];if(item.disabled)
continue;try{var regex=new RegExp(item.pattern);if(regex.test(url))
item.disabled=true;}catch(e){}}
WebInspector.moduleSetting("skipStackFramesPattern").setAsArray(regexPatterns);}
WebInspector.BlackboxSupport.isBlackboxedURL=function(url)
{var regex=WebInspector.moduleSetting("skipStackFramesPattern").asRegExp();return regex&&regex.test(url);}
WebInspector.BlackboxSupport.isBlackboxed=function(url,isContentScript)
{if(isContentScript&&WebInspector.moduleSetting("skipContentScripts").get())
return true;return WebInspector.BlackboxSupport.isBlackboxedURL(url);}
WebInspector.BlackboxSupport.addChangeListener=function(listener,thisObject)
{WebInspector.moduleSetting("skipStackFramesPattern").addChangeListener(listener,thisObject);}
WebInspector.BlackboxSupport.removeChangeListener=function(listener,thisObject)
{WebInspector.moduleSetting("skipStackFramesPattern").removeChangeListener(listener,thisObject);};WebInspector.NetworkMapping=function(targetManager,workspace,fileSystemWorkspaceBinding,fileSystemMapping)
{this._targetManager=targetManager;this._workspace=workspace;this._fileSystemWorkspaceBinding=fileSystemWorkspaceBinding;this._fileSystemMapping=fileSystemMapping;InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.RevealSourceLine,this._revealSourceLine,this);var fileSystemManager=fileSystemWorkspaceBinding.fileSystemManager();for(var path of fileSystemManager.fileSystemPaths()){var fileSystem=fileSystemManager.fileSystem(path);this._fileSystemAdded(new WebInspector.Event(fileSystemManager,WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded,fileSystem));}
if(fileSystemManager.fileSystemsLoaded())
this._fileSystemsLoaded();fileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded,this._fileSystemAdded,this);fileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved,this._fileSystemRemoved,this);fileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemsLoaded,this._fileSystemsLoaded,this);this._fileSystemMapping.addEventListener(WebInspector.FileSystemMapping.Events.FileMappingAdded,this._fileSystemMappingChanged,this);this._fileSystemMapping.addEventListener(WebInspector.FileSystemMapping.Events.FileMappingRemoved,this._fileSystemMappingChanged,this);}
WebInspector.NetworkMapping.prototype={_fileSystemAdded:function(event)
{this._addingFileSystem=true;var fileSystem=(event.data);this._fileSystemMapping.addFileSystem(fileSystem.path());var mappings=fileSystem.projectProperty("mappings");for(var i=0;Array.isArray(mappings)&&i<mappings.length;++i){var mapping=mappings[i];if(!mapping||typeof mapping!=="object")
continue;var folder=mapping["folder"];var url=mapping["url"];if(typeof folder!=="string"||typeof url!=="string")
continue;this._fileSystemMapping.addNonConfigurableFileMapping(fileSystem.path(),url,folder);}
this._addingFileSystem=false;this._fileSystemMappingChanged();},_fileSystemRemoved:function(event)
{var fileSystem=(event.data);this._fileSystemMapping.removeFileSystem(fileSystem.path());this._fileSystemMappingChanged();},networkURL:function(uiSourceCode)
{if(uiSourceCode.project().type()===WebInspector.projectTypes.FileSystem){var fileSystemPath=this._fileSystemWorkspaceBinding.fileSystemPath(uiSourceCode.project().id());return this._networkURLForFileSystemURL(fileSystemPath,uiSourceCode.url());}
return uiSourceCode.url();},hasMappingForNetworkURL:function(url)
{return this._fileSystemMapping.hasMappingForNetworkURL(url);},_networkUISourceCodeForURL:function(target,frame,url)
{return this._workspace.uiSourceCode(WebInspector.NetworkProject.projectId(target,frame,false),url);},_contentScriptUISourceCodeForURL:function(target,frame,url)
{return this._workspace.uiSourceCode(WebInspector.NetworkProject.projectId(target,frame,true),url);},_fileSystemUISourceCodeForURL:function(url)
{var file=this._fileSystemMapping.fileForURL(url);if(file){var projectId=WebInspector.FileSystemWorkspaceBinding.projectId(file.fileSystemPath);return this._workspace.uiSourceCode(projectId,file.fileURL);}
return null;},_uiSourceCodeForURL:function(target,frame,url)
{return this._fileSystemUISourceCodeForURL(url)||this._networkUISourceCodeForURL(target,frame,url)||this._contentScriptUISourceCodeForURL(target,frame,url);},uiSourceCodeForScriptURL:function(url,script)
{var frame=WebInspector.ResourceTreeFrame.fromScript(script);return this._uiSourceCodeForURL(script.target(),frame,url);},uiSourceCodeForStyleURL:function(url,header)
{var frame=WebInspector.ResourceTreeFrame.fromStyleSheet(header);return this._uiSourceCodeForURL(header.target(),frame,url);},uiSourceCodeForURLForAnyTarget:function(url)
{return this._fileSystemUISourceCodeForURL(url)||WebInspector.workspace.uiSourceCodeForURL(url);},_networkURLForFileSystemURL:function(fileSystemPath,filePath)
{return this._fileSystemMapping.networkURLForFileSystemURL(fileSystemPath,filePath);},addMapping:function(networkUISourceCode,uiSourceCode)
{var url=this.networkURL(networkUISourceCode);var path=uiSourceCode.url();var fileSystemPath=this._fileSystemWorkspaceBinding.fileSystemPath(uiSourceCode.project().id());this._fileSystemMapping.addMappingForResource(url,fileSystemPath,path);},removeMapping:function(uiSourceCode)
{var networkURL=this.networkURL(uiSourceCode);this._fileSystemMapping.removeMappingForURL(networkURL);},_revealSourceLine:function(event)
{var url=(event.data["url"]);var lineNumber=(event.data["lineNumber"]);var columnNumber=(event.data["columnNumber"]);var uiSourceCode=this.uiSourceCodeForURLForAnyTarget(url);if(uiSourceCode){WebInspector.Revealer.reveal(uiSourceCode.uiLocation(lineNumber,columnNumber));return;}
function listener(event)
{var uiSourceCode=(event.data);if(this.networkURL(uiSourceCode)===url){WebInspector.Revealer.reveal(uiSourceCode.uiLocation(lineNumber,columnNumber));this._workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,listener,this);}}
this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,listener,this);},_fileSystemsLoaded:function()
{this._fileSystemsReady=true;},_fileSystemMappingChanged:function()
{if(!this._fileSystemsReady||this._addingFileSystem)
return;this._targetManager.suspendAndResumeAllTargets();},dispose:function()
{this._fileSystemWorkspaceBinding.fileSystemManager().removeEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded,this._fileSystemAdded,this);this._fileSystemWorkspaceBinding.fileSystemManager().removeEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved,this._fileSystemRemoved,this);this._fileSystemMapping.removeEventListener(WebInspector.FileSystemMapping.Events.FileMappingAdded,this._fileSystemMappingChanged,this);this._fileSystemMapping.removeEventListener(WebInspector.FileSystemMapping.Events.FileMappingRemoved,this._fileSystemMappingChanged,this);}}
WebInspector.networkMapping;;WebInspector.NetworkProjectManager=function(targetManager,workspace,networkMapping)
{this._workspace=workspace;this._networkMapping=networkMapping;targetManager.observeTargets(this);}
WebInspector.NetworkProjectManager.prototype={targetAdded:function(target)
{new WebInspector.NetworkProject(target,this._workspace,this._networkMapping);},targetRemoved:function(target)
{WebInspector.NetworkProject.forTarget(target)._dispose();}}
WebInspector.NetworkProject=function(target,workspace,networkMapping)
{WebInspector.SDKObject.call(this,target);this._workspace=workspace;this._networkMapping=networkMapping;this._workspaceProjects=new Map();target[WebInspector.NetworkProject._networkProjectSymbol]=this;target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded,this._resourceAdded,this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameWillNavigate,this._frameWillNavigate,this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._mainFrameNavigated,this);var debuggerModel=WebInspector.DebuggerModel.fromTarget(target);if(debuggerModel){debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource,this._parsedScriptSource,this);debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.FailedToParseScriptSource,this._parsedScriptSource,this);}
var cssModel=WebInspector.CSSStyleModel.fromTarget(target);if(cssModel){cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._styleSheetAdded,this);cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._styleSheetRemoved,this);}
target.targetManager().addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged,this._suspendStateChanged,this);}
WebInspector.NetworkProject._networkProjectSymbol=Symbol("networkProject");WebInspector.NetworkProject._resourceSymbol=Symbol("resource");WebInspector.NetworkProject._scriptSymbol=Symbol("script");WebInspector.NetworkProject._styleSheetSymbol=Symbol("styleSheet");WebInspector.NetworkProject._targetSymbol=Symbol("target");WebInspector.NetworkProject._frameSymbol=Symbol("frame");WebInspector.NetworkProject.projectId=function(target,frame,isContentScripts)
{return target.id()+":"+(frame?frame.id:"")+":"+(isContentScripts?"contentscripts":"");}
WebInspector.NetworkProject.forTarget=function(target)
{return target[WebInspector.NetworkProject._networkProjectSymbol];}
WebInspector.NetworkProject.targetForProject=function(project)
{return project[WebInspector.NetworkProject._targetSymbol]||null;}
WebInspector.NetworkProject.frameForProject=function(project)
{return project[WebInspector.NetworkProject._frameSymbol]||null;}
WebInspector.NetworkProject.targetForUISourceCode=function(uiSourceCode)
{return uiSourceCode[WebInspector.NetworkProject._targetSymbol]||null;}
WebInspector.NetworkProject.uiSourceCodeMimeType=function(uiSourceCode)
{if(uiSourceCode[WebInspector.NetworkProject._scriptSymbol]||uiSourceCode[WebInspector.NetworkProject._styleSheetSymbol]){return uiSourceCode.contentType().canonicalMimeType();}
var resource=uiSourceCode[WebInspector.NetworkProject._resourceSymbol];if(resource)
return resource.mimeType;var mimeType=WebInspector.ResourceType.mimeFromURL(uiSourceCode.url());return mimeType||uiSourceCode.contentType().canonicalMimeType();}
WebInspector.NetworkProject.uiSourceCodeFrame=function(uiSourceCode)
{var target=uiSourceCode[WebInspector.NetworkProject._targetSymbol];if(!target)
return null;var frameId;var script=uiSourceCode[WebInspector.NetworkProject._scriptSymbol];if(script){var executionContext=script.executionContext();if(executionContext)
frameId=executionContext.frameId;}
if(!frameId){var header=uiSourceCode[WebInspector.NetworkProject._styleSheetSymbol];if(header)
frameId=header.frameId;}
if(!frameId){var resource=uiSourceCode[WebInspector.NetworkProject._resourceSymbol];if(resource)
frameId=resource.frameId;}
return frameId?target.resourceTreeModel.frameForId(frameId):null;}
WebInspector.NetworkProject.prototype={_workspaceProject:function(frame,isContentScripts)
{var projectId=WebInspector.NetworkProject.projectId(this.target(),frame,isContentScripts);var projectType=isContentScripts?WebInspector.projectTypes.ContentScripts:WebInspector.projectTypes.Network;var project=this._workspaceProjects.get(projectId);if(project)
return project;project=new WebInspector.ContentProviderBasedProject(this._workspace,projectId,projectType,"");project[WebInspector.NetworkProject._targetSymbol]=this.target();project[WebInspector.NetworkProject._frameSymbol]=frame;this._workspaceProjects.set(projectId,project);return project;},addFileForURL:function(url,contentProvider,frame,isContentScript)
{return this._createFile(url,contentProvider,frame,isContentScript||false,true);},_removeFileForURL:function(frame,url)
{var project=this._workspaceProjects.get(WebInspector.NetworkProject.projectId(this.target(),frame,false));if(!project)
return;project.removeFile(url);},_populate:function()
{function populateFrame(frame)
{for(var i=0;i<frame.childFrames.length;++i)
populateFrame.call(this,frame.childFrames[i]);var resources=frame.resources();for(var i=0;i<resources.length;++i)
this._addResource(resources[i]);}
var mainFrame=this.target().resourceTreeModel.mainFrame;if(mainFrame)
populateFrame.call(this,mainFrame);},_addUISourceCodeWithProvider:function(uiSourceCode,contentProvider)
{(uiSourceCode.project()).addUISourceCodeWithProvider(uiSourceCode,contentProvider);},_parsedScriptSource:function(event)
{var script=(event.data);if(!script.sourceURL||script.isLiveEdit()||(script.isInlineScript()&&!script.hasSourceURL))
return;if(script.isContentScript()&&!script.hasSourceURL){var parsedURL=new WebInspector.ParsedURL(script.sourceURL);if(!parsedURL.isValid)
return;}
var uiSourceCode=this._createFile(script.sourceURL,script,WebInspector.ResourceTreeFrame.fromScript(script),script.isContentScript(),false);if(uiSourceCode){uiSourceCode[WebInspector.NetworkProject._scriptSymbol]=script;this._addUISourceCodeWithProvider(uiSourceCode,script);}},_styleSheetAdded:function(event)
{var header=(event.data);if(header.isInline&&!header.hasSourceURL&&header.origin!=="inspector")
return;var uiSourceCode=this._createFile(header.resourceURL(),header,WebInspector.ResourceTreeFrame.fromStyleSheet(header),false,false);if(uiSourceCode){uiSourceCode[WebInspector.NetworkProject._styleSheetSymbol]=header;this._addUISourceCodeWithProvider(uiSourceCode,header);}},_styleSheetRemoved:function(event)
{var header=(event.data);if(header.isInline&&!header.hasSourceURL&&header.origin!=="inspector")
return;this._removeFileForURL(WebInspector.ResourceTreeFrame.fromStyleSheet(header),header.resourceURL());},_resourceAdded:function(event)
{var resource=(event.data);this._addResource(resource);},_addResource:function(resource)
{var resourceType=resource.resourceType();if(resourceType!==WebInspector.resourceTypes.Image&&resourceType!==WebInspector.resourceTypes.Font&&resourceType!==WebInspector.resourceTypes.Document&&resourceType!==WebInspector.resourceTypes.Manifest){return;}
if(resourceType===WebInspector.resourceTypes.Image&&resource.mimeType&&!resource.mimeType.startsWith("image"))
return;if(resourceType===WebInspector.resourceTypes.Font&&resource.mimeType&&!resource.mimeType.includes("font"))
return;if((resourceType===WebInspector.resourceTypes.Image||resourceType===WebInspector.resourceTypes.Font)&&resource.contentURL().startsWith("data:"))
return;if(this._workspace.uiSourceCodeForURL(resource.url))
return;var uiSourceCode=this._createFile(resource.url,resource,WebInspector.ResourceTreeFrame.fromResource(resource),false,false);if(uiSourceCode){uiSourceCode[WebInspector.NetworkProject._resourceSymbol]=resource;this._addUISourceCodeWithProvider(uiSourceCode,resource);}},_frameWillNavigate:function(event)
{var frame=(event.data);var project=this._workspaceProject(frame,false);for(var resource of frame.resources())
project.removeUISourceCode(resource.url);project=this._workspaceProject(frame,true);for(var resource of frame.resources())
project.removeUISourceCode(resource.url);},_mainFrameNavigated:function(event)
{this._reset();this._populate();},_suspendStateChanged:function()
{if(this.target().targetManager().allTargetsSuspended())
this._reset();else
this._populate();},_createFile:function(url,contentProvider,frame,isContentScript,addIntoProject)
{if(this._networkMapping.hasMappingForNetworkURL(url))
return null;var project=this._workspaceProject(frame,isContentScript);var uiSourceCode=project.createUISourceCode(url,contentProvider.contentType());uiSourceCode[WebInspector.NetworkProject._targetSymbol]=this.target();if(addIntoProject)
project.addUISourceCodeWithProvider(uiSourceCode,contentProvider);return uiSourceCode;},_dispose:function()
{this._reset();var target=this.target();target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded,this._resourceAdded,this);target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._mainFrameNavigated,this);var debuggerModel=WebInspector.DebuggerModel.fromTarget(target);if(debuggerModel){debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource,this._parsedScriptSource,this);debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.FailedToParseScriptSource,this._parsedScriptSource,this);}
var cssModel=WebInspector.CSSStyleModel.fromTarget(target);if(cssModel){cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._styleSheetAdded,this);cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._styleSheetRemoved,this);}
delete target[WebInspector.NetworkProject._networkProjectSymbol];},_reset:function()
{for(var project of this._workspaceProjects.values())
project.reset();this._workspaceProjects.clear();},__proto__:WebInspector.SDKObject.prototype};WebInspector.PresentationConsoleMessageHelper=function(workspace)
{this._workspace=workspace;this._pendingConsoleMessages={};this._presentationConsoleMessages=[];WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared,this._consoleCleared,this);WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded,this._onConsoleMessageAdded,this);WebInspector.multitargetConsoleModel.messages().forEach(this._consoleMessageAdded,this);WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel,WebInspector.DebuggerModel.Events.ParsedScriptSource,this._parsedScriptSource,this);WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel,WebInspector.DebuggerModel.Events.FailedToParseScriptSource,this._parsedScriptSource,this);WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel,WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._debuggerReset,this);}
WebInspector.PresentationConsoleMessageHelper.prototype={_onConsoleMessageAdded:function(event)
{var message=(event.data);this._consoleMessageAdded(message);},_consoleMessageAdded:function(message)
{if(!message.url||!message.isErrorOrWarning())
return;var rawLocation=this._rawLocation(message);if(rawLocation)
this._addConsoleMessageToScript(message,rawLocation);else
this._addPendingConsoleMessage(message);},_rawLocation:function(message)
{var debuggerModel=WebInspector.DebuggerModel.fromTarget(message.target());if(!debuggerModel)
return null;var lineNumber=message.stackTrace?message.stackTrace[0].lineNumber-1:message.line-1;var columnNumber=message.column?message.column-1:0;if(message.stackTrace&&message.stackTrace[0].columnNumber)
columnNumber=message.stackTrace[0].columnNumber-1;if(message.scriptId)
return debuggerModel.createRawLocationByScriptId(message.scriptId,lineNumber,columnNumber);return debuggerModel.createRawLocationByURL(message.url||"",lineNumber,columnNumber);},_addConsoleMessageToScript:function(message,rawLocation)
{this._presentationConsoleMessages.push(new WebInspector.PresentationConsoleMessage(message,rawLocation));},_addPendingConsoleMessage:function(message)
{if(!message.url)
return;if(!this._pendingConsoleMessages[message.url])
this._pendingConsoleMessages[message.url]=[];this._pendingConsoleMessages[message.url].push(message);},_parsedScriptSource:function(event)
{var script=(event.data);var messages=this._pendingConsoleMessages[script.sourceURL];if(!messages)
return;var pendingMessages=[];for(var i=0;i<messages.length;i++){var message=messages[i];var rawLocation=this._rawLocation(message);if(!rawLocation)
continue;if(script.target()===message.target()&&script.scriptId===rawLocation.scriptId)
this._addConsoleMessageToScript(message,rawLocation);else
pendingMessages.push(message);}
if(pendingMessages.length)
this._pendingConsoleMessages[script.sourceURL]=pendingMessages;else
delete this._pendingConsoleMessages[script.sourceURL];},_consoleCleared:function()
{this._pendingConsoleMessages={};for(var i=0;i<this._presentationConsoleMessages.length;++i)
this._presentationConsoleMessages[i].dispose();this._presentationConsoleMessages=[];},_debuggerReset:function()
{this._consoleCleared();}}
WebInspector.PresentationConsoleMessage=function(message,rawLocation)
{this._text=message.messageText;this._level=message.level===WebInspector.ConsoleMessage.MessageLevel.Error?WebInspector.UISourceCode.Message.Level.Error:WebInspector.UISourceCode.Message.Level.Warning;this._liveLocation=WebInspector.debuggerWorkspaceBinding.createLiveLocation(rawLocation,this._updateLocation.bind(this));}
WebInspector.PresentationConsoleMessage.prototype={_updateLocation:function(uiLocation)
{if(this._uiMessage)
this._uiMessage.remove();this._uiMessage=uiLocation.uiSourceCode.addLineMessage(this._level,this._text,uiLocation.lineNumber,uiLocation.columnNumber);},dispose:function()
{this._liveLocation.dispose();if(this._uiMessage)
this._uiMessage.remove();}}
WebInspector.presentationConsoleMessageHelper;;WebInspector.resourceForURL=function(url)
{var targets=WebInspector.targetManager.targets();for(var i=0;i<targets.length;++i){var resource=targets[i].resourceTreeModel.resourceForURL(url);if(resource)
return resource;}
return null;}
WebInspector.forAllResources=function(callback)
{var targets=WebInspector.targetManager.targets();for(var i=0;i<targets.length;++i)
targets[i].resourceTreeModel.forAllResources(callback);}
WebInspector.displayNameForURL=function(url)
{if(!url)
return"";var resource=WebInspector.resourceForURL(url);if(resource)
return resource.displayName;var uiSourceCode=WebInspector.networkMapping.uiSourceCodeForURLForAnyTarget(url);if(uiSourceCode)
return uiSourceCode.displayName();if(!WebInspector.targetManager.inspectedPageURL())
return url.trimURL("");var parsedURL=WebInspector.targetManager.inspectedPageURL().asParsedURL();var lastPathComponent=parsedURL?parsedURL.lastPathComponent:parsedURL;var index=WebInspector.targetManager.inspectedPageURL().indexOf(lastPathComponent);if(index!==-1&&index+lastPathComponent.length===WebInspector.targetManager.inspectedPageURL().length){var baseURL=WebInspector.targetManager.inspectedPageURL().substring(0,index);if(url.startsWith(baseURL))
return url.substring(index);}
if(!parsedURL)
return url;var displayName=url.trimURL(parsedURL.host);return displayName==="/"?parsedURL.host+"/":displayName;};window.requestFileSystem=window.requestFileSystem||window.webkitRequestFileSystem;WebInspector.TempFile=function()
{this._fileEntry=null;this._writer=null;}
WebInspector.TempFile.create=function(dirPath,name)
{var file=new WebInspector.TempFile();function requestTempFileSystem()
{return new Promise(window.requestFileSystem.bind(window,window.TEMPORARY,10));}
function getDirectoryEntry(fs)
{return new Promise(fs.root.getDirectory.bind(fs.root,dirPath,{create:true}));}
function getFileEntry(dir)
{return new Promise(dir.getFile.bind(dir,name,{create:true}));}
function createFileWriter(fileEntry)
{file._fileEntry=fileEntry;return new Promise(fileEntry.createWriter.bind(fileEntry));}
function truncateFile(writer)
{if(!writer.length){file._writer=writer;return Promise.resolve(file);}
function truncate(fulfill,reject)
{writer.onwriteend=fulfill;writer.onerror=reject;writer.truncate(0);}
function didTruncate()
{file._writer=writer;writer.onwriteend=null;writer.onerror=null;return Promise.resolve(file);}
function onTruncateError(e)
{writer.onwriteend=null;writer.onerror=null;throw e;}
return new Promise(truncate).then(didTruncate,onTruncateError);}
return WebInspector.TempFile.ensureTempStorageCleared().then(requestTempFileSystem).then(getDirectoryEntry).then(getFileEntry).then(createFileWriter).then(truncateFile);}
WebInspector.TempFile.prototype={write:function(strings,callback)
{var blob=new Blob(strings,{type:'text/plain'});this._writer.onerror=function(e)
{WebInspector.console.error("Failed to write into a temp file: "+e.target.error.message);callback(-1);}
this._writer.onwriteend=function(e)
{callback(e.target.length);}
this._writer.write(blob);},finishWriting:function()
{this._writer=null;},read:function(callback)
{this.readRange(undefined,undefined,callback);},readRange:function(startOffset,endOffset,callback)
{function didGetFile(file)
{var reader=new FileReader();if(typeof startOffset==="number"||typeof endOffset==="number")
file=file.slice((startOffset),(endOffset));reader.onloadend=function(e)
{callback((this.result));};reader.onerror=function(error)
{WebInspector.console.error("Failed to read from temp file: "+error.message);};reader.readAsText(file);}
function didFailToGetFile(error)
{WebInspector.console.error("Failed to load temp file: "+error.message);callback(null);}
this._fileEntry.file(didGetFile,didFailToGetFile);},writeToOutputSteam:function(outputStream,delegate)
{function didGetFile(file)
{var reader=new WebInspector.ChunkedFileReader(file,10*1000*1000,delegate);reader.start(outputStream);}
function didFailToGetFile(error)
{WebInspector.console.error("Failed to load temp file: "+error.message);outputStream.close();}
this._fileEntry.file(didGetFile,didFailToGetFile);},remove:function()
{if(this._fileEntry)
this._fileEntry.remove(function(){});}}
WebInspector.DeferredTempFile=function(dirPath,name)
{this._chunks=[];this._tempFile=null;this._isWriting=false;this._finishCallback=null;this._finishedWriting=false;this._callsPendingOpen=[];this._pendingReads=[];WebInspector.TempFile.create(dirPath,name).then(this._didCreateTempFile.bind(this),this._failedToCreateTempFile.bind(this));}
WebInspector.DeferredTempFile.prototype={write:function(strings,callback)
{if(!this._chunks)
return;if(this._finishCallback)
throw new Error("No writes are allowed after close.");this._chunks.push({strings:strings,callback:callback});if(this._tempFile&&!this._isWriting)
this._writeNextChunk();},finishWriting:function(callback)
{this._finishCallback=callback;if(this._finishedWriting)
callback(this._tempFile);else if(!this._isWriting&&!this._chunks.length)
this._notifyFinished();},_failedToCreateTempFile:function(e)
{WebInspector.console.error("Failed to create temp file "+e.code+" : "+e.message);this._notifyFinished();},_didCreateTempFile:function(tempFile)
{this._tempFile=tempFile;var callsPendingOpen=this._callsPendingOpen;this._callsPendingOpen=null;for(var i=0;i<callsPendingOpen.length;++i)
callsPendingOpen[i]();if(this._chunks.length)
this._writeNextChunk();},_writeNextChunk:function()
{if(!this._tempFile)
return;var chunk=this._chunks.shift();this._isWriting=true;this._tempFile.write((chunk.strings),this._didWriteChunk.bind(this,chunk.callback));},_didWriteChunk:function(callback,size)
{this._isWriting=false;if(size===-1){this._tempFile=null;this._notifyFinished();return;}
if(callback)
callback(size);if(this._chunks.length)
this._writeNextChunk();else if(this._finishCallback)
this._notifyFinished();},_notifyFinished:function()
{this._finishedWriting=true;if(this._tempFile)
this._tempFile.finishWriting();var chunks=this._chunks;this._chunks=[];for(var i=0;i<chunks.length;++i){if(chunks[i].callback)
chunks[i].callback(-1);}
if(this._finishCallback)
this._finishCallback(this._tempFile);var pendingReads=this._pendingReads;this._pendingReads=[];for(var i=0;i<pendingReads.length;++i)
pendingReads[i]();},readRange:function(startOffset,endOffset,callback)
{if(!this._finishedWriting){this._pendingReads.push(this.readRange.bind(this,startOffset,endOffset,callback));return;}
if(!this._tempFile){callback(null);return;}
this._tempFile.readRange(startOffset,endOffset,callback);},writeToOutputStream:function(outputStream,delegate)
{if(this._callsPendingOpen){this._callsPendingOpen.push(this.writeToOutputStream.bind(this,outputStream,delegate));return;}
if(this._tempFile)
this._tempFile.writeToOutputSteam(outputStream,delegate);},remove:function()
{if(this._callsPendingOpen){this._callsPendingOpen.push(this.remove.bind(this));return;}
if(this._tempFile)
this._tempFile.remove();this._tempFile=null;}}
WebInspector.TempFile._clearTempStorage=function(fulfill,reject)
{function handleError(event)
{WebInspector.console.error(WebInspector.UIString("Failed to clear temp storage: %s",event.data));reject(event.data);}
function handleMessage(event)
{if(event.data.type==="tempStorageCleared"){if(event.data.error)
WebInspector.console.error(event.data.error);else
fulfill(undefined);return;}
reject(event.data);}
try{var worker=new WorkerRuntime.Worker("temp_storage_shared_worker","TempStorageCleaner");worker.onerror=handleError;worker.port.onmessage=handleMessage;worker.port.onerror=handleError;}catch(e){if(e.name==="URLMismatchError")
console.log("Shared worker wasn't started due to url difference. "+e);else
throw e;}}
WebInspector.TempFile.ensureTempStorageCleared=function()
{if(!WebInspector.TempFile._storageCleanerPromise)
WebInspector.TempFile._storageCleanerPromise=new Promise(WebInspector.TempFile._clearTempStorage);return WebInspector.TempFile._storageCleanerPromise;}
WebInspector.TempFileBackingStorage=function(dirName)
{this._dirName=dirName;this.reset();}
WebInspector.TempFileBackingStorage.Chunk;WebInspector.TempFileBackingStorage.prototype={appendString:function(string)
{this._strings.push(string);this._stringsLength+=string.length;var flushStringLength=10*1024*1024;if(this._stringsLength>flushStringLength)
this._flush(false);},appendAccessibleString:function(string)
{this._flush(false);this._strings.push(string);var chunk=(this._flush(true));function readString(chunk,file)
{if(chunk.string)
return(Promise.resolve(chunk.string));console.assert(chunk.endOffset);if(!chunk.endOffset)
return Promise.reject("Nor string nor offset to the string in the file were found.");function readRange(fulfill,reject)
{file.readRange(chunk.startOffset,chunk.endOffset,fulfill);}
return new Promise(readRange);}
return readString.bind(null,chunk,this._file);},_flush:function(createChunk)
{if(!this._strings.length)
return null;var chunk=null;if(createChunk){console.assert(this._strings.length===1);chunk={string:this._strings[0],startOffset:0,endOffset:0};}
function didWrite(chunk,fileSize)
{if(fileSize===-1)
return;if(chunk){chunk.startOffset=this._fileSize;chunk.endOffset=fileSize;chunk.string=null;}
this._fileSize=fileSize;}
this._file.write(this._strings,didWrite.bind(this,chunk));this._strings=[];this._stringsLength=0;return chunk;},finishWriting:function()
{this._flush(false);this._file.finishWriting(function(){});},reset:function()
{if(this._file)
this._file.remove();this._file=new WebInspector.DeferredTempFile(this._dirName,String(Date.now()));this._strings=[];this._stringsLength=0;this._fileSize=0;},writeToStream:function(outputStream,delegate)
{this._file.writeToOutputStream(outputStream,delegate);}};WebInspector.BreakpointsSidebarPaneBase=function(title)
{WebInspector.SidebarPane.call(this,title);this.registerRequiredCSS("components/breakpointsList.css");this.listElement=createElement("ol");this.listElement.className="breakpoint-list";this.emptyElement=createElement("div");this.emptyElement.className="info";this.emptyElement.textContent=WebInspector.UIString("No Breakpoints");this.element.appendChild(this.emptyElement);}
WebInspector.BreakpointsSidebarPaneBase.prototype={addListElement:function(element,beforeNode)
{if(beforeNode){this.listElement.insertBefore(element,beforeNode);}else{if(!this.listElement.firstChild){this.element.removeChild(this.emptyElement);this.element.appendChild(this.listElement);}
this.listElement.appendChild(element);}},removeListElement:function(element)
{this.listElement.removeChild(element);if(!this.listElement.firstChild){this.element.removeChild(this.listElement);this.element.appendChild(this.emptyElement);}},reset:function()
{this.listElement.removeChildren();if(this.listElement.parentElement){this.element.removeChild(this.listElement);this.element.appendChild(this.emptyElement);}},__proto__:WebInspector.SidebarPane.prototype};WebInspector.CustomPreviewSection=function(object)
{this._sectionElement=createElementWithClass("span","custom-expandable-section");this._object=object;this._expanded=false;this._cachedContent=null;var customPreview=object.customPreview();try{var headerJSON=JSON.parse(customPreview.header);}catch(e){WebInspector.console.error("Broken formatter: header is invalid json "+e);return;}
this._header=this._renderJSONMLTag(headerJSON);if(this._header.nodeType===Node.TEXT_NODE){WebInspector.console.error("Broken formatter: header should be an element node.");return;}
if(customPreview.hasBody){this._header.classList.add("custom-expandable-section-header");this._header.addEventListener("click",this._onClick.bind(this),false);}
this._sectionElement.appendChild(this._header);}
WebInspector.CustomPreviewComponent=function(object)
{this._object=object;this._customPreviewSection=new WebInspector.CustomPreviewSection(object);this.element=createElementWithClass("span","source-code");var shadowRoot=WebInspector.createShadowRootWithCoreStyles(this.element,"components/customPreviewSection.css");this.element.addEventListener("contextmenu",this._contextMenuEventFired.bind(this),false);shadowRoot.appendChild(this._customPreviewSection.element());}
WebInspector.CustomPreviewComponent.prototype={expandIfPossible:function()
{if(this._object.customPreview().hasBody&&this._customPreviewSection)
this._customPreviewSection._loadBody();},_contextMenuEventFired:function(event)
{var contextMenu=new WebInspector.ContextMenu(event);if(this._customPreviewSection)
contextMenu.appendItem(WebInspector.UIString.capitalize("Show as Javascript ^object"),this._disassemble.bind(this));contextMenu.appendApplicableItems(this._object);contextMenu.show();},_disassemble:function()
{this.element.shadowRoot.textContent="";this._customPreviewSection=null;this.element.shadowRoot.appendChild(WebInspector.ObjectPropertiesSection.defaultObjectPresentation(this._object));}}
WebInspector.CustomPreviewSection._tagsWhiteList=new Set(["span","div","ol","li","table","tr","td"]);WebInspector.CustomPreviewSection.prototype={element:function()
{return this._sectionElement;},_renderJSONMLTag:function(jsonML)
{if(!Array.isArray(jsonML))
return createTextNode(jsonML+"");var array=(jsonML);if(array[0]==="object")
return this._layoutObjectTag(array);else
return this._renderElement(array);},_renderElement:function(object)
{var tagName=object.shift();if(!WebInspector.CustomPreviewSection._tagsWhiteList.has(tagName)){WebInspector.console.error("Broken formatter: element "+tagName+" is not allowed!");return createElement("span");}
var element=createElement((tagName));if((typeof object[0]=="object")&&!Array.isArray(object[0])){var attributes=object.shift();for(var key in attributes){var value=attributes[key];if((key!=="style")||(typeof value!=="string"))
continue;element.setAttribute(key,value);}}
this._appendJsonMLTags(element,object);return element;},_layoutObjectTag:function(objectTag)
{objectTag.shift();var attributes=objectTag.shift();var remoteObject=this._object.target().runtimeModel.createRemoteObject((attributes));if(remoteObject.customPreview())
return(new WebInspector.CustomPreviewSection(remoteObject)).element();var sectionElement=WebInspector.ObjectPropertiesSection.defaultObjectPresentation(remoteObject);sectionElement.classList.toggle("custom-expandable-section-standard-section",remoteObject.hasChildren);return sectionElement;},_appendJsonMLTags:function(parentElement,jsonMLTags)
{for(var i=0;i<jsonMLTags.length;++i)
parentElement.appendChild(this._renderJSONMLTag(jsonMLTags[i]));},_onClick:function(event)
{event.consume(true);if(this._cachedContent)
this._toggleExpand();else
this._loadBody();},_toggleExpand:function()
{this._expanded=!this._expanded;this._header.classList.toggle("expanded",this._expanded);this._cachedContent.classList.toggle("hidden",!this._expanded);},_loadBody:function()
{function load(formatter,config)
{function substituteObjectTagsInCustomPreview(jsonMLObject)
{if(!jsonMLObject||(typeof jsonMLObject!=="object")||(typeof jsonMLObject.splice!=="function"))
return;var obj=jsonMLObject.length;if(!(typeof obj==="number"&&obj>>>0===obj&&(obj>0||1/obj>0)))
return;var startIndex=1;if(jsonMLObject[0]==="object"){var attributes=jsonMLObject[1];var originObject=attributes["object"];var config=attributes["config"];if(typeof originObject==="undefined")
throw"Illegal format: obligatory attribute \"object\" isn't specified";jsonMLObject[1]=bindRemoteObject(originObject,false,false,null,false,config);startIndex=2;}
for(var i=startIndex;i<jsonMLObject.length;++i)
substituteObjectTagsInCustomPreview(jsonMLObject[i]);}
try{var body=formatter.body(this,config);substituteObjectTagsInCustomPreview(body);return body;}catch(e){console.error("Custom Formatter Failed: "+e);return null;}}
var customPreview=this._object.customPreview();var args=[{objectId:customPreview.formatterObjectId}];if(customPreview.configObjectId)
args.push({objectId:customPreview.configObjectId});this._object.callFunctionJSON(load,args,onBodyLoaded.bind(this));function onBodyLoaded(bodyJsonML)
{if(!bodyJsonML)
return;this._cachedContent=this._renderJSONMLTag(bodyJsonML);this._sectionElement.appendChild(this._cachedContent);this._toggleExpand();}}};WebInspector.DataSaverInfobar=function()
{WebInspector.Infobar.call(this,WebInspector.Infobar.Type.Warning,WebInspector.UIString("Data Saver is enabled"),WebInspector.settings.moduleSetting("disableDataSaverInfobar"));var message=this.createDetailsRowMessage();message.createTextChild("Consider disabling ");message.appendChild(WebInspector.linkifyURLAsNode("https://support.google.com/chrome/answer/2392284?hl=en","Chrome Data Saver",undefined,true));message.createTextChild(WebInspector.UIString(" while debugging."));}
WebInspector.DataSaverInfobar._infobars=[];WebInspector.DataSaverInfobar.maybeShowInPanel=function(panel)
{if(Runtime.queryParam("remoteFrontend")){var infobar=new WebInspector.DataSaverInfobar();WebInspector.DataSaverInfobar._infobars.push(infobar);panel.showInfobar(infobar);}}
WebInspector.DataSaverInfobar.prototype={dispose:function()
{for(var infobar of WebInspector.DataSaverInfobar._infobars)
WebInspector.Infobar.prototype.dispose.call(infobar);},__proto__:WebInspector.Infobar.prototype};WebInspector.DebuggerPresentationUtils={}
WebInspector.DebuggerPresentationUtils.callFrameAnchorFromStackTrace=function(debuggerModel,stackTrace,asyncStackTrace,showBlackboxed)
{function innerCallFrameAnchorFromStackTrace(stackTrace)
{if(!stackTrace||!stackTrace.length)
return null;if(showBlackboxed)
return stackTrace[0];for(var i=0;i<stackTrace.length;++i){var script=debuggerModel&&debuggerModel.scriptForId(stackTrace[i].scriptId);var blackboxed=script?WebInspector.BlackboxSupport.isBlackboxed(script.sourceURL,script.isContentScript()):WebInspector.BlackboxSupport.isBlackboxedURL(stackTrace[i].url);if(!blackboxed)
return stackTrace[i];}
return null;}
var callFrame=innerCallFrameAnchorFromStackTrace(stackTrace);if(callFrame)
return callFrame;while(asyncStackTrace){callFrame=innerCallFrameAnchorFromStackTrace(asyncStackTrace.callFrames);if(callFrame)
return callFrame;asyncStackTrace=asyncStackTrace.asyncStackTrace;}
return stackTrace?stackTrace[0]:null;};WebInspector.DOMBreakpointsSidebarPane=function()
{WebInspector.BreakpointsSidebarPaneBase.call(this,WebInspector.UIString("DOM Breakpoints"));this._domBreakpointsSetting=WebInspector.settings.createLocalSetting("domBreakpoints",[]);this.listElement.classList.add("dom-breakpoints-list");this._breakpointElements={};this._breakpointTypes={SubtreeModified:"subtree-modified",AttributeModified:"attribute-modified",NodeRemoved:"node-removed"};this._breakpointTypeLabels={};this._breakpointTypeLabels[this._breakpointTypes.SubtreeModified]=WebInspector.UIString("Subtree Modified");this._breakpointTypeLabels[this._breakpointTypes.AttributeModified]=WebInspector.UIString("Attribute Modified");this._breakpointTypeLabels[this._breakpointTypes.NodeRemoved]=WebInspector.UIString("Node Removed");this._contextMenuLabels={};this._contextMenuLabels[this._breakpointTypes.SubtreeModified]=WebInspector.UIString.capitalize("Subtree ^modifications");this._contextMenuLabels[this._breakpointTypes.AttributeModified]=WebInspector.UIString.capitalize("Attributes ^modifications");this._contextMenuLabels[this._breakpointTypes.NodeRemoved]=WebInspector.UIString.capitalize("Node ^removal");WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.InspectedURLChanged,this._inspectedURLChanged,this);WebInspector.targetManager.addModelListener(WebInspector.DOMModel,WebInspector.DOMModel.Events.NodeRemoved,this._nodeRemoved,this);}
WebInspector.DOMBreakpointsSidebarPane.Marker="breakpoint-marker";WebInspector.DOMBreakpointsSidebarPane.prototype={_inspectedURLChanged:function(event)
{this._breakpointElements={};this.reset();var url=(event.data);this._inspectedURL=url.removeURLFragment();},populateNodeContextMenu:function(node,contextMenu,createSubMenu)
{if(node.pseudoType())
return;var nodeBreakpoints=this._nodeBreakpoints(node);function toggleBreakpoint(type)
{if(!nodeBreakpoints[type])
this._setBreakpoint(node,type,true);else
this._removeBreakpoint(node,type);this._saveBreakpoints();}
var breakpointsMenu=createSubMenu?contextMenu.appendSubMenuItem(WebInspector.UIString("Break on...")):contextMenu;for(var key in this._breakpointTypes){var type=this._breakpointTypes[key];var label=this._contextMenuLabels[type];breakpointsMenu.appendCheckboxItem(label,toggleBreakpoint.bind(this,type),nodeBreakpoints[type]);}},_nodeBreakpoints:function(node)
{var nodeBreakpoints={};for(var id in this._breakpointElements){var element=this._breakpointElements[id];if(element._node===node&&element._checkboxElement.checked)
nodeBreakpoints[element._type]=true;}
return nodeBreakpoints;},hasBreakpoints:function(node)
{for(var id in this._breakpointElements){var element=this._breakpointElements[id];if(element._node===node&&element._checkboxElement.checked)
return true;}
return false;},createBreakpointHitStatusMessage:function(details,callback)
{var auxData=(details.auxData);var domModel=WebInspector.DOMModel.fromTarget(details.target());if(!domModel)
return;if(auxData.type===this._breakpointTypes.SubtreeModified){var targetNodeObject=details.target().runtimeModel.createRemoteObject(auxData["targetNode"]);domModel.pushObjectAsNodeToFrontend(targetNodeObject,didPushNodeToFrontend.bind(this));}else{this._doCreateBreakpointHitStatusMessage(auxData,domModel.nodeForId(auxData.nodeId),null,callback);}
function didPushNodeToFrontend(targetNode)
{if(targetNode)
targetNodeObject.release();this._doCreateBreakpointHitStatusMessage(auxData,domModel.nodeForId(auxData.nodeId),targetNode,callback);}},_doCreateBreakpointHitStatusMessage:function(auxData,node,targetNode,callback)
{var message;var typeLabel=this._breakpointTypeLabels[auxData.type];var linkifiedNode=WebInspector.DOMPresentationUtils.linkifyNodeReference(node);var substitutions=[typeLabel,linkifiedNode];var targetNodeLink="";if(targetNode)
targetNodeLink=WebInspector.DOMPresentationUtils.linkifyNodeReference(targetNode);if(auxData.type===this._breakpointTypes.SubtreeModified){if(auxData.insertion){if(targetNode!==node){message="Paused on a \"%s\" breakpoint set on %s, because a new child was added to its descendant %s.";substitutions.push(targetNodeLink);}else
message="Paused on a \"%s\" breakpoint set on %s, because a new child was added to that node.";}else{message="Paused on a \"%s\" breakpoint set on %s, because its descendant %s was removed.";substitutions.push(targetNodeLink);}}else
message="Paused on a \"%s\" breakpoint set on %s.";var element=WebInspector.formatLocalized(message,substitutions);callback(element);},_nodeRemoved:function(event)
{var node=event.data.node;this._removeBreakpointsForNode(event.data.node);var children=node.children();if(!children)
return;for(var i=0;i<children.length;++i)
this._removeBreakpointsForNode(children[i]);this._saveBreakpoints();},_removeBreakpointsForNode:function(node)
{for(var id in this._breakpointElements){var element=this._breakpointElements[id];if(element._node===node)
this._removeBreakpoint(element._node,element._type);}},_setBreakpoint:function(node,type,enabled)
{var breakpointId=this._createBreakpointId(node.id,type);var breakpointElement=this._breakpointElements[breakpointId];if(!breakpointElement){breakpointElement=this._createBreakpointElement(node,type,enabled);this._breakpointElements[breakpointId]=breakpointElement;}else{breakpointElement._checkboxElement.checked=enabled;}
if(enabled)
node.target().domdebuggerAgent().setDOMBreakpoint(node.id,type);node.setMarker(WebInspector.DOMBreakpointsSidebarPane.Marker,true);},_createBreakpointElement:function(node,type,enabled)
{var element=createElement("li");element._node=node;element._type=type;element.addEventListener("contextmenu",this._contextMenu.bind(this,node,type),true);var checkboxLabel=createCheckboxLabel("",enabled);checkboxLabel.addEventListener("click",this._checkboxClicked.bind(this,node,type),false);element._checkboxElement=checkboxLabel.checkboxElement;element.appendChild(checkboxLabel);var labelElement=createElementWithClass("div","dom-breakpoint");element.appendChild(labelElement);var linkifiedNode=WebInspector.DOMPresentationUtils.linkifyNodeReference(node);linkifiedNode.classList.add("monospace");linkifiedNode.style.display="block";labelElement.appendChild(linkifiedNode);var description=createElement("div");description.textContent=this._breakpointTypeLabels[type];labelElement.appendChild(description);var currentElement=this.listElement.firstChild;while(currentElement){if(currentElement._type&&currentElement._type<element._type)
break;currentElement=currentElement.nextSibling;}
this.addListElement(element,currentElement);return element;},_removeAllBreakpoints:function()
{for(var id in this._breakpointElements){var element=this._breakpointElements[id];this._removeBreakpoint(element._node,element._type);}
this._saveBreakpoints();},_removeBreakpoint:function(node,type)
{var breakpointId=this._createBreakpointId(node.id,type);var element=this._breakpointElements[breakpointId];if(!element)
return;this.removeListElement(element);delete this._breakpointElements[breakpointId];if(element._checkboxElement.checked)
node.target().domdebuggerAgent().removeDOMBreakpoint(node.id,type);node.setMarker(WebInspector.DOMBreakpointsSidebarPane.Marker,this.hasBreakpoints(node)?true:null);},_contextMenu:function(node,type,event)
{var contextMenu=new WebInspector.ContextMenu(event);function removeBreakpoint()
{this._removeBreakpoint(node,type);this._saveBreakpoints();}
contextMenu.appendItem(WebInspector.UIString.capitalize("Remove ^breakpoint"),removeBreakpoint.bind(this));contextMenu.appendItem(WebInspector.UIString.capitalize("Remove ^all DOM breakpoints"),this._removeAllBreakpoints.bind(this));contextMenu.show();},_checkboxClicked:function(node,type,event)
{if(event.target.checked)
node.target().domdebuggerAgent().setDOMBreakpoint(node.id,type);else
node.target().domdebuggerAgent().removeDOMBreakpoint(node.id,type);this._saveBreakpoints();},highlightBreakpoint:function(auxData)
{var breakpointId=this._createBreakpointId(auxData.nodeId,auxData.type);var element=this._breakpointElements[breakpointId];if(!element)
return;this.expand();element.classList.add("breakpoint-hit");this._highlightedElement=element;},clearBreakpointHighlight:function()
{if(this._highlightedElement){this._highlightedElement.classList.remove("breakpoint-hit");delete this._highlightedElement;}},_createBreakpointId:function(nodeId,type)
{return nodeId+":"+type;},_saveBreakpoints:function()
{var breakpoints=[];var storedBreakpoints=this._domBreakpointsSetting.get();for(var i=0;i<storedBreakpoints.length;++i){var breakpoint=storedBreakpoints[i];if(breakpoint.url!==this._inspectedURL)
breakpoints.push(breakpoint);}
for(var id in this._breakpointElements){var element=this._breakpointElements[id];breakpoints.push({url:this._inspectedURL,path:element._node.path(),type:element._type,enabled:element._checkboxElement.checked});}
this._domBreakpointsSetting.set(breakpoints);},restoreBreakpoints:function(domModel)
{var pathToBreakpoints={};function didPushNodeByPathToFrontend(path,nodeId)
{var node=nodeId?domModel.nodeForId(nodeId):null;if(!node)
return;var breakpoints=pathToBreakpoints[path];for(var i=0;i<breakpoints.length;++i)
this._setBreakpoint(node,breakpoints[i].type,breakpoints[i].enabled);}
var breakpoints=this._domBreakpointsSetting.get();for(var i=0;i<breakpoints.length;++i){var breakpoint=breakpoints[i];if(breakpoint.url!==this._inspectedURL)
continue;var path=breakpoint.path;if(!pathToBreakpoints[path]){pathToBreakpoints[path]=[];domModel.pushNodeByPathToFrontend(path,didPushNodeByPathToFrontend.bind(this,path));}
pathToBreakpoints[path].push(breakpoint);}},createProxy:function(panel)
{var proxy=new WebInspector.DOMBreakpointsSidebarPane.Proxy(this,panel);if(!this._proxies)
this._proxies=[];this._proxies.push(proxy);return proxy;},onContentReady:function()
{for(var i=0;i!=this._proxies.length;i++)
this._proxies[i].onContentReady();},__proto__:WebInspector.BreakpointsSidebarPaneBase.prototype}
WebInspector.DOMBreakpointsSidebarPane.Proxy=function(pane,panel)
{WebInspector.SidebarPane.call(this,pane.title());this.registerRequiredCSS("components/breakpointsList.css");this._wrappedPane=pane;this._panel=panel;}
WebInspector.DOMBreakpointsSidebarPane.Proxy.prototype={expand:function()
{this._wrappedPane.expand();},onContentReady:function()
{if(this._panel.isShowing())
this._reattachBody();WebInspector.SidebarPane.prototype.onContentReady.call(this);},wasShown:function()
{WebInspector.SidebarPane.prototype.wasShown.call(this);this._reattachBody();},_reattachBody:function()
{if(this._wrappedPane.element.parentNode!==this.element)
this._wrappedPane.show(this.element);},__proto__:WebInspector.SidebarPane.prototype}
WebInspector.domBreakpointsSidebarPane;;WebInspector.DOMPresentationUtils={}
WebInspector.DOMPresentationUtils.decorateNodeLabel=function(node,parentElement)
{var originalNode=node;var isPseudo=node.nodeType()===Node.ELEMENT_NODE&&node.pseudoType();if(isPseudo&&node.parentNode)
node=node.parentNode;var title=node.nodeNameInCorrectCase();var nameElement=parentElement.createChild("span","node-label-name");nameElement.textContent=title;var idAttribute=node.getAttribute("id");if(idAttribute){var idElement=parentElement.createChild("span","node-label-id");var part="#"+idAttribute;title+=part;idElement.createTextChild(part);nameElement.classList.add("extra");}
var classAttribute=node.getAttribute("class");if(classAttribute){var classes=classAttribute.split(/\s+/);var foundClasses={};if(classes.length){var classesElement=parentElement.createChild("span","extra node-label-class");for(var i=0;i<classes.length;++i){var className=classes[i];if(className&&!(className in foundClasses)){var part="."+className;title+=part;classesElement.createTextChild(part);foundClasses[className]=true;}}}}
if(isPseudo){var pseudoElement=parentElement.createChild("span","extra node-label-pseudo");var pseudoText="::"+originalNode.pseudoType();pseudoElement.createTextChild(pseudoText);title+=pseudoText;}
parentElement.title=title;}
WebInspector.DOMPresentationUtils.createSpansForNodeTitle=function(container,nodeTitle)
{var match=nodeTitle.match(/([^#.]+)(#[^.]+)?(\..*)?/);container.createChild("span","webkit-html-tag-name").textContent=match[1];if(match[2])
container.createChild("span","webkit-html-attribute-value").textContent=match[2];if(match[3])
container.createChild("span","webkit-html-attribute-name").textContent=match[3];}
WebInspector.DOMPresentationUtils.linkifyNodeReference=function(node)
{if(!node)
return createTextNode(WebInspector.UIString("<node>"));var root=createElementWithClass("span","monospace");var shadowRoot=WebInspector.createShadowRootWithCoreStyles(root,"components/domUtils.css");var link=shadowRoot.createChild("div","node-link");WebInspector.DOMPresentationUtils.decorateNodeLabel(node,link);link.addEventListener("click",WebInspector.Revealer.reveal.bind(WebInspector.Revealer,node,undefined),false);link.addEventListener("mouseover",node.highlight.bind(node,undefined,undefined),false);link.addEventListener("mouseleave",WebInspector.DOMModel.hideDOMNodeHighlight.bind(WebInspector.DOMModel),false);return root;}
WebInspector.DOMPresentationUtils.linkifyDeferredNodeReference=function(deferredNode)
{var root=createElement("div");var shadowRoot=WebInspector.createShadowRootWithCoreStyles(root,"components/domUtils.css");var link=shadowRoot.createChild("div","node-link");link.createChild("content");link.addEventListener("click",deferredNode.resolve.bind(deferredNode,onDeferredNodeResolved),false);link.addEventListener("mousedown",consumeEvent,false);function onDeferredNodeResolved(node)
{WebInspector.Revealer.reveal(node);}
return root;}
WebInspector.DOMPresentationUtils.buildImagePreviewContents=function(target,originalImageURL,showDimensions,userCallback,precomputedFeatures)
{var resource=target.resourceTreeModel.resourceForURL(originalImageURL);var imageURL=originalImageURL;if(!isImageResource(resource)&&precomputedFeatures&&precomputedFeatures.currentSrc){imageURL=precomputedFeatures.currentSrc;resource=target.resourceTreeModel.resourceForURL(imageURL);}
if(!isImageResource(resource)){userCallback();return;}
var imageElement=createElement("img");imageElement.addEventListener("load",buildContent,false);imageElement.addEventListener("error",errorCallback,false);resource.populateImageSource(imageElement);function errorCallback()
{userCallback();}
function isImageResource(resource)
{return!!resource&&resource.resourceType()===WebInspector.resourceTypes.Image;}
function buildContent()
{var container=createElement("table");container.className="image-preview-container";var naturalWidth=precomputedFeatures?precomputedFeatures.naturalWidth:imageElement.naturalWidth;var naturalHeight=precomputedFeatures?precomputedFeatures.naturalHeight:imageElement.naturalHeight;var offsetWidth=precomputedFeatures?precomputedFeatures.offsetWidth:naturalWidth;var offsetHeight=precomputedFeatures?precomputedFeatures.offsetHeight:naturalHeight;var description;if(showDimensions){if(offsetHeight===naturalHeight&&offsetWidth===naturalWidth)
description=WebInspector.UIString("%d \xd7 %d pixels",offsetWidth,offsetHeight);else
description=WebInspector.UIString("%d \xd7 %d pixels (Natural: %d \xd7 %d pixels)",offsetWidth,offsetHeight,naturalWidth,naturalHeight);}
container.createChild("tr").createChild("td","image-container").appendChild(imageElement);if(description)
container.createChild("tr").createChild("td").createChild("span","description").textContent=description;if(imageURL!==originalImageURL)
container.createChild("tr").createChild("td").createChild("span","description").textContent=String.sprintf("currentSrc: %s",imageURL.trimMiddle(100));userCallback(container);}}
WebInspector.DOMPresentationUtils.buildStackTracePreviewContents=function(target,linkifier,stackTrace,asyncStackTrace)
{var element=createElement("span");element.style.display="inline-block";var shadowRoot=WebInspector.createShadowRootWithCoreStyles(element,"components/domUtils.css");var contentElement=shadowRoot.createChild("table","stack-preview-container");function appendStackTrace(stackTrace)
{for(var stackFrame of stackTrace){var row=createElement("tr");row.createChild("td","function-name").textContent=WebInspector.beautifyFunctionName(stackFrame.functionName);row.createChild("td").textContent=" @ ";row.createChild("td").appendChild(linkifier.linkifyConsoleCallFrame(target,stackFrame));contentElement.appendChild(row);}}
if(stackTrace)
appendStackTrace(stackTrace);while(asyncStackTrace){var callFrames=asyncStackTrace.callFrames;if(!callFrames||!callFrames.length)
break;var row=contentElement.createChild("tr");row.createChild("td","stack-preview-async-description").textContent=WebInspector.asyncStackTraceLabel(asyncStackTrace.description);row.createChild("td");row.createChild("td");appendStackTrace(callFrames);asyncStackTrace=asyncStackTrace.asyncStackTrace;}
return element;}
WebInspector.DOMPresentationUtils.fullQualifiedSelector=function(node,justSelector)
{if(node.nodeType()!==Node.ELEMENT_NODE)
return node.localName()||node.nodeName().toLowerCase();return WebInspector.DOMPresentationUtils.cssPath(node,justSelector);}
WebInspector.DOMPresentationUtils.simpleSelector=function(node)
{var lowerCaseName=node.localName()||node.nodeName().toLowerCase();if(node.nodeType()!==Node.ELEMENT_NODE)
return lowerCaseName;if(lowerCaseName==="input"&&node.getAttribute("type")&&!node.getAttribute("id")&&!node.getAttribute("class"))
return lowerCaseName+"[type=\""+node.getAttribute("type")+"\"]";if(node.getAttribute("id"))
return lowerCaseName+"#"+node.getAttribute("id");if(node.getAttribute("class"))
return(lowerCaseName==="div"?"":lowerCaseName)+"."+node.getAttribute("class").trim().replace(/\s+/g,".");return lowerCaseName;}
WebInspector.DOMPresentationUtils.cssPath=function(node,optimized)
{if(node.nodeType()!==Node.ELEMENT_NODE)
return"";var steps=[];var contextNode=node;while(contextNode){var step=WebInspector.DOMPresentationUtils._cssPathStep(contextNode,!!optimized,contextNode===node);if(!step)
break;steps.push(step);if(step.optimized)
break;contextNode=contextNode.parentNode;}
steps.reverse();return steps.join(" > ");}
WebInspector.DOMPresentationUtils._cssPathStep=function(node,optimized,isTargetNode)
{if(node.nodeType()!==Node.ELEMENT_NODE)
return null;var id=node.getAttribute("id");if(optimized){if(id)
return new WebInspector.DOMNodePathStep(idSelector(id),true);var nodeNameLower=node.nodeName().toLowerCase();if(nodeNameLower==="body"||nodeNameLower==="head"||nodeNameLower==="html")
return new WebInspector.DOMNodePathStep(node.nodeNameInCorrectCase(),true);}
var nodeName=node.nodeNameInCorrectCase();if(id)
return new WebInspector.DOMNodePathStep(nodeName+idSelector(id),true);var parent=node.parentNode;if(!parent||parent.nodeType()===Node.DOCUMENT_NODE)
return new WebInspector.DOMNodePathStep(nodeName,true);function prefixedElementClassNames(node)
{var classAttribute=node.getAttribute("class");if(!classAttribute)
return[];return classAttribute.split(/\s+/g).filter(Boolean).map(function(name){return"$"+name;});}
function idSelector(id)
{return"#"+escapeIdentifierIfNeeded(id);}
function escapeIdentifierIfNeeded(ident)
{if(isCSSIdentifier(ident))
return ident;var shouldEscapeFirst=/^(?:[0-9]|-[0-9-]?)/.test(ident);var lastIndex=ident.length-1;return ident.replace(/./g,function(c,i){return((shouldEscapeFirst&&i===0)||!isCSSIdentChar(c))?escapeAsciiChar(c,i===lastIndex):c;});}
function escapeAsciiChar(c,isLast)
{return"\\"+toHexByte(c)+(isLast?"":" ");}
function toHexByte(c)
{var hexByte=c.charCodeAt(0).toString(16);if(hexByte.length===1)
hexByte="0"+hexByte;return hexByte;}
function isCSSIdentChar(c)
{if(/[a-zA-Z0-9_-]/.test(c))
return true;return c.charCodeAt(0)>=0xA0;}
function isCSSIdentifier(value)
{return/^-?[a-zA-Z_][a-zA-Z0-9_-]*$/.test(value);}
var prefixedOwnClassNamesArray=prefixedElementClassNames(node);var needsClassNames=false;var needsNthChild=false;var ownIndex=-1;var elementIndex=-1;var siblings=parent.children();for(var i=0;(ownIndex===-1||!needsNthChild)&&i<siblings.length;++i){var sibling=siblings[i];if(sibling.nodeType()!==Node.ELEMENT_NODE)
continue;elementIndex+=1;if(sibling===node){ownIndex=elementIndex;continue;}
if(needsNthChild)
continue;if(sibling.nodeNameInCorrectCase()!==nodeName)
continue;needsClassNames=true;var ownClassNames=prefixedOwnClassNamesArray.keySet();var ownClassNameCount=0;for(var name in ownClassNames)
++ownClassNameCount;if(ownClassNameCount===0){needsNthChild=true;continue;}
var siblingClassNamesArray=prefixedElementClassNames(sibling);for(var j=0;j<siblingClassNamesArray.length;++j){var siblingClass=siblingClassNamesArray[j];if(!ownClassNames.hasOwnProperty(siblingClass))
continue;delete ownClassNames[siblingClass];if(!--ownClassNameCount){needsNthChild=true;break;}}}
var result=nodeName;if(isTargetNode&&nodeName.toLowerCase()==="input"&&node.getAttribute("type")&&!node.getAttribute("id")&&!node.getAttribute("class"))
result+="[type=\""+node.getAttribute("type")+"\"]";if(needsNthChild){result+=":nth-child("+(ownIndex+1)+")";}else if(needsClassNames){for(var prefixedName in prefixedOwnClassNamesArray.keySet())
result+="."+escapeIdentifierIfNeeded(prefixedName.substr(1));}
return new WebInspector.DOMNodePathStep(result,false);}
WebInspector.DOMPresentationUtils.xPath=function(node,optimized)
{if(node.nodeType()===Node.DOCUMENT_NODE)
return"/";var steps=[];var contextNode=node;while(contextNode){var step=WebInspector.DOMPresentationUtils._xPathValue(contextNode,optimized);if(!step)
break;steps.push(step);if(step.optimized)
break;contextNode=contextNode.parentNode;}
steps.reverse();return(steps.length&&steps[0].optimized?"":"/")+steps.join("/");}
WebInspector.DOMPresentationUtils._xPathValue=function(node,optimized)
{var ownValue;var ownIndex=WebInspector.DOMPresentationUtils._xPathIndex(node);if(ownIndex===-1)
return null;switch(node.nodeType()){case Node.ELEMENT_NODE:if(optimized&&node.getAttribute("id"))
return new WebInspector.DOMNodePathStep("//*[@id=\""+node.getAttribute("id")+"\"]",true);ownValue=node.localName();break;case Node.ATTRIBUTE_NODE:ownValue="@"+node.nodeName();break;case Node.TEXT_NODE:case Node.CDATA_SECTION_NODE:ownValue="text()";break;case Node.PROCESSING_INSTRUCTION_NODE:ownValue="processing-instruction()";break;case Node.COMMENT_NODE:ownValue="comment()";break;case Node.DOCUMENT_NODE:ownValue="";break;default:ownValue="";break;}
if(ownIndex>0)
ownValue+="["+ownIndex+"]";return new WebInspector.DOMNodePathStep(ownValue,node.nodeType()===Node.DOCUMENT_NODE);}
WebInspector.DOMPresentationUtils._xPathIndex=function(node)
{function areNodesSimilar(left,right)
{if(left===right)
return true;if(left.nodeType()===Node.ELEMENT_NODE&&right.nodeType()===Node.ELEMENT_NODE)
return left.localName()===right.localName();if(left.nodeType()===right.nodeType())
return true;var leftType=left.nodeType()===Node.CDATA_SECTION_NODE?Node.TEXT_NODE:left.nodeType();var rightType=right.nodeType()===Node.CDATA_SECTION_NODE?Node.TEXT_NODE:right.nodeType();return leftType===rightType;}
var siblings=node.parentNode?node.parentNode.children():null;if(!siblings)
return 0;var hasSameNamedElements;for(var i=0;i<siblings.length;++i){if(areNodesSimilar(node,siblings[i])&&siblings[i]!==node){hasSameNamedElements=true;break;}}
if(!hasSameNamedElements)
return 0;var ownIndex=1;for(var i=0;i<siblings.length;++i){if(areNodesSimilar(node,siblings[i])){if(siblings[i]===node)
return ownIndex;++ownIndex;}}
return-1;}
WebInspector.DOMNodePathStep=function(value,optimized)
{this.value=value;this.optimized=optimized||false;}
WebInspector.DOMNodePathStep.prototype={toString:function()
{return this.value;}}
WebInspector.DOMPresentationUtils.MarkerDecorator=function()
{}
WebInspector.DOMPresentationUtils.MarkerDecorator.prototype={decorate:function(node){}}
WebInspector.DOMPresentationUtils.GenericDecorator=function(extension)
{this._title=WebInspector.UIString(extension.title(WebInspector.platform()));this._color=extension.descriptor()['color'];}
WebInspector.DOMPresentationUtils.GenericDecorator.prototype={decorate:function(node)
{return{title:this._title,color:this._color};}};WebInspector.DockController=function(canDock)
{this._canDock=canDock;this._closeButton=new WebInspector.ToolbarButton(WebInspector.UIString("Close"),"delete-toolbar-item");this._closeButton.addEventListener("click",InspectorFrontendHost.closeWindow.bind(InspectorFrontendHost));if(!canDock){this._dockSide=WebInspector.DockController.State.Undocked;this._updateUI();return;}
this._states=[WebInspector.DockController.State.DockedToRight,WebInspector.DockController.State.DockedToBottom,WebInspector.DockController.State.Undocked];this._currentDockStateSetting=WebInspector.settings.createSetting("currentDockState","right");this._lastDockStateSetting=WebInspector.settings.createSetting("lastDockState","bottom");if(this._states.indexOf(this._currentDockStateSetting.get())===-1)
this._currentDockStateSetting.set("right");if(this._states.indexOf(this._lastDockStateSetting.get())===-1)
this._currentDockStateSetting.set("bottom");}
WebInspector.DockController.State={DockedToBottom:"bottom",DockedToRight:"right",Undocked:"undocked"}
WebInspector.DockController.Events={BeforeDockSideChanged:"BeforeDockSideChanged",DockSideChanged:"DockSideChanged",AfterDockSideChanged:"AfterDockSideChanged"}
WebInspector.DockController.prototype={initialize:function()
{if(!this._canDock)
return;this._titles=[WebInspector.UIString("Dock to right"),WebInspector.UIString("Dock to bottom"),WebInspector.UIString("Undock into separate window")];this.setDockSide(this._currentDockStateSetting.get());},dockSide:function()
{return this._dockSide;},canDock:function()
{return this._canDock;},isVertical:function()
{return this._dockSide===WebInspector.DockController.State.DockedToRight;},setDockSide:function(dockSide)
{if(this._states.indexOf(dockSide)===-1)
dockSide=this._states[0];if(this._dockSide===dockSide)
return;if(this._dockSide)
this._lastDockStateSetting.set(this._dockSide);this._currentDockStateSetting.set(dockSide);var eventData={from:this._dockSide,to:dockSide};this.dispatchEventToListeners(WebInspector.DockController.Events.BeforeDockSideChanged,eventData);console.timeStamp("DockController.setIsDocked");InspectorFrontendHost.setIsDocked(dockSide!==WebInspector.DockController.State.Undocked,this._setIsDockedResponse.bind(this,eventData));this._dockSide=dockSide;this._updateUI();this.dispatchEventToListeners(WebInspector.DockController.Events.DockSideChanged,eventData);},_setIsDockedResponse:function(eventData)
{this.dispatchEventToListeners(WebInspector.DockController.Events.AfterDockSideChanged,eventData);},_updateUI:function()
{var body=document.body;switch(this._dockSide){case WebInspector.DockController.State.DockedToBottom:body.classList.remove("undocked");body.classList.remove("dock-to-right");body.classList.add("dock-to-bottom");break;case WebInspector.DockController.State.DockedToRight:body.classList.remove("undocked");body.classList.add("dock-to-right");body.classList.remove("dock-to-bottom");break;case WebInspector.DockController.State.Undocked:body.classList.add("undocked");body.classList.remove("dock-to-right");body.classList.remove("dock-to-bottom");break;}
this._closeButton.setVisible(this._dockSide!==WebInspector.DockController.State.Undocked);},_toggleDockSide:function()
{if(this._lastDockStateSetting.get()===this._currentDockStateSetting.get()){var index=this._states.indexOf(this._currentDockStateSetting.get())||0;this._lastDockStateSetting.set(this._states[(index+1)%this._states.length]);}
this.setDockSide(this._lastDockStateSetting.get());},__proto__:WebInspector.Object.prototype}
WebInspector.DockController.ToggleDockActionDelegate=function()
{}
WebInspector.DockController.ToggleDockActionDelegate.prototype={handleAction:function(context,actionId)
{WebInspector.dockController._toggleDockSide();return true;}}
WebInspector.DockController.CloseButtonProvider=function()
{}
WebInspector.DockController.CloseButtonProvider.prototype={item:function()
{return WebInspector.dockController._closeButton;}}
WebInspector.dockController;;WebInspector.Drawer=function(splitWidget)
{WebInspector.VBox.call(this);this.element.id="drawer-contents";this._splitWidget=splitWidget;splitWidget.hideDefaultResizer();splitWidget.setSidebarWidget(this);this._tabbedPane=new WebInspector.TabbedPane();this._tabbedPane.element.id="drawer-tabbed-pane";this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,this._tabSelected,this);var toolbar=new WebInspector.Toolbar("drawer-close-toolbar");var closeButton=new WebInspector.ToolbarButton(WebInspector.UIString("Close drawer"),"delete-toolbar-item");closeButton.addEventListener("click",this.closeDrawer.bind(this));toolbar.appendToolbarItem(closeButton);this._tabbedPane.appendAfterTabStrip(toolbar.element);this._extensibleTabbedPaneController=new WebInspector.ExtensibleTabbedPaneController(this._tabbedPane,"drawer-view");this._extensibleTabbedPaneController.enableMoreTabsButton();splitWidget.installResizer(this._tabbedPane.headerElement());this._lastSelectedViewSetting=WebInspector.settings.createSetting("WebInspector.Drawer.lastSelectedView","console");this._tabbedPane.show(this.element);}
WebInspector.Drawer.prototype={showView:function(id,immediate)
{this._innerShow(immediate);WebInspector.userMetrics.drawerShown(id);return this._extensibleTabbedPaneController.showTab(id);},showDrawer:function()
{this._innerShow();},wasShown:function()
{var id=this._lastSelectedViewSetting.get();if(!this._firstTabSelected&&this._tabbedPane.hasTab(id))
this.showView(id);},willHide:function()
{},_innerShow:function(immediate)
{if(this.isShowing())
return;this._splitWidget.showBoth(!immediate);if(this._visibleView())
this._visibleView().focus();},closeDrawer:function()
{if(!this.isShowing())
return;WebInspector.restoreFocusFromElement(this.element);this._splitWidget.hideSidebar(true);},_visibleView:function()
{return this._tabbedPane.visibleView;},_tabSelected:function(event)
{this._firstTabSelected=true;var tabId=this._tabbedPane.selectedTabId;if(tabId&&event.data["isUserGesture"])
this._lastSelectedViewSetting.set(tabId);},selectedViewId:function()
{return this._tabbedPane.selectedTabId;},initialPanelShown:function()
{this._initialPanelWasShown=true;},__proto__:WebInspector.VBox.prototype};WebInspector.ExecutionContextSelector=function(targetManager,context)
{targetManager.observeTargets(this);context.addFlavorChangeListener(WebInspector.ExecutionContext,this._executionContextChanged,this);context.addFlavorChangeListener(WebInspector.Target,this._targetChanged,this);targetManager.addModelListener(WebInspector.RuntimeModel,WebInspector.RuntimeModel.Events.ExecutionContextCreated,this._onExecutionContextCreated,this);targetManager.addModelListener(WebInspector.RuntimeModel,WebInspector.RuntimeModel.Events.ExecutionContextDestroyed,this._onExecutionContextDestroyed,this);this._targetManager=targetManager;this._context=context;}
WebInspector.ExecutionContextSelector.prototype={targetAdded:function(target)
{if(!target.hasJSContext())
return;setImmediate(deferred.bind(this));function deferred()
{if(!this._context.flavor(WebInspector.Target))
this._context.setFlavor(WebInspector.Target,target);}},targetRemoved:function(target)
{if(!target.hasJSContext())
return;var currentExecutionContext=this._context.flavor(WebInspector.ExecutionContext);if(currentExecutionContext&&currentExecutionContext.target()===target)
this._currentExecutionContextGone();var targets=this._targetManager.targetsWithJSContext();if(this._context.flavor(WebInspector.Target)===target&&targets.length)
this._context.setFlavor(WebInspector.Target,targets[0]);},_executionContextChanged:function(event)
{var newContext=(event.data);if(newContext){this._context.setFlavor(WebInspector.Target,newContext.target());if(!this._contextIsGoingAway)
this._lastSelectedContextId=this._contextPersistentId(newContext);}},_contextPersistentId:function(executionContext)
{return executionContext.isMainWorldContext?executionContext.target().name()+":"+executionContext.frameId:"";},_targetChanged:function(event)
{var newTarget=(event.data);var currentContext=this._context.flavor(WebInspector.ExecutionContext);if(!newTarget||(currentContext&&currentContext.target()===newTarget))
return;var executionContexts=newTarget.runtimeModel.executionContexts();if(!executionContexts.length)
return;var newContext=executionContexts[0];for(var i=1;i<executionContexts.length;++i){if(executionContexts[i].isMainWorldContext)
newContext=executionContexts[i];}
this._context.setFlavor(WebInspector.ExecutionContext,newContext);},_onExecutionContextCreated:function(event)
{var executionContext=(event.data);if(!this._context.flavor(WebInspector.ExecutionContext)||(this._lastSelectedContextId&&this._lastSelectedContextId===this._contextPersistentId(executionContext)))
this._context.setFlavor(WebInspector.ExecutionContext,executionContext);},_onExecutionContextDestroyed:function(event)
{var executionContext=(event.data);if(this._context.flavor(WebInspector.ExecutionContext)===executionContext)
this._currentExecutionContextGone();},_currentExecutionContextGone:function()
{var targets=this._targetManager.targetsWithJSContext();var newContext=null;for(var i=0;i<targets.length;++i){if(targets[i].isServiceWorker())
continue;var executionContexts=targets[i].runtimeModel.executionContexts();if(executionContexts.length){newContext=executionContexts[0];break;}}
this._contextIsGoingAway=true;this._context.setFlavor(WebInspector.ExecutionContext,newContext);this._contextIsGoingAway=false;}}
WebInspector.ExecutionContextSelector.completionsForTextPromptInCurrentContext=function(proxyElement,text,cursorOffset,wordRange,force,completionsReadyCallback)
{var executionContext=WebInspector.context.flavor(WebInspector.ExecutionContext);if(!executionContext){completionsReadyCallback([]);return;}
var expressionRange=wordRange.startContainer.rangeOfWord(wordRange.startOffset," =:({;,!+-*/&|^<>",proxyElement,"backward");var expressionString=expressionRange.toString();var pos=expressionString.lastIndexOf("[",expressionString.length-2);if(pos!==-1)
expressionString=expressionString.substr(pos+1);var prefix=wordRange.toString();executionContext.completionsForExpression(expressionString,text,cursorOffset,prefix,force,completionsReadyCallback);};WebInspector.ExecutionContextModel=function(selectElement)
{this._selectElement=selectElement;this._optionByExecutionContext=new Map();WebInspector.targetManager.observeTargets(this);WebInspector.targetManager.addModelListener(WebInspector.RuntimeModel,WebInspector.RuntimeModel.Events.ExecutionContextCreated,this._onExecutionContextCreated,this);WebInspector.targetManager.addModelListener(WebInspector.RuntimeModel,WebInspector.RuntimeModel.Events.ExecutionContextDestroyed,this._onExecutionContextDestroyed,this);WebInspector.targetManager.addModelListener(WebInspector.ResourceTreeModel,WebInspector.ResourceTreeModel.EventTypes.FrameNavigated,this._onFrameNavigated,this);this._selectElement.addEventListener("change",this._executionContextChanged.bind(this),false);WebInspector.context.addFlavorChangeListener(WebInspector.ExecutionContext,this._executionContextChangedExternally,this);}
WebInspector.ExecutionContextModel.prototype={_titleFor:function(executionContext)
{var result;if(executionContext.isMainWorldContext){if(executionContext.frameId){var frame=executionContext.target().resourceTreeModel.frameForId(executionContext.frameId);result=frame?frame.displayName():(executionContext.origin||executionContext.name);}else{var parsedUrl=executionContext.origin.asParsedURL();var name=parsedUrl?parsedUrl.lastPathComponentWithFragment():executionContext.name;result=executionContext.target().decorateLabel(name);}}else{result="\u00a0\u00a0\u00a0\u00a0"+(executionContext.name||executionContext.origin);}
var maxLength=50;return result.trimMiddle(maxLength);},_executionContextCreated:function(executionContext)
{if(executionContext.target().isServiceWorker())
return;var newOption=createElement("option");newOption.__executionContext=executionContext;newOption.text=this._titleFor(executionContext);this._optionByExecutionContext.set(executionContext,newOption);var options=this._selectElement.options;var contexts=Array.prototype.map.call(options,mapping);var index=insertionIndexForObjectInListSortedByFunction(executionContext,contexts,WebInspector.ExecutionContext.comparator);this._selectElement.insertBefore(newOption,options[index]);if(executionContext===WebInspector.context.flavor(WebInspector.ExecutionContext))
this._select(newOption);function mapping(option)
{return option.__executionContext;}},_onExecutionContextCreated:function(event)
{var executionContext=(event.data);this._executionContextCreated(executionContext);},_executionContextDestroyed:function(executionContext)
{var option=this._optionByExecutionContext.remove(executionContext);option.remove();},_onExecutionContextDestroyed:function(event)
{var executionContext=(event.data);this._executionContextDestroyed(executionContext);},_onFrameNavigated:function(event)
{var frame=(event.data);var executionContexts=this._optionByExecutionContext.keysArray();for(var i=0;i<executionContexts.length;++i){var context=executionContexts[i];if(context.frameId===frame.id)
this._optionByExecutionContext.get(context).text=this._titleFor(context);}},_executionContextChangedExternally:function(event)
{var executionContext=(event.data);if(!executionContext)
return;var options=this._selectElement.options;for(var i=0;i<options.length;++i){if(options[i].__executionContext===executionContext)
this._select(options[i]);}},_executionContextChanged:function()
{var option=this._selectedOption();var newContext=option?option.__executionContext:null;WebInspector.context.setFlavor(WebInspector.ExecutionContext,newContext);},targetAdded:function(target)
{target.runtimeModel.executionContexts().forEach(this._executionContextCreated,this);},targetRemoved:function(target)
{var executionContexts=this._optionByExecutionContext.keysArray();for(var i=0;i<executionContexts.length;++i){if(executionContexts[i].target()===target)
this._executionContextDestroyed(executionContexts[i]);}},_select:function(option)
{this._selectElement.selectedIndex=Array.prototype.indexOf.call((this._selectElement),option);},_selectedOption:function()
{if(this._selectElement.selectedIndex>=0)
return this._selectElement[this._selectElement.selectedIndex];return null;}};WebInspector.HandlerRegistry=function(setting)
{WebInspector.Object.call(this);this._handlers={};this._setting=setting;this._activeHandler=this._setting.get();}
WebInspector.HandlerRegistry.prototype={get handlerNames()
{return Object.getOwnPropertyNames(this._handlers);},get activeHandler()
{return this._activeHandler;},set activeHandler(value)
{this._activeHandler=value;this._setting.set(value);},dispatch:function(data)
{return this.dispatchToHandler(this._activeHandler,data);},dispatchToHandler:function(name,data)
{var handler=this._handlers[name];var result=handler&&handler(data);return!!result;},registerHandler:function(name,handler)
{this._handlers[name]=handler;this.dispatchEventToListeners(WebInspector.HandlerRegistry.EventTypes.HandlersUpdated);},unregisterHandler:function(name)
{delete this._handlers[name];this.dispatchEventToListeners(WebInspector.HandlerRegistry.EventTypes.HandlersUpdated);},_openInNewTab:function(url)
{InspectorFrontendHost.openInNewTab(url);},_appendContentProviderItems:function(contextMenu,target)
{if(!(target instanceof WebInspector.UISourceCode||target instanceof WebInspector.Resource||target instanceof WebInspector.NetworkRequest))
return;var contentProvider=(target);if(!contentProvider.contentURL())
return;contextMenu.appendItem(WebInspector.openLinkExternallyLabel(),this._openInNewTab.bind(this,contentProvider.contentURL()));for(var i=1;i<this.handlerNames.length;++i){var handler=this.handlerNames[i];contextMenu.appendItem(WebInspector.UIString.capitalize("Open ^using %s",handler),this.dispatchToHandler.bind(this,handler,{url:contentProvider.contentURL()}));}
contextMenu.appendItem(WebInspector.copyLinkAddressLabel(),InspectorFrontendHost.copyText.bind(InspectorFrontendHost,contentProvider.contentURL()));if(!contentProvider.contentURL())
return;if(!contentProvider.contentType().isDocumentOrScriptOrStyleSheet())
return;function doSave(forceSaveAs,content)
{var url=contentProvider.contentURL();WebInspector.fileManager.save(url,(content),forceSaveAs);WebInspector.fileManager.close(url);}
function save(forceSaveAs)
{if(contentProvider instanceof WebInspector.UISourceCode){var uiSourceCode=(contentProvider);if(forceSaveAs)
uiSourceCode.saveAs();else
uiSourceCode.commitWorkingCopy();return;}
contentProvider.requestContent(doSave.bind(null,forceSaveAs));}
contextMenu.appendSeparator();contextMenu.appendItem(WebInspector.UIString("Save"),save.bind(null,false));if(contentProvider instanceof WebInspector.UISourceCode){var uiSourceCode=(contentProvider);if(uiSourceCode.project().type()!==WebInspector.projectTypes.FileSystem&&uiSourceCode.project().type()!==WebInspector.projectTypes.Snippets)
contextMenu.appendItem(WebInspector.UIString.capitalize("Save ^as..."),save.bind(null,true));}},_appendHrefItems:function(contextMenu,target)
{if(!(target instanceof Node))
return;var targetNode=(target);var anchorElement=targetNode.enclosingNodeOrSelfWithClass("webkit-html-resource-link")||targetNode.enclosingNodeOrSelfWithClass("webkit-html-external-link");if(!anchorElement)
return;var uiLocation=WebInspector.Linkifier.uiLocationByAnchor(anchorElement);var resourceURL=uiLocation?uiLocation.uiSourceCode.contentURL():anchorElement.href;var uiSourceCode=uiLocation?uiLocation.uiSourceCode:(resourceURL?WebInspector.networkMapping.uiSourceCodeForURLForAnyTarget(resourceURL):null);function open()
{WebInspector.Revealer.reveal(uiSourceCode);}
if(uiSourceCode)
contextMenu.appendItem("Open",open);if(!resourceURL)
return;contextMenu.appendItem(WebInspector.openLinkExternallyLabel(),this._openInNewTab.bind(this,resourceURL));function openInResourcesPanel(resourceURL)
{var resource=WebInspector.resourceForURL(resourceURL);if(resource)
WebInspector.Revealer.reveal(resource);else
InspectorFrontendHost.openInNewTab(resourceURL);}
if(!targetNode.enclosingNodeOrSelfWithClassList(["resources","panel"])&&WebInspector.resourceForURL(resourceURL))
contextMenu.appendItem(WebInspector.UIString.capitalize("Open ^link in Resources ^panel"),openInResourcesPanel.bind(null,resourceURL));contextMenu.appendItem(WebInspector.copyLinkAddressLabel(),InspectorFrontendHost.copyText.bind(InspectorFrontendHost,resourceURL));},__proto__:WebInspector.Object.prototype}
WebInspector.HandlerRegistry.EventTypes={HandlersUpdated:"HandlersUpdated"}
WebInspector.HandlerSelector=function(handlerRegistry)
{this._handlerRegistry=handlerRegistry;this.element=createElementWithClass("select","chrome-select");this.element.addEventListener("change",this._onChange.bind(this),false);this._update();this._handlerRegistry.addEventListener(WebInspector.HandlerRegistry.EventTypes.HandlersUpdated,this._update.bind(this));}
WebInspector.HandlerSelector.prototype={_update:function()
{this.element.removeChildren();var names=this._handlerRegistry.handlerNames;var activeHandler=this._handlerRegistry.activeHandler;for(var i=0;i<names.length;++i){var option=createElement("option");option.textContent=names[i];option.selected=activeHandler===names[i];this.element.appendChild(option);}
this.element.disabled=names.length<=1;},_onChange:function(event)
{var value=event.target.value;this._handlerRegistry.activeHandler=value;}}
WebInspector.HandlerRegistry.ContextMenuProvider=function()
{}
WebInspector.HandlerRegistry.ContextMenuProvider.prototype={appendApplicableItems:function(event,contextMenu,target)
{WebInspector.openAnchorLocationRegistry._appendContentProviderItems(contextMenu,target);WebInspector.openAnchorLocationRegistry._appendHrefItems(contextMenu,target);}}
WebInspector.HandlerRegistry.LinkHandler=function()
{}
WebInspector.HandlerRegistry.LinkHandler.prototype={handleLink:function(url,lineNumber)
{return WebInspector.openAnchorLocationRegistry.dispatch({url:url,lineNumber:lineNumber});}}
WebInspector.HandlerRegistry.OpenAnchorLocationSettingUI=function()
{}
WebInspector.HandlerRegistry.OpenAnchorLocationSettingUI.prototype={settingElement:function()
{if(!WebInspector.openAnchorLocationRegistry.handlerNames.length)
return null;var handlerSelector=new WebInspector.HandlerSelector(WebInspector.openAnchorLocationRegistry);return WebInspector.SettingsUI.createCustomSetting(WebInspector.UIString("Link handling:"),handlerSelector.element);}}
WebInspector.openAnchorLocationRegistry;;WebInspector.InspectorView=function()
{WebInspector.VBox.call(this);WebInspector.Dialog.setModalHostView(this);WebInspector.GlassPane.DefaultFocusedViewStack.push(this);this.setMinimumSize(240,72);this._drawerSplitWidget=new WebInspector.SplitWidget(false,true,"Inspector.drawerSplitViewState",200,200);this._drawerSplitWidget.hideSidebar();this._drawerSplitWidget.enableShowModeSaving();this._drawerSplitWidget.show(this.element);this._tabbedPane=new WebInspector.TabbedPane();this._tabbedPane.registerRequiredCSS("components/inspectorViewTabbedPane.css");this._tabbedPane.element.classList.add("inspector-view-tabbed-pane");this._tabbedPane.setTabSlider(true);this._tabbedPane.setAllowTabReorder(true,false);this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabOrderChanged,this._persistPanelOrder,this);this._tabOrderSetting=WebInspector.settings.createSetting("InspectorView.panelOrder",{});this._drawerSplitWidget.setMainWidget(this._tabbedPane);this._drawer=new WebInspector.Drawer(this._drawerSplitWidget);this._panels={};WebInspector["panels"]=this._panels;this._history=[];this._historyIterator=-1;this._keyDownBound=this._keyDown.bind(this);this._keyPressBound=this._keyPress.bind(this);this._panelDescriptors={};this._panelPromises={};this._openBracketIdentifiers=["U+005B","U+00DB"].keySet();this._closeBracketIdentifiers=["U+005D","U+00DD"].keySet();this._lastActivePanelSetting=WebInspector.settings.createSetting("lastActivePanel","elements");InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.ShowPanel,showPanel.bind(this));this._loadPanelDesciptors();function showPanel(event)
{var panelName=(event.data);this.showPanel(panelName);}
WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged,this._onSuspendStateChanged.bind(this));};WebInspector.InspectorView.prototype={wasShown:function()
{this.element.ownerDocument.addEventListener("keydown",this._keyDownBound,false);this.element.ownerDocument.addEventListener("keypress",this._keyPressBound,false);},willHide:function()
{this.element.ownerDocument.removeEventListener("keydown",this._keyDownBound,false);this.element.ownerDocument.removeEventListener("keypress",this._keyPressBound,false);},_loadPanelDesciptors:function()
{function processPanelExtensions(extension)
{var descriptor=new WebInspector.RuntimeExtensionPanelDescriptor(extension);var weight=this._tabOrderSetting.get()[descriptor.name()];if(weight===undefined)
weight=extension.descriptor()["order"];if(weight===undefined)
weight=10000;panelWeights.set(descriptor,weight);}
function orderComparator(left,right)
{return panelWeights.get(left)>panelWeights.get(right);}
WebInspector.startBatchUpdate();var panelWeights=new Map();self.runtime.extensions(WebInspector.PanelFactory).forEach(processPanelExtensions.bind(this));var sortedPanels=panelWeights.keysArray().sort(orderComparator);for(var panelDescriptor of sortedPanels)
this._innerAddPanel(panelDescriptor);WebInspector.endBatchUpdate();},createToolbars:function()
{this._leftToolbar=new WebInspector.ExtensibleToolbar("main-toolbar-left");this._leftToolbar.element.classList.add("inspector-view-toolbar","inspector-view-toolbar-left");this._tabbedPane.insertBeforeTabStrip(this._leftToolbar.element);var rightToolbarContainer=createElementWithClass("div","hbox flex-none flex-centered");this._tabbedPane.appendAfterTabStrip(rightToolbarContainer);this._rightToolbar=new WebInspector.ExtensibleToolbar("main-toolbar-right");this._rightToolbar.element.classList.add("inspector-view-toolbar","flex-none");rightToolbarContainer.appendChild(this._rightToolbar.element);},_innerAddPanel:function(panelDescriptor,index)
{var panelName=panelDescriptor.name();this._panelDescriptors[panelName]=panelDescriptor;this._tabbedPane.appendTab(panelName,panelDescriptor.title(),new WebInspector.Widget(),undefined,undefined,undefined,index);if(this._lastActivePanelSetting.get()===panelName)
this._tabbedPane.selectTab(panelName);},addPanel:function(panelDescriptor)
{var weight=this._tabOrderSetting.get()[panelDescriptor.name()];if(weight)
weight=Math.max(0,Math.round(weight/10)-1);this._innerAddPanel(panelDescriptor,weight);},hasPanel:function(panelName)
{return!!this._panelDescriptors[panelName];},panel:function(panelName)
{var panelDescriptor=this._panelDescriptors[panelName];if(!panelDescriptor)
return Promise.reject(new Error("Can't load panel without the descriptor: "+panelName));var promise=this._panelPromises[panelName];if(promise)
return promise;promise=panelDescriptor.panel();this._panelPromises[panelName]=promise;promise.then(cachePanel.bind(this));function cachePanel(panel)
{delete this._panelPromises[panelName];this._panels[panelName]=panel;return panel;}
return promise;},_onSuspendStateChanged:function(event)
{this._currentPanelLocked=WebInspector.targetManager.allTargetsSuspended();this._tabbedPane.setCurrentTabLocked(this._currentPanelLocked);if(this._leftToolbar)
this._leftToolbar.setEnabled(!this._currentPanelLocked);if(this._rightToolbar)
this._rightToolbar.setEnabled(!this._currentPanelLocked);},showPanel:function(panelName)
{if(this._currentPanelLocked){if(this._currentPanel!==this._panels[panelName])
return Promise.reject(new Error("Current panel locked"));return Promise.resolve(this._currentPanel);}
this._panelForShowPromise=this.panel(panelName);return this._panelForShowPromise.then(setCurrentPanelIfNecessary.bind(this,this._panelForShowPromise));function setCurrentPanelIfNecessary(panelPromise,panel)
{if(this._panelForShowPromise!==panelPromise)
return null;this.setCurrentPanel(panel);return panel;}},setPanelIcon:function(panelName,iconType,iconTooltip)
{this._tabbedPane.setTabIcon(panelName,iconType,iconTooltip);},currentPanel:function()
{return this._currentPanel;},showInitialPanel:function()
{if(InspectorFrontendHost.isUnderTest())
return;this._showInitialPanel();},_showInitialPanel:function()
{this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,this._tabSelected,this);this._tabSelected();this._drawer.initialPanelShown();},showInitialPanelForTest:function(panelName)
{this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,this._tabSelected,this);this.setCurrentPanel(this._panels[panelName]);this._drawer.initialPanelShown();},_tabSelected:function()
{var panelName=this._tabbedPane.selectedTabId;if(!panelName)
return;this.showPanel(panelName);},setCurrentPanel:function(panel,suppressBringToFront)
{delete this._panelForShowPromise;if(this._currentPanelLocked)
return this._currentPanel;if(!suppressBringToFront)
InspectorFrontendHost.bringToFront();if(this._currentPanel===panel)
return panel;this._currentPanel=panel;if(!this._panels[panel.name])
this._panels[panel.name]=panel;this._tabbedPane.changeTabView(panel.name,panel);this._tabbedPane.removeEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,this._tabSelected,this);this._tabbedPane.selectTab(panel.name);this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,this._tabSelected,this);this._lastActivePanelSetting.set(panel.name);this._pushToHistory(panel.name);WebInspector.userMetrics.panelShown(panel.name);panel.focus();return panel;},showDrawer:function()
{this._drawer.showDrawer();},drawerVisible:function()
{return this._drawer.isShowing();},showViewInDrawer:function(id,immediate)
{return this._drawer.showView(id,immediate);},selectedViewInDrawer:function()
{return this._drawer.selectedViewId();},closeDrawer:function()
{this._drawer.closeDrawer();},defaultFocusedElement:function()
{return this._currentPanel?this._currentPanel.defaultFocusedElement():null;},_keyPress:function(event)
{if(event.charCode<32&&WebInspector.isWin())
return;clearTimeout(this._keyDownTimer);delete this._keyDownTimer;},_keyDown:function(event)
{if(!WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event))
return;var keyboardEvent=(event);var panelShortcutEnabled=WebInspector.moduleSetting("shortcutPanelSwitch").get();if(panelShortcutEnabled&&!event.shiftKey&&!event.altKey){var panelIndex=-1;if(event.keyCode>0x30&&event.keyCode<0x3A)
panelIndex=event.keyCode-0x31;else if(event.keyCode>0x60&&event.keyCode<0x6A&&keyboardEvent.location===KeyboardEvent.DOM_KEY_LOCATION_NUMPAD)
panelIndex=event.keyCode-0x61;if(panelIndex!==-1){var panelName=this._tabbedPane.allTabs()[panelIndex];if(panelName){if(!WebInspector.Dialog.hasInstance()&&!this._currentPanelLocked)
this.showPanel(panelName);event.consume(true);}
return;}}
if(!WebInspector.isWin()||(!this._openBracketIdentifiers[event.keyIdentifier]&&!this._closeBracketIdentifiers[event.keyIdentifier])){this._keyDownInternal(event);return;}
this._keyDownTimer=setTimeout(this._keyDownInternal.bind(this,event),0);},_keyDownInternal:function(event)
{if(this._currentPanelLocked)
return;var direction=0;if(this._openBracketIdentifiers[event.keyIdentifier])
direction=-1;if(this._closeBracketIdentifiers[event.keyIdentifier])
direction=1;if(!direction)
return;if(!event.shiftKey&&!event.altKey){if(!WebInspector.Dialog.hasInstance())
this._changePanelInDirection(direction);event.consume(true);return;}
if(event.altKey&&this._moveInHistory(direction))
event.consume(true);},_changePanelInDirection:function(direction)
{var panelOrder=this._tabbedPane.allTabs();var index=panelOrder.indexOf(this.currentPanel().name);index=(index+panelOrder.length+direction)%panelOrder.length;this.showPanel(panelOrder[index]);},_moveInHistory:function(move)
{var newIndex=this._historyIterator+move;if(newIndex>=this._history.length||newIndex<0)
return false;this._inHistory=true;this._historyIterator=newIndex;if(!WebInspector.Dialog.hasInstance())
this.setCurrentPanel(this._panels[this._history[this._historyIterator]]);delete this._inHistory;return true;},_pushToHistory:function(panelName)
{if(this._inHistory)
return;this._history.splice(this._historyIterator+1,this._history.length-this._historyIterator-1);if(!this._history.length||this._history[this._history.length-1]!==panelName)
this._history.push(panelName);this._historyIterator=this._history.length-1;},onResize:function()
{WebInspector.Dialog.modalHostRepositioned();},topResizerElement:function()
{return this._tabbedPane.headerElement();},toolbarItemResized:function()
{this._tabbedPane.headerResized();},_persistPanelOrder:function(event)
{var tabs=(event.data);var tabOrders=this._tabOrderSetting.get();for(var i=0;i<tabs.length;i++)
tabOrders[tabs[i].id]=(i+1)*10;this._tabOrderSetting.set(tabOrders);},__proto__:WebInspector.VBox.prototype};WebInspector.inspectorView;WebInspector.InspectorView.DrawerToggleActionDelegate=function()
{}
WebInspector.InspectorView.DrawerToggleActionDelegate.prototype={handleAction:function(context,actionId)
{if(WebInspector.inspectorView.drawerVisible())
WebInspector.inspectorView.closeDrawer();else
WebInspector.inspectorView.showDrawer();return true;}};WebInspector.LinkifierFormatter=function()
{}
WebInspector.LinkifierFormatter.prototype={formatLiveAnchor:function(anchor,uiLocation){}}
WebInspector.Linkifier=function(formatter)
{this._formatter=formatter||new WebInspector.Linkifier.DefaultFormatter(WebInspector.Linkifier.MaxLengthForDisplayedURLs);this._liveLocationsByTarget=new Map();WebInspector.targetManager.observeTargets(this);}
WebInspector.Linkifier.setLinkHandler=function(handler)
{WebInspector.Linkifier._linkHandler=handler;}
WebInspector.Linkifier.handleLink=function(url,lineNumber)
{if(!WebInspector.Linkifier._linkHandler)
return false;return WebInspector.Linkifier._linkHandler.handleLink(url,lineNumber);}
WebInspector.Linkifier.linkifyUsingRevealer=function(revealable,text,fallbackHref,fallbackLineNumber,title,classes)
{var a=createElement("a");a.className=(classes||"")+" webkit-html-resource-link";a.textContent=text.trimMiddle(WebInspector.Linkifier.MaxLengthForDisplayedURLs);a.title=title||text;if(fallbackHref){a.href=fallbackHref;a.lineNumber=fallbackLineNumber;}
function clickHandler(event)
{event.stopImmediatePropagation();event.preventDefault();if(fallbackHref&&WebInspector.Linkifier.handleLink(fallbackHref,fallbackLineNumber))
return;WebInspector.Revealer.reveal(this);}
a.addEventListener("click",clickHandler.bind(revealable),false);return a;}
WebInspector.Linkifier._uiLocationSymbol=Symbol("uiLocation");WebInspector.Linkifier._fallbackAnchorSymbol=Symbol("fallbackAnchor");WebInspector.Linkifier.prototype={targetAdded:function(target)
{this._liveLocationsByTarget.set(target,new Map());},targetRemoved:function(target)
{var liveLocations=this._liveLocationsByTarget.remove(target);var anchors=liveLocations.keysArray();for(var i=0;i<anchors.length;++i){var anchor=anchors[i];var location=liveLocations.get(anchor);delete anchor[WebInspector.Linkifier._uiLocationSymbol];var fallbackAnchor=anchor[WebInspector.Linkifier._fallbackAnchorSymbol];if(fallbackAnchor){anchor.href=fallbackAnchor.href;anchor.lineNumber=fallbackAnchor.lineNumber;anchor.title=fallbackAnchor.title;anchor.className=fallbackAnchor.className;anchor.textContent=fallbackAnchor.textContent;delete anchor[WebInspector.Linkifier._fallbackAnchorSymbol];}
location.dispose();}},linkifyScriptLocation:function(target,scriptId,sourceURL,lineNumber,columnNumber,classes)
{var fallbackAnchor=WebInspector.linkifyResourceAsNode(sourceURL,lineNumber,columnNumber,classes);if(!target||target.isDetached())
return fallbackAnchor;var debuggerModel=WebInspector.DebuggerModel.fromTarget(target);if(!debuggerModel)
return fallbackAnchor;var rawLocation=scriptId?debuggerModel.createRawLocationByScriptId(scriptId,lineNumber,columnNumber||0):debuggerModel.createRawLocationByURL(sourceURL,lineNumber,columnNumber||0);if(!rawLocation)
return fallbackAnchor;var anchor=this._createAnchor(classes);var liveLocation=WebInspector.debuggerWorkspaceBinding.createLiveLocation(rawLocation,this._updateAnchor.bind(this,anchor));this._liveLocationsByTarget.get(rawLocation.target()).set(anchor,liveLocation);anchor[WebInspector.Linkifier._fallbackAnchorSymbol]=fallbackAnchor;return anchor;},linkifyRawLocation:function(rawLocation,fallbackUrl,classes)
{return this.linkifyScriptLocation(rawLocation.target(),rawLocation.scriptId,fallbackUrl,rawLocation.lineNumber,rawLocation.columnNumber,classes);},linkifyConsoleCallFrame:function(target,callFrame,classes)
{var lineNumber=callFrame.lineNumber?callFrame.lineNumber-1:0;var columnNumber=callFrame.columnNumber?callFrame.columnNumber-1:0;var anchor=this.linkifyScriptLocation(target,callFrame.scriptId,callFrame.url,lineNumber,columnNumber,classes);var debuggerModel=WebInspector.DebuggerModel.fromTarget(target);var script=debuggerModel&&debuggerModel.scriptForId(callFrame.scriptId);var blackboxed=script?WebInspector.BlackboxSupport.isBlackboxed(script.sourceURL,script.isContentScript()):WebInspector.BlackboxSupport.isBlackboxedURL(callFrame.url);if(blackboxed)
anchor.classList.add("webkit-html-blackbox-link");return anchor;},linkifyCSSLocation:function(rawLocation,classes)
{var anchor=this._createAnchor(classes);var liveLocation=WebInspector.cssWorkspaceBinding.createLiveLocation(rawLocation,this._updateAnchor.bind(this,anchor));this._liveLocationsByTarget.get(rawLocation.target()).set(anchor,liveLocation);return anchor;},disposeAnchor:function(target,anchor)
{delete anchor[WebInspector.Linkifier._uiLocationSymbol];delete anchor[WebInspector.Linkifier._fallbackAnchorSymbol];var liveLocations=this._liveLocationsByTarget.get(target);if(!liveLocations)
return;var location=liveLocations.remove(anchor);if(location)
location.dispose();},_createAnchor:function(classes)
{var anchor=createElement("a");anchor.className=(classes||"")+" webkit-html-resource-link";function clickHandler(event)
{var uiLocation=anchor[WebInspector.Linkifier._uiLocationSymbol];if(!uiLocation)
return;event.consume(true);var networkURL=WebInspector.networkMapping.networkURL(uiLocation.uiSourceCode);if(WebInspector.Linkifier.handleLink(networkURL,uiLocation.lineNumber))
return;WebInspector.Revealer.reveal(uiLocation);}
anchor.addEventListener("click",clickHandler,false);return anchor;},reset:function()
{var targets=this._liveLocationsByTarget.keysArray();for(var i=0;i<targets.length;++i){var target=targets[i];this.targetRemoved(target);this.targetAdded(target);}},dispose:function()
{this.reset();WebInspector.targetManager.unobserveTargets(this);this._liveLocationsByTarget.clear();},_updateAnchor:function(anchor,uiLocation)
{anchor[WebInspector.Linkifier._uiLocationSymbol]=uiLocation;this._formatter.formatLiveAnchor(anchor,uiLocation);}}
WebInspector.Linkifier.uiLocationByAnchor=function(anchor)
{return anchor[WebInspector.Linkifier._uiLocationSymbol];}
WebInspector.Linkifier.DefaultFormatter=function(maxLength)
{this._maxLength=maxLength;}
WebInspector.Linkifier.DefaultFormatter.prototype={formatLiveAnchor:function(anchor,uiLocation)
{var text=uiLocation.linkText();text=text.replace(/([a-f0-9]{7})[a-f0-9]{13}[a-f0-9]*/g,"$1\u2026");if(this._maxLength)
text=text.trimMiddle(this._maxLength);anchor.textContent=text;var titleText=uiLocation.uiSourceCode.url();if(typeof uiLocation.lineNumber==="number")
titleText+=":"+(uiLocation.lineNumber+1);anchor.title=titleText;}}
WebInspector.Linkifier.DefaultCSSFormatter=function()
{WebInspector.Linkifier.DefaultFormatter.call(this,WebInspector.Linkifier.DefaultCSSFormatter.MaxLengthForDisplayedURLs);}
WebInspector.Linkifier.DefaultCSSFormatter.MaxLengthForDisplayedURLs=30;WebInspector.Linkifier.DefaultCSSFormatter.prototype={formatLiveAnchor:function(anchor,uiLocation)
{WebInspector.Linkifier.DefaultFormatter.prototype.formatLiveAnchor.call(this,anchor,uiLocation);anchor.classList.add("webkit-html-resource-link");anchor.setAttribute("data-uncopyable",anchor.textContent);anchor.textContent="";},__proto__:WebInspector.Linkifier.DefaultFormatter.prototype}
WebInspector.Linkifier.MaxLengthForDisplayedURLs=150;WebInspector.Linkifier.LinkHandler=function()
{}
WebInspector.Linkifier.LinkHandler.prototype={handleLink:function(url,lineNumber){}}
WebInspector.Linkifier.liveLocationText=function(target,scriptId,lineNumber,columnNumber)
{var debuggerModel=WebInspector.DebuggerModel.fromTarget(target);if(!debuggerModel)
return"";var script=debuggerModel.scriptForId(scriptId);if(!script)
return"";var location=(debuggerModel.createRawLocation(script,lineNumber,columnNumber||0));var uiLocation=(WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation(location));return uiLocation.linkText();}
WebInspector.linkifyStringAsFragmentWithCustomLinkifier=function(string,linkifier)
{var container=createDocumentFragment();var linkStringRegEx=/(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\/\/|data:|www\.)[\w$\-_+*'=\|\/\\(){}[\]^%@&#~,:;.!?]{2,}[\w$\-_+*=\|\/\\({^%@&#~]/;while(string&&string.length<10000){var linkString=linkStringRegEx.exec(string);if(!linkString)
break;linkString=linkString[0];var linkIndex=string.indexOf(linkString);var nonLink=string.substring(0,linkIndex);container.appendChild(createTextNode(nonLink));var title=linkString;var realURL=(linkString.startsWith("www.")?"http://"+linkString:linkString);var splitResult=WebInspector.ParsedURL.splitLineAndColumn(realURL);var linkNode;if(splitResult)
linkNode=linkifier(title,splitResult.url,splitResult.lineNumber,splitResult.columnNumber);else
linkNode=linkifier(title,realURL);container.appendChild(linkNode);string=string.substring(linkIndex+linkString.length,string.length);}
if(string)
container.appendChild(createTextNode(string));return container;}
WebInspector.linkifyStringAsFragment=function(string)
{function linkifier(title,url,lineNumber,columnNumber)
{var isExternal=!WebInspector.resourceForURL(url)&&!WebInspector.networkMapping.uiSourceCodeForURLForAnyTarget(url);var urlNode=WebInspector.linkifyURLAsNode(url,title,undefined,isExternal);if(typeof lineNumber!=="undefined"){urlNode.lineNumber=lineNumber;if(typeof columnNumber!=="undefined")
urlNode.columnNumber=columnNumber;}
return urlNode;}
return WebInspector.linkifyStringAsFragmentWithCustomLinkifier(string,linkifier);}
WebInspector.linkifyURLAsNode=function(url,linkText,classes,isExternal,tooltipText)
{if(!linkText)
linkText=url;classes=(classes?classes+" ":"");classes+=isExternal?"webkit-html-external-link":"webkit-html-resource-link";var a=createElement("a");var href=sanitizeHref(url);if(href!==null)
a.href=href;a.className=classes;if(!tooltipText&&linkText!==url)
a.title=url;else if(tooltipText)
a.title=tooltipText;a.textContent=linkText.trimMiddle(WebInspector.Linkifier.MaxLengthForDisplayedURLs);if(isExternal)
a.setAttribute("target","_blank");return a;}
WebInspector.linkifyDocumentationURLAsNode=function(article,title)
{return WebInspector.linkifyURLAsNode("https://developers.google.com/web/tools/chrome-devtools/"+article,title,undefined,true);}
WebInspector.linkifyResourceAsNode=function(url,lineNumber,columnNumber,classes,tooltipText,urlDisplayName)
{var linkText=urlDisplayName?urlDisplayName:url?WebInspector.displayNameForURL(url):WebInspector.UIString("(program)");if(typeof lineNumber==="number")
linkText+=":"+(lineNumber+1);var anchor=WebInspector.linkifyURLAsNode(url,linkText,classes,false,tooltipText);anchor.lineNumber=lineNumber;anchor.columnNumber=columnNumber;return anchor;}
WebInspector.linkifyRequestAsNode=function(request)
{var anchor=WebInspector.linkifyURLAsNode(request.url);anchor.requestId=request.requestId;return anchor;};WebInspector.NetworkConditionsSelector=function(selectElement)
{this._selectElement=selectElement;this._selectElement.addEventListener("change",this._optionSelected.bind(this),false);this._customSetting=WebInspector.moduleSetting("networkConditionsCustomProfiles");this._customSetting.addChangeListener(this._populateOptions,this);this._manager=WebInspector.multitargetNetworkManager;this._manager.addEventListener(WebInspector.MultitargetNetworkManager.Events.ConditionsChanged,this._conditionsChanged,this);this._populateOptions();}
WebInspector.NetworkConditionsProfile;WebInspector.NetworkConditionsSelector.throughputText=function(throughput)
{if(throughput<0)
return"";var throughputInKbps=throughput/(1024/8);return(throughputInKbps<1024)?WebInspector.UIString("%d kb/s",throughputInKbps):WebInspector.UIString("%d Mb/s",(throughputInKbps/1024)|0);}
WebInspector.NetworkConditionsSelector._networkConditionsPresets=[{title:"Offline",value:{download:0*1024/8,upload:0*1024/8,latency:0}},{title:"GPRS",value:{download:50*1024/8,upload:20*1024/8,latency:500}},{title:"Regular 2G",value:{download:250*1024/8,upload:50*1024/8,latency:300}},{title:"Good 2G",value:{download:450*1024/8,upload:150*1024/8,latency:150}},{title:"Regular 3G",value:{download:750*1024/8,upload:250*1024/8,latency:100}},{title:"Good 3G",value:{download:1.5*1024*1024/8,upload:750*1024/8,latency:40}},{title:"Regular 4G",value:{download:4*1024*1024/8,upload:3*1024*1024/8,latency:20}},{title:"DSL",value:{download:2*1024*1024/8,upload:1*1024*1024/8,latency:5}},{title:"WiFi",value:{download:30*1024*1024/8,upload:15*1024*1024/8,latency:2}}];WebInspector.NetworkConditionsSelector._disabledPreset={title:"No throttling",value:{download:-1,upload:-1,latency:0}};WebInspector.NetworkConditionsSelector.prototype={_populateOptions:function()
{this._selectElement.removeChildren();var customGroup=this._addGroup(this._customSetting.get(),WebInspector.UIString("Custom"));customGroup.insertBefore(new Option(WebInspector.UIString("Add\u2026"),WebInspector.UIString("Add\u2026")),customGroup.firstChild);this._addGroup(WebInspector.NetworkConditionsSelector._networkConditionsPresets,WebInspector.UIString("Presets"));this._addGroup([WebInspector.NetworkConditionsSelector._disabledPreset],WebInspector.UIString("Disabled"));this._conditionsChanged();},_addGroup:function(presets,groupName)
{var groupElement=this._selectElement.createChild("optgroup");groupElement.label=groupName;for(var i=0;i<presets.length;++i){var preset=presets[i];var downloadInKbps=preset.value.download/(1024/8);var uploadInKbps=preset.value.upload/(1024/8);var isThrottling=(downloadInKbps>=0)||(uploadInKbps>=0)||(preset.value.latency>0);var option;var presetTitle=WebInspector.UIString(preset.title);if(!isThrottling){option=new Option(presetTitle,presetTitle);}else{var downloadText=WebInspector.NetworkConditionsSelector.throughputText(preset.value.download);var uploadText=WebInspector.NetworkConditionsSelector.throughputText(preset.value.upload);var title=WebInspector.UIString("%s (%s\u2b07 %s\u2b06 %dms RTT)",presetTitle,downloadText,uploadText,preset.value.latency);option=new Option(title,presetTitle);option.title=WebInspector.UIString("Maximum download throughput: %s.\r\nMaximum upload throughput: %s.\r\nMinimum round-trip time: %dms.",downloadText,uploadText,preset.value.latency);}
option.conditions=preset.value;groupElement.appendChild(option);}
return groupElement;},_optionSelected:function()
{if(this._selectElement.selectedIndex===0){WebInspector.Revealer.reveal(this._customSetting);this._conditionsChanged();return;}
this._manager.removeEventListener(WebInspector.MultitargetNetworkManager.Events.ConditionsChanged,this._conditionsChanged,this);this._manager.setNetworkConditions(this._selectElement.options[this._selectElement.selectedIndex].conditions);this._manager.addEventListener(WebInspector.MultitargetNetworkManager.Events.ConditionsChanged,this._conditionsChanged,this);},_conditionsChanged:function()
{var value=this._manager.networkConditions();var options=this._selectElement.options;for(var index=1;index<options.length;++index){var option=options[index];if(option.conditions.download===value.download&&option.conditions.upload===value.upload&&option.conditions.latency===value.latency)
this._selectElement.selectedIndex=index;}}}
WebInspector.NetworkConditionsSettingsTab=function()
{WebInspector.VBox.call(this);this.element.classList.add("settings-tab-container");this.element.classList.add("network-conditions-settings-tab");this.registerRequiredCSS("components/networkConditionsSettingsTab.css");var header=this.element.createChild("header");header.createChild("h3").createTextChild(WebInspector.UIString("Network Throttling Profiles"));this.containerElement=this.element.createChild("div","help-container-wrapper").createChild("div","settings-tab help-content help-container");var buttonsRow=this.containerElement.createChild("div","button-row");var addButton=createTextButton(WebInspector.UIString("Add custom profile..."),this._addButtonClicked.bind(this));buttonsRow.appendChild(addButton);this._list=new WebInspector.ListWidget(this);this._list.registerRequiredCSS("components/networkConditionsSettingsTab.css");this._list.show(this.containerElement);this._customSetting=WebInspector.moduleSetting("networkConditionsCustomProfiles");this._customSetting.addChangeListener(this._conditionsUpdated,this);this.setDefaultFocusedElement(addButton);}
WebInspector.NetworkConditionsSettingsTab.prototype={wasShown:function()
{WebInspector.VBox.prototype.wasShown.call(this);this._conditionsUpdated();},_conditionsUpdated:function()
{this._list.clear();var conditions=this._customSetting.get();for(var i=0;i<conditions.length;++i)
this._list.appendItem(conditions[i],true);this._list.appendSeparator();conditions=WebInspector.NetworkConditionsSelector._networkConditionsPresets;for(var i=0;i<conditions.length;++i)
this._list.appendItem(conditions[i],false);},_addButtonClicked:function()
{this._list.addNewItem(this._customSetting.get().length,{title:"",value:{download:-1,upload:-1,latency:0}});},renderItem:function(item,editable)
{var conditions=(item);var element=createElementWithClass("div","conditions-list-item");var title=element.createChild("div","conditions-list-text conditions-list-title");var titleText=title.createChild("div","conditions-list-title-text");titleText.textContent=conditions.title;titleText.title=conditions.title;element.createChild("div","conditions-list-separator");element.createChild("div","conditions-list-text").textContent=WebInspector.NetworkConditionsSelector.throughputText(conditions.value.download);element.createChild("div","conditions-list-separator");element.createChild("div","conditions-list-text").textContent=WebInspector.NetworkConditionsSelector.throughputText(conditions.value.upload);element.createChild("div","conditions-list-separator");element.createChild("div","conditions-list-text").textContent=WebInspector.UIString("%dms",conditions.value.latency);return element;},removeItemRequested:function(item,index)
{var list=this._customSetting.get();list.splice(index,1);this._customSetting.set(list);},commitEdit:function(item,editor,isNew)
{var conditions=(item);conditions.title=editor.control("title").value.trim();var download=editor.control("download").value.trim();conditions.value.download=download?parseInt(download,10)*(1024/8):-1;var upload=editor.control("upload").value.trim();conditions.value.upload=upload?parseInt(upload,10)*(1024/8):-1;var latency=editor.control("latency").value.trim();conditions.value.latency=latency?parseInt(latency,10):0;var list=this._customSetting.get();if(isNew)
list.push(conditions);this._customSetting.set(list);},beginEdit:function(item)
{var conditions=(item);var editor=this._createEditor();editor.control("title").value=conditions.title;editor.control("download").value=conditions.value.download<=0?"":String(conditions.value.download/(1024/8));editor.control("upload").value=conditions.value.upload<=0?"":String(conditions.value.upload/(1024/8));editor.control("latency").value=conditions.value.latency?String(conditions.value.latency):"";return editor;},_createEditor:function()
{if(this._editor)
return this._editor;var editor=new WebInspector.ListWidget.Editor();this._editor=editor;var content=editor.contentElement();var titles=content.createChild("div","conditions-edit-row");titles.createChild("div","conditions-list-text conditions-list-title").textContent=WebInspector.UIString("Profile Name");titles.createChild("div","conditions-list-separator conditions-list-separator-invisible");titles.createChild("div","conditions-list-text").textContent=WebInspector.UIString("Download");titles.createChild("div","conditions-list-separator conditions-list-separator-invisible");titles.createChild("div","conditions-list-text").textContent=WebInspector.UIString("Upload");titles.createChild("div","conditions-list-separator conditions-list-separator-invisible");titles.createChild("div","conditions-list-text").textContent=WebInspector.UIString("Latency");var fields=content.createChild("div","conditions-edit-row");fields.createChild("div","conditions-list-text conditions-list-title").appendChild(editor.createInput("title","text","",titleValidator));fields.createChild("div","conditions-list-separator conditions-list-separator-invisible");var cell=fields.createChild("div","conditions-list-text");cell.appendChild(editor.createInput("download","text",WebInspector.UIString("kb/s"),throughputValidator));cell.createChild("div","conditions-edit-optional").textContent=WebInspector.UIString("optional");fields.createChild("div","conditions-list-separator conditions-list-separator-invisible");cell=fields.createChild("div","conditions-list-text");cell.appendChild(editor.createInput("upload","text",WebInspector.UIString("kb/s"),throughputValidator));cell.createChild("div","conditions-edit-optional").textContent=WebInspector.UIString("optional");fields.createChild("div","conditions-list-separator conditions-list-separator-invisible");cell=fields.createChild("div","conditions-list-text");cell.appendChild(editor.createInput("latency","text",WebInspector.UIString("ms"),latencyValidator));cell.createChild("div","conditions-edit-optional").textContent=WebInspector.UIString("optional");return editor;function titleValidator(item,index,input)
{var value=input.value.trim();return value.length>0&&value.length<50;}
function throughputValidator(item,index,input)
{var value=input.value.trim();return!value||(/^[\d]+(\.\d+)?|\.\d+$/.test(value)&&value>=0&&value<=10000000);}
function latencyValidator(item,index,input)
{var value=input.value.trim();return!value||(/^[\d]+$/.test(value)&&value>=0&&value<=1000000);}},__proto__:WebInspector.VBox.prototype};WebInspector.ObjectPopoverHelper=function(panelElement,getAnchor,queryObject,onHide,disableOnClick)
{WebInspector.PopoverHelper.call(this,panelElement,getAnchor,this._showObjectPopover.bind(this),this._onHideObjectPopover.bind(this),disableOnClick);this._queryObject=queryObject;this._onHideCallback=onHide;this._popoverObjectGroup="popover";panelElement.addEventListener("scroll",this.hidePopover.bind(this),true);};WebInspector.ObjectPopoverHelper.MaxPopoverTextLength=10000;WebInspector.ObjectPopoverHelper.prototype={_showObjectPopover:function(element,popover)
{function didGetFunctionProperties(funcObject,popoverContentElement,popoverValueElement,anchorElement,properties,internalProperties)
{if(internalProperties){for(var i=0;i<internalProperties.length;i++){if(internalProperties[i].name==="[[TargetFunction]]"){funcObject=internalProperties[i].value;break;}}}
WebInspector.ObjectPropertiesSection.formatObjectAsFunction(funcObject,popoverValueElement,true);funcObject.functionDetails(didGetFunctionDetails.bind(this,popoverContentElement,anchorElement));}
function didGetFunctionDetails(popoverContentElement,anchorElement,response)
{if(!response||popover.disposed)
return;var container=createElementWithClass("div","object-popover-container");var title=container.createChild("div","function-popover-title source-code");var functionName=title.createChild("span","function-name");functionName.textContent=WebInspector.beautifyFunctionName(response.functionName);var rawLocation=response.location;var sourceURL=response.sourceURL;if(rawLocation&&sourceURL){var link=this._lazyLinkifier().linkifyRawLocation(rawLocation,sourceURL,"function-location-link");title.appendChild(link);}
container.appendChild(popoverContentElement);popover.showForAnchor(container,anchorElement);}
function didGetGeneratorObjectDetails(response)
{if(!response||popover.disposed)
return;var rawLocation=response.location;var sourceURL=response.sourceURL;if(rawLocation&&sourceURL){var link=this._lazyLinkifier().linkifyRawLocation(rawLocation,sourceURL,"function-location-link");this._titleElement.appendChild(link);}}
function didQueryObject(result,wasThrown,anchorOverride)
{if(popover.disposed)
return;if(wasThrown){this.hidePopover();return;}
this._objectTarget=result.target();var anchorElement=anchorOverride||element;var description=result.description.trimEnd(WebInspector.ObjectPopoverHelper.MaxPopoverTextLength);var popoverContentElement=null;if(result.type!=="object"){popoverContentElement=createElement("span");WebInspector.appendStyle(popoverContentElement,"components/objectValue.css");var valueElement=popoverContentElement.createChild("span","monospace object-value-"+result.type);valueElement.style.whiteSpace="pre";if(result.type==="string")
valueElement.createTextChildren("\"",description,"\"");else if(result.type!=="function")
valueElement.textContent=description;if(result.type==="function"){result.getOwnProperties(didGetFunctionProperties.bind(this,result,popoverContentElement,valueElement,anchorElement));return;}
popover.showForAnchor(popoverContentElement,anchorElement);}else{if(result.subtype==="node"){WebInspector.DOMModel.highlightObjectAsDOMNode(result);this._resultHighlightedAsDOM=true;}
if(result.customPreview()){var customPreviewComponent=new WebInspector.CustomPreviewComponent(result);customPreviewComponent.expandIfPossible();popoverContentElement=customPreviewComponent.element;}else{popoverContentElement=createElement("div");this._titleElement=popoverContentElement.createChild("div","monospace");this._titleElement.createChild("span","source-frame-popover-title").textContent=description;var section=new WebInspector.ObjectPropertiesSection(result,"");section.element.classList.add("source-frame-popover-tree");section.titleLessMode();popoverContentElement.appendChild(section.element);if(result.subtype==="generator")
result.generatorObjectDetails(didGetGeneratorObjectDetails.bind(this));}
var popoverWidth=300;var popoverHeight=250;popover.showForAnchor(popoverContentElement,anchorElement,popoverWidth,popoverHeight);}}
this._queryObject(element,didQueryObject.bind(this),this._popoverObjectGroup);},_onHideObjectPopover:function()
{if(this._resultHighlightedAsDOM){WebInspector.DOMModel.hideDOMNodeHighlight();delete this._resultHighlightedAsDOM;}
if(this._linkifier){this._linkifier.dispose();delete this._linkifier;}
if(this._onHideCallback)
this._onHideCallback();if(this._objectTarget){this._objectTarget.runtimeAgent().releaseObjectGroup(this._popoverObjectGroup);delete this._objectTarget;}},_lazyLinkifier:function()
{if(!this._linkifier)
this._linkifier=new WebInspector.Linkifier();return this._linkifier;},__proto__:WebInspector.PopoverHelper.prototype};WebInspector.ObjectPropertiesSection=function(object,title,emptyPlaceholder,ignoreHasOwnProperty,extraProperties)
{this._object=object;this._editable=true;TreeOutlineInShadow.call(this);this.setFocusable(false);this._objectTreeElement=new WebInspector.ObjectPropertiesSection.RootElement(object,emptyPlaceholder,ignoreHasOwnProperty,extraProperties);this.appendChild(this._objectTreeElement);if(typeof title==="string"||!title)
this.element.createChild("span").textContent=title||"";else
this.element.appendChild(title);this.element._section=this;this.registerRequiredCSS("components/objectValue.css");this.registerRequiredCSS("components/objectPropertiesSection.css");this.rootElement().childrenListElement.classList.add("source-code","object-properties-section");}
WebInspector.ObjectPropertiesSection._arrayLoadThreshold=100;WebInspector.ObjectPropertiesSection.defaultObjectPresentation=function(object,skipProto)
{var componentRoot=createElementWithClass("span","source-code");var shadowRoot=WebInspector.createShadowRootWithCoreStyles(componentRoot,"components/objectValue.css");shadowRoot.appendChild(WebInspector.ObjectPropertiesSection.createValueElement(object,false));if(!object.hasChildren)
return componentRoot;var objectPropertiesSection=new WebInspector.ObjectPropertiesSection(object,componentRoot);objectPropertiesSection.editable=false;if(skipProto)
objectPropertiesSection.skipProto();return objectPropertiesSection.element;}
WebInspector.ObjectPropertiesSection.prototype={skipProto:function()
{this._skipProto=true;},expand:function()
{this._objectTreeElement.expand();},objectTreeElement:function()
{return this._objectTreeElement;},enableContextMenu:function()
{this.element.addEventListener("contextmenu",this._contextMenuEventFired.bind(this),false);},_contextMenuEventFired:function(event)
{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendApplicableItems(this._object);contextMenu.show();},titleLessMode:function()
{this._objectTreeElement.listItemElement.classList.add("hidden");this._objectTreeElement.childrenListElement.classList.add("title-less-mode");this._objectTreeElement.expand();},__proto__:TreeOutlineInShadow.prototype}
WebInspector.ObjectPropertiesSection.CompareProperties=function(propertyA,propertyB)
{var a=propertyA.name;var b=propertyB.name;if(a==="__proto__")
return 1;if(b==="__proto__")
return-1;if(propertyA.symbol&&!propertyB.symbol)
return 1;if(propertyB.symbol&&!propertyA.symbol)
return-1;return String.naturalOrderComparator(a,b);}
WebInspector.ObjectPropertiesSection.RootElement=function(object,emptyPlaceholder,ignoreHasOwnProperty,extraProperties)
{this._object=object;this._extraProperties=extraProperties||[];this._ignoreHasOwnProperty=!!ignoreHasOwnProperty;this._emptyPlaceholder=emptyPlaceholder;var contentElement=createElement("content");TreeElement.call(this,contentElement);this.setExpandable(true);this.selectable=false;this.toggleOnClick=true;this.listItemElement.classList.add("object-properties-section-root-element");}
WebInspector.ObjectPropertiesSection.RootElement.prototype={onexpand:function()
{if(this.treeOutline)
this.treeOutline.element.classList.add("expanded");},oncollapse:function()
{if(this.treeOutline)
this.treeOutline.element.classList.remove("expanded");},ondblclick:function(e)
{return true;},onpopulate:function()
{WebInspector.ObjectPropertyTreeElement._populate(this,this._object,!!this.treeOutline._skipProto,this._emptyPlaceholder,this._ignoreHasOwnProperty,this._extraProperties);},__proto__:TreeElement.prototype}
WebInspector.ObjectPropertyTreeElement=function(property)
{this.property=property;TreeElement.call(this);this.toggleOnClick=true;this.selectable=false;}
WebInspector.ObjectPropertyTreeElement.prototype={onpopulate:function()
{var propertyValue=(this.property.value);console.assert(propertyValue);var skipProto=this.treeOutline?this.treeOutline._skipProto:true;var targetValue=this.property.name!=='__proto__'?propertyValue:this.property.parentObject;WebInspector.ObjectPropertyTreeElement._populate(this,propertyValue,skipProto,undefined,undefined,undefined,targetValue);},ondblclick:function(event)
{var editableElement=this.valueElement;if(!this.property.value.customPreview()&&(this.property.writable||this.property.setter)&&event.target.isSelfOrDescendant(editableElement))
this._startEditing();return false;},onattach:function()
{this.update();this._updateExpandable();},update:function()
{this.nameElement=WebInspector.ObjectPropertiesSection.createNameElement(this.property.name);if(!this.property.enumerable)
this.nameElement.classList.add("object-properties-section-dimmed");if(this.property.isAccessorProperty())
this.nameElement.classList.add("properties-accessor-property-name");if(this.property.synthetic)
this.nameElement.classList.add("synthetic-property");if(this.property.symbol)
this.nameElement.addEventListener("contextmenu",this._contextMenuFired.bind(this,this.property.symbol),false);var separatorElement=createElementWithClass("span","object-properties-section-separator");separatorElement.textContent=": ";if(this.property.value){this.valueElement=WebInspector.ObjectPropertiesSection.createValueElementWithCustomSupport(this.property.value,this.property.wasThrown,this.listItemElement);this.valueElement.addEventListener("contextmenu",this._contextMenuFired.bind(this,this.property.value),false);}else if(this.property.getter){this.valueElement=WebInspector.ObjectPropertyTreeElement.createRemoteObjectAccessorPropertySpan(this.property.parentObject,[this.property.name],this._onInvokeGetterClick.bind(this));}else{this.valueElement=createElementWithClass("span","object-value-undefined");this.valueElement.textContent=WebInspector.UIString("<unreadable>");this.valueElement.title=WebInspector.UIString("No property getter");}
this.listItemElement.removeChildren();this.listItemElement.appendChildren(this.nameElement,separatorElement,this.valueElement);},_contextMenuFired:function(value,event)
{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendApplicableItems(value);contextMenu.show();},_startEditing:function()
{if(this._prompt||!this.treeOutline._editable||this._readOnly)
return;this._editableDiv=this.listItemElement.createChild("span");var text=this.property.value.description;if(this.property.value.type==="string"&&typeof text==="string")
text="\""+text+"\"";this._editableDiv.setTextContentTruncatedIfNeeded(text,WebInspector.UIString("<string is too large to edit>"));var originalContent=this._editableDiv.textContent;this.valueElement.classList.add("hidden");this.setExpandable(false);this.listItemElement.classList.add("editing-sub-part");this._prompt=new WebInspector.ObjectPropertyPrompt();var proxyElement=this._prompt.attachAndStartEditing(this._editableDiv,this._editingCommitted.bind(this,originalContent));this.listItemElement.getComponentSelection().setBaseAndExtent(this._editableDiv,0,this._editableDiv,1);proxyElement.addEventListener("keydown",this._promptKeyDown.bind(this,originalContent),false);},_editingEnded:function()
{this._prompt.detach();delete this._prompt;this._editableDiv.remove();this._updateExpandable();this.listItemElement.scrollLeft=0;this.listItemElement.classList.remove("editing-sub-part");},_editingCancelled:function()
{this.valueElement.classList.remove("hidden");this._editingEnded();},_editingCommitted:function(originalContent)
{var userInput=this._prompt.text();if(userInput===originalContent){this._editingCancelled();return;}
this._editingEnded();this._applyExpression(userInput);},_promptKeyDown:function(originalContent,event)
{if(isEnterKey(event)){event.consume(true);this._editingCommitted(originalContent);return;}
if(event.keyIdentifier==="U+001B"){event.consume();this._editingCancelled();return;}},_applyExpression:function(expression)
{var property=WebInspector.RemoteObject.toCallArgument(this.property.symbol||this.property.name);expression=expression.trim();if(expression)
this.property.parentObject.setPropertyValue(property,expression,callback.bind(this));else
this.property.parentObject.deleteProperty(property,callback.bind(this));function callback(error)
{if(error){this.update();return;}
if(!expression){this.parent.removeChild(this);}else{var parent=this.parent;parent.invalidateChildren();parent.expand();}};},_onInvokeGetterClick:function(result,wasThrown)
{if(!result)
return;this.property.value=result;this.property.wasThrown=wasThrown;this.update();this.invalidateChildren();this._updateExpandable();},_updateExpandable:function()
{if(this.property.value)
this.setExpandable(!this.property.value.customPreview()&&this.property.value.hasChildren&&!this.property.wasThrown);else
this.setExpandable(false);},__proto__:TreeElement.prototype}
WebInspector.ObjectPropertyTreeElement._populate=function(treeElement,value,skipProto,emptyPlaceholder,flattenProtoChain,extraProperties,targetValue)
{if(value.arrayLength()>WebInspector.ObjectPropertiesSection._arrayLoadThreshold){treeElement.removeChildren();WebInspector.ArrayGroupingTreeElement._populateArray(treeElement,value,0,value.arrayLength()-1);return;}
function callback(properties,internalProperties)
{treeElement.removeChildren();if(!properties)
return;extraProperties=extraProperties||[];for(var i=0;i<extraProperties.length;++i)
properties.push(extraProperties[i]);WebInspector.ObjectPropertyTreeElement.populateWithProperties(treeElement,properties,internalProperties,skipProto,targetValue||value,emptyPlaceholder);}
if(flattenProtoChain)
value.getAllProperties(false,callback);else
WebInspector.RemoteObject.loadFromObjectPerProto(value,callback);}
WebInspector.ObjectPropertyTreeElement.populateWithProperties=function(treeNode,properties,internalProperties,skipProto,value,emptyPlaceholder){properties.sort(WebInspector.ObjectPropertiesSection.CompareProperties);for(var i=0;i<properties.length;++i){var property=properties[i];if(skipProto&&property.name==="__proto__")
continue;if(property.isAccessorProperty()){if(property.name!=="__proto__"&&property.getter){property.parentObject=value;treeNode.appendChild(new WebInspector.ObjectPropertyTreeElement(property));}
if(property.isOwn){if(property.getter){var getterProperty=new WebInspector.RemoteObjectProperty("get "+property.name,property.getter);getterProperty.parentObject=value;treeNode.appendChild(new WebInspector.ObjectPropertyTreeElement(getterProperty));}
if(property.setter){var setterProperty=new WebInspector.RemoteObjectProperty("set "+property.name,property.setter);setterProperty.parentObject=value;treeNode.appendChild(new WebInspector.ObjectPropertyTreeElement(setterProperty));}}}else{property.parentObject=value;treeNode.appendChild(new WebInspector.ObjectPropertyTreeElement(property));}}
if(internalProperties){for(var i=0;i<internalProperties.length;i++){internalProperties[i].parentObject=value;treeNode.appendChild(new WebInspector.ObjectPropertyTreeElement(internalProperties[i]));}}
if(value&&value.type==="function"){var hasTargetFunction=false;if(internalProperties){for(var i=0;i<internalProperties.length;i++){if(internalProperties[i].name=="[[TargetFunction]]"){hasTargetFunction=true;break;}}}
if(!hasTargetFunction)
treeNode.appendChild(new WebInspector.FunctionScopeMainTreeElement(value));}
if(value&&value.type==="object"&&(value.subtype==="map"||value.subtype==="set"||value.subtype==="iterator"))
treeNode.appendChild(new WebInspector.CollectionEntriesMainTreeElement(value));WebInspector.ObjectPropertyTreeElement._appendEmptyPlaceholderIfNeeded(treeNode,emptyPlaceholder);}
WebInspector.ObjectPropertyTreeElement._appendEmptyPlaceholderIfNeeded=function(treeNode,emptyPlaceholder)
{if(treeNode.childCount())
return;var title=createElementWithClass("div","info");title.textContent=emptyPlaceholder||WebInspector.UIString("No Properties");var infoElement=new TreeElement(title);treeNode.appendChild(infoElement);}
WebInspector.ObjectPropertyTreeElement.createRemoteObjectAccessorPropertySpan=function(object,propertyPath,callback)
{var rootElement=createElement("span");var element=rootElement.createChild("span");element.textContent=WebInspector.UIString("(...)");if(!object)
return rootElement;element.classList.add("object-value-calculate-value-button");element.title=WebInspector.UIString("Invoke property getter");element.addEventListener("click",onInvokeGetterClick,false);function onInvokeGetterClick(event)
{event.consume();object.getProperty(propertyPath,callback);}
return rootElement;}
WebInspector.FunctionScopeMainTreeElement=function(remoteObject)
{TreeElement.call(this,"<function scope>",true);this.toggleOnClick=true;this.selectable=false;this._remoteObject=remoteObject;}
WebInspector.FunctionScopeMainTreeElement.prototype={onpopulate:function()
{function didGetDetails(response)
{if(!response)
return;this.removeChildren();var scopeChain=response.scopeChain||[];for(var i=0;i<scopeChain.length;++i){var scope=scopeChain[i];var title=null;var isTrueObject=false;switch(scope.type){case DebuggerAgent.ScopeType.Local:title=WebInspector.UIString("Local");break;case DebuggerAgent.ScopeType.Closure:title=WebInspector.UIString("Closure");break;case DebuggerAgent.ScopeType.Catch:title=WebInspector.UIString("Catch");break;case DebuggerAgent.ScopeType.Block:title=WebInspector.UIString("Block");break;case DebuggerAgent.ScopeType.Script:title=WebInspector.UIString("Script");break;case DebuggerAgent.ScopeType.With:title=WebInspector.UIString("With Block");isTrueObject=true;break;case DebuggerAgent.ScopeType.Global:title=WebInspector.UIString("Global");isTrueObject=true;break;default:console.error("Unknown scope type: "+scope.type);continue;}
var runtimeModel=this._remoteObject.target().runtimeModel;if(isTrueObject){var remoteObject=runtimeModel.createRemoteObject(scope.object);var property=new WebInspector.RemoteObjectProperty(title,remoteObject);property.writable=false;property.parentObject=null;this.appendChild(new WebInspector.ObjectPropertyTreeElement(property));}else{var scopeRef=new WebInspector.ScopeRef(i,undefined,this._remoteObject.objectId);var remoteObject=runtimeModel.createScopeRemoteObject(scope.object,scopeRef);var scopeTreeElement=new WebInspector.ScopeTreeElement(title,remoteObject);this.appendChild(scopeTreeElement);}}
WebInspector.ObjectPropertyTreeElement._appendEmptyPlaceholderIfNeeded(this,WebInspector.UIString("No Scopes"));}
this._remoteObject.functionDetails(didGetDetails.bind(this));},__proto__:TreeElement.prototype}
WebInspector.CollectionEntriesMainTreeElement=function(remoteObject)
{TreeElement.call(this,"<entries>",true);this.toggleOnClick=true;this.selectable=false;this._remoteObject=remoteObject;this.expand();}
WebInspector.CollectionEntriesMainTreeElement.prototype={onpopulate:function()
{function didGetCollectionEntries(entries)
{if(!entries)
return;this.removeChildren();var entriesLocalObject=[];var runtimeModel=this._remoteObject.target().runtimeModel;for(var i=0;i<entries.length;++i){var entry=entries[i];if(entry.key){entriesLocalObject.push(new WebInspector.MapEntryLocalJSONObject({key:runtimeModel.createRemoteObject(entry.key),value:runtimeModel.createRemoteObject(entry.value)}));}else{entriesLocalObject.push(runtimeModel.createRemoteObject(entry.value));}}
WebInspector.ObjectPropertyTreeElement._populate(this,WebInspector.RemoteObject.fromLocalObject(entriesLocalObject),true,WebInspector.UIString("No Entries"));this.title="<entries>["+entriesLocalObject.length+"]";}
this._remoteObject.collectionEntries(didGetCollectionEntries.bind(this));},__proto__:TreeElement.prototype}
WebInspector.ScopeTreeElement=function(title,remoteObject)
{TreeElement.call(this,title,true);this.toggleOnClick=true;this.selectable=false;this._remoteObject=remoteObject;}
WebInspector.ScopeTreeElement.prototype={onpopulate:function()
{WebInspector.ObjectPropertyTreeElement._populate(this,this._remoteObject,false);},__proto__:TreeElement.prototype}
WebInspector.ArrayGroupingTreeElement=function(object,fromIndex,toIndex,propertyCount)
{TreeElement.call(this,String.sprintf("[%d \u2026 %d]",fromIndex,toIndex),true);this.toggleOnClick=true;this.selectable=false;this._fromIndex=fromIndex;this._toIndex=toIndex;this._object=object;this._readOnly=true;this._propertyCount=propertyCount;}
WebInspector.ArrayGroupingTreeElement._bucketThreshold=100;WebInspector.ArrayGroupingTreeElement._sparseIterationThreshold=250000;WebInspector.ArrayGroupingTreeElement._getOwnPropertyNamesThreshold=500000;WebInspector.ArrayGroupingTreeElement._populateArray=function(treeNode,object,fromIndex,toIndex)
{WebInspector.ArrayGroupingTreeElement._populateRanges(treeNode,object,fromIndex,toIndex,true);}
WebInspector.ArrayGroupingTreeElement._populateRanges=function(treeNode,object,fromIndex,toIndex,topLevel)
{object.callFunctionJSON(packRanges,[{value:fromIndex},{value:toIndex},{value:WebInspector.ArrayGroupingTreeElement._bucketThreshold},{value:WebInspector.ArrayGroupingTreeElement._sparseIterationThreshold},{value:WebInspector.ArrayGroupingTreeElement._getOwnPropertyNamesThreshold}],callback);function packRanges(fromIndex,toIndex,bucketThreshold,sparseIterationThreshold,getOwnPropertyNamesThreshold)
{var ownPropertyNames=null;var consecutiveRange=(toIndex-fromIndex>=sparseIterationThreshold)&&ArrayBuffer.isView(this);var skipGetOwnPropertyNames=consecutiveRange&&(toIndex-fromIndex>=getOwnPropertyNamesThreshold);function*arrayIndexes(object)
{if(toIndex-fromIndex<sparseIterationThreshold){for(var i=fromIndex;i<=toIndex;++i){if(i in object)
yield i;}}else{ownPropertyNames=ownPropertyNames||Object.getOwnPropertyNames(object);for(var i=0;i<ownPropertyNames.length;++i){var name=ownPropertyNames[i];var index=name>>>0;if((""+index)===name&&fromIndex<=index&&index<=toIndex)
yield index;}}}
var count=0;if(consecutiveRange){count=toIndex-fromIndex+1;}else{for(var i of arrayIndexes(this))
++count;}
var bucketSize=count;if(count<=bucketThreshold)
bucketSize=count;else
bucketSize=Math.pow(bucketThreshold,Math.ceil(Math.log(count)/Math.log(bucketThreshold))-1);var ranges=[];if(consecutiveRange){for(var i=fromIndex;i<=toIndex;i+=bucketSize){var groupStart=i;var groupEnd=groupStart+bucketSize-1;if(groupEnd>toIndex)
groupEnd=toIndex;ranges.push([groupStart,groupEnd,groupEnd-groupStart+1]);}}else{count=0;var groupStart=-1;var groupEnd=0;for(var i of arrayIndexes(this)){if(groupStart===-1)
groupStart=i;groupEnd=i;if(++count===bucketSize){ranges.push([groupStart,groupEnd,count]);count=0;groupStart=-1;}}
if(count>0)
ranges.push([groupStart,groupEnd,count]);}
return{ranges:ranges,skipGetOwnPropertyNames:skipGetOwnPropertyNames};}
function callback(result)
{if(!result)
return;var ranges=(result.ranges);if(ranges.length==1){WebInspector.ArrayGroupingTreeElement._populateAsFragment(treeNode,object,ranges[0][0],ranges[0][1]);}else{for(var i=0;i<ranges.length;++i){var fromIndex=ranges[i][0];var toIndex=ranges[i][1];var count=ranges[i][2];if(fromIndex==toIndex)
WebInspector.ArrayGroupingTreeElement._populateAsFragment(treeNode,object,fromIndex,toIndex);else
treeNode.appendChild(new WebInspector.ArrayGroupingTreeElement(object,fromIndex,toIndex,count));}}
if(topLevel)
WebInspector.ArrayGroupingTreeElement._populateNonIndexProperties(treeNode,object,result.skipGetOwnPropertyNames);}}
WebInspector.ArrayGroupingTreeElement._populateAsFragment=function(treeNode,object,fromIndex,toIndex)
{object.callFunction(buildArrayFragment,[{value:fromIndex},{value:toIndex},{value:WebInspector.ArrayGroupingTreeElement._sparseIterationThreshold}],processArrayFragment.bind(this));function buildArrayFragment(fromIndex,toIndex,sparseIterationThreshold)
{var result=Object.create(null);if(toIndex-fromIndex<sparseIterationThreshold){for(var i=fromIndex;i<=toIndex;++i){if(i in this)
result[i]=this[i];}}else{var ownPropertyNames=Object.getOwnPropertyNames(this);for(var i=0;i<ownPropertyNames.length;++i){var name=ownPropertyNames[i];var index=name>>>0;if(String(index)===name&&fromIndex<=index&&index<=toIndex)
result[index]=this[index];}}
return result;}
function processArrayFragment(arrayFragment,wasThrown)
{if(!arrayFragment||wasThrown)
return;arrayFragment.getAllProperties(false,processProperties.bind(this));}
function processProperties(properties,internalProperties)
{if(!properties)
return;properties.sort(WebInspector.ObjectPropertiesSection.CompareProperties);for(var i=0;i<properties.length;++i){properties[i].parentObject=this._object;var childTreeElement=new WebInspector.ObjectPropertyTreeElement(properties[i]);childTreeElement._readOnly=true;treeNode.appendChild(childTreeElement);}}}
WebInspector.ArrayGroupingTreeElement._populateNonIndexProperties=function(treeNode,object,skipGetOwnPropertyNames)
{object.callFunction(buildObjectFragment,[{value:skipGetOwnPropertyNames}],processObjectFragment.bind(this));function buildObjectFragment(skipGetOwnPropertyNames)
{var result={__proto__:this.__proto__};if(skipGetOwnPropertyNames)
return result;var names=Object.getOwnPropertyNames(this);for(var i=0;i<names.length;++i){var name=names[i];if(String(name>>>0)===name&&name>>>0!==0xffffffff)
continue;var descriptor=Object.getOwnPropertyDescriptor(this,name);if(descriptor)
Object.defineProperty(result,name,descriptor);}
return result;}
function processObjectFragment(arrayFragment,wasThrown)
{if(!arrayFragment||wasThrown)
return;arrayFragment.getOwnProperties(processProperties.bind(this));}
function processProperties(properties,internalProperties)
{if(!properties)
return;properties.sort(WebInspector.ObjectPropertiesSection.CompareProperties);for(var i=0;i<properties.length;++i){properties[i].parentObject=this._object;var childTreeElement=new WebInspector.ObjectPropertyTreeElement(properties[i]);childTreeElement._readOnly=true;treeNode.appendChild(childTreeElement);}}}
WebInspector.ArrayGroupingTreeElement.prototype={onpopulate:function()
{if(this._propertyCount>=WebInspector.ArrayGroupingTreeElement._bucketThreshold){WebInspector.ArrayGroupingTreeElement._populateRanges(this,this._object,this._fromIndex,this._toIndex,false);return;}
WebInspector.ArrayGroupingTreeElement._populateAsFragment(this,this._object,this._fromIndex,this._toIndex);},onattach:function()
{this.listItemElement.classList.add("object-properties-section-name");},__proto__:TreeElement.prototype}
WebInspector.ObjectPropertyPrompt=function()
{WebInspector.TextPrompt.call(this,WebInspector.ExecutionContextSelector.completionsForTextPromptInCurrentContext);this.setSuggestBoxEnabled(true);}
WebInspector.ObjectPropertyPrompt.prototype={__proto__:WebInspector.TextPrompt.prototype}
WebInspector.ObjectPropertiesSection.createNameElement=function(name)
{var nameElement=createElementWithClass("span","name");if(/^\s|\s$|^$|\n/.test(name))
nameElement.createTextChildren("\"",name.replace(/\n/g,"\u21B5"),"\"");else
nameElement.textContent=name;return nameElement;}
WebInspector.ObjectPropertiesSection.valueTextForFunctionDescription=function(description)
{var matches=/function\s([^)]*)/.exec(description);if(!matches){matches=/[^(]*(\([^)]*)/.exec(description);}
var match=matches?matches[1]:null;return match?match.replace(/\n/g," ")+")":(description||"");}
WebInspector.ObjectPropertiesSection.createValueElementWithCustomSupport=function(value,wasThrown,parentElement)
{if(value.customPreview()){var result=(new WebInspector.CustomPreviewComponent(value)).element;result.classList.add("object-properties-section-custom-section");return result}
return WebInspector.ObjectPropertiesSection.createValueElement(value,wasThrown,parentElement);}
WebInspector.ObjectPropertiesSection.createValueElement=function(value,wasThrown,parentElement)
{var valueElement=createElementWithClass("span","value");var type=value.type;var subtype=value.subtype;var description=value.description;var prefix;var valueText;var suffix;if(wasThrown){prefix="[Exception: ";valueText=description;suffix="]";}else if(type==="string"&&typeof description==="string"){prefix="\"";valueText=description.replace(/\n/g,"\u21B5");suffix="\"";}else if(type==="function"){valueText=WebInspector.ObjectPropertiesSection.valueTextForFunctionDescription(description);}else if(type!=="object"||subtype!=="node"){valueText=description;}
if(type!=="number"||valueText.indexOf("e")===-1){valueElement.setTextContentTruncatedIfNeeded(valueText||"");if(prefix)
valueElement.insertBefore(createTextNode(prefix),valueElement.firstChild);if(suffix)
valueElement.createTextChild(suffix);}else{var numberParts=valueText.split("e");var mantissa=valueElement.createChild("span","object-value-scientific-notation-mantissa");mantissa.textContent=numberParts[0];var exponent=valueElement.createChild("span","object-value-scientific-notation-exponent");exponent.textContent="e"+numberParts[1];valueElement.classList.add("object-value-scientific-notation-number");if(parentElement)
parentElement.classList.add("hbox");}
if(wasThrown)
valueElement.classList.add("error");if(subtype||type)
valueElement.classList.add("object-value-"+(subtype||type));if(type==="object"&&subtype==="node"&&description){WebInspector.DOMPresentationUtils.createSpansForNodeTitle(valueElement,description);valueElement.addEventListener("click",mouseClick,false);valueElement.addEventListener("mousemove",mouseMove,false);valueElement.addEventListener("mouseleave",mouseLeave,false);}else{valueElement.title=description||"";}
function mouseMove()
{WebInspector.DOMModel.highlightObjectAsDOMNode(value);}
function mouseLeave()
{WebInspector.DOMModel.hideDOMNodeHighlight();}
function mouseClick(event)
{WebInspector.Revealer.reveal(value);event.consume(true);}
return valueElement;}
WebInspector.ObjectPropertiesSection.formatObjectAsFunction=function(func,element,linkify,includePreview)
{func.functionDetails(didGetDetails);function didGetDetails(response)
{if(!response){var valueText=WebInspector.ObjectPropertiesSection.valueTextForFunctionDescription(func.description);element.createTextChild(valueText);return;}
if(linkify&&response&&response.location){var anchor=createElement("span");element.classList.add("linkified");element.appendChild(anchor);element.addEventListener("click",WebInspector.Revealer.reveal.bind(WebInspector.Revealer,response.location,undefined));element=anchor;}
var text=func.description.substring(0,200);if(includePreview){element.textContent=text.replace(/^function /,"")+(func.description.length>200?"\u2026":"");return;}
self.runtime.instancePromise(WebInspector.TokenizerFactory).then(processTokens);var params=null;var functionName=response?response.functionName:"";function processTokens(tokenizerFactory)
{var tokenize=tokenizerFactory.createTokenizer("text/javascript");tokenize(text,processToken);element.textContent=(functionName||"anonymous")+"("+(params||[]).join(", ")+")";}
var doneProcessing=false;function processToken(token,tokenType,column,newColumn)
{if(!params&&tokenType==="js-def"&&!functionName)
functionName=token;doneProcessing=doneProcessing||token===")";if(doneProcessing)
return;if(token==="("){params=[];return;}
if(params&&tokenType==="js-def")
params.push(token);}}}
WebInspector.ObjectPropertiesSectionExpandController=function()
{this._expandedProperties=new Set();}
WebInspector.ObjectPropertiesSectionExpandController._cachedPathSymbol=Symbol("cachedPath");WebInspector.ObjectPropertiesSectionExpandController._treeOutlineId=Symbol("treeOutlineId");WebInspector.ObjectPropertiesSectionExpandController.prototype={watchSection:function(id,section)
{section.addEventListener(TreeOutline.Events.ElementAttached,this._elementAttached,this);section.addEventListener(TreeOutline.Events.ElementExpanded,this._elementExpanded,this);section.addEventListener(TreeOutline.Events.ElementCollapsed,this._elementCollapsed,this);section[WebInspector.ObjectPropertiesSectionExpandController._treeOutlineId]=id;if(this._expandedProperties.has(id))
section.expand();},stopWatchSectionsWithId:function(id)
{for(var property of this._expandedProperties){if(property.startsWith(id+":"))
this._expandedProperties.delete(property);}},_elementAttached:function(event)
{var element=(event.data);if(element.isExpandable()&&this._expandedProperties.has(this._propertyPath(element)))
element.expand();},_elementExpanded:function(event)
{var element=(event.data);this._expandedProperties.add(this._propertyPath(element));},_elementCollapsed:function(event)
{var element=(event.data);this._expandedProperties.delete(this._propertyPath(element));},_propertyPath:function(treeElement)
{var cachedPropertyPath=treeElement[WebInspector.ObjectPropertiesSectionExpandController._cachedPathSymbol];if(cachedPropertyPath)
return cachedPropertyPath;var current=treeElement;var rootElement=treeElement.treeOutline.objectTreeElement();var result;while(current!==rootElement){result=current.property.name+(result?"."+result:"");current=current.parent;}
var treeOutlineId=treeElement.treeOutline[WebInspector.ObjectPropertiesSectionExpandController._treeOutlineId];result=treeOutlineId+(result?":"+result:"");treeElement[WebInspector.ObjectPropertiesSectionExpandController._cachedPathSymbol]=result;return result;}};WebInspector.RemoteObjectPreviewFormatter=function()
{}
WebInspector.RemoteObjectPreviewFormatter.prototype={appendObjectPreview:function(parentElement,preview)
{var description=preview.description;if(preview.type!=="object"||preview.subtype==="null"){parentElement.appendChild(this.renderPropertyPreview(preview.type,preview.subtype,description));return true;}
if(description&&preview.subtype!=="array"){var text=preview.subtype?description:this._abbreviateFullQualifiedClassName(description);parentElement.createTextChildren(text," ");}
if(preview.entries)
return this._appendEntriesPreview(parentElement,preview);return this._appendPropertiesPreview(parentElement,preview);},_abbreviateFullQualifiedClassName:function(description)
{var abbreviatedDescription=description.split(".");for(var i=0;i<abbreviatedDescription.length-1;++i)
abbreviatedDescription[i]=abbreviatedDescription[i].trimMiddle(3);return abbreviatedDescription.join(".");},_appendPropertiesPreview:function(parentElement,preview)
{var isArray=preview.subtype==="array";var arrayLength=WebInspector.RemoteObject.arrayLength(preview);var properties=preview.properties;if(isArray)
properties=properties.slice().stableSort(compareIndexesFirst);function compareIndexesFirst(a,b)
{var index1=toArrayIndex(a.name);var index2=toArrayIndex(b.name);if(index1<0)
return index2<0?0:1;return index2<0?-1:index1-index2;}
function toArrayIndex(name)
{var index=name>>>0;if(String(index)===name&&index<arrayLength)
return index;return-1;}
parentElement.createTextChild(isArray?"[":"{");for(var i=0;i<properties.length;++i){if(i>0)
parentElement.createTextChild(", ");var property=properties[i];var name=property.name;if(!isArray||name!=i||i>=arrayLength){if(/^\s|\s$|^$|\n/.test(name))
parentElement.createChild("span","name").createTextChildren("\"",name.replace(/\n/g,"\u21B5"),"\"");else
parentElement.createChild("span","name").textContent=name;parentElement.createTextChild(": ");}
parentElement.appendChild(this._renderPropertyPreviewOrAccessor([property]));}
if(preview.overflow)
parentElement.createChild("span").textContent="\u2026";parentElement.createTextChild(isArray?"]":"}");return preview.lossless;},_appendEntriesPreview:function(parentElement,preview)
{var lossless=preview.lossless&&!preview.properties.length;parentElement.createTextChild("{");for(var i=0;i<preview.entries.length;++i){if(i>0)
parentElement.createTextChild(", ");var entry=preview.entries[i];if(entry.key){this.appendObjectPreview(parentElement,entry.key);parentElement.createTextChild(" => ");}
this.appendObjectPreview(parentElement,entry.value);}
if(preview.overflow)
parentElement.createChild("span").textContent="\u2026";parentElement.createTextChild("}");return lossless;},_renderPropertyPreviewOrAccessor:function(propertyPath)
{var property=propertyPath.peekLast();return this.renderPropertyPreview(property.type,(property.subtype),property.value);},renderPropertyPreview:function(type,subtype,description)
{var span=createElementWithClass("span","object-value-"+(subtype||type));description=description||"";if(type==="function"){span.textContent="function";return span;}
if(type==="object"&&subtype==="node"&&description){span.classList.add("object-value-preview-node");WebInspector.DOMPresentationUtils.createSpansForNodeTitle(span,description);return span;}
if(type==="string"){span.createTextChildren("\"",description.replace(/\n/g,"\u21B5"),"\"");return span;}
if(type==="object"&&!subtype){span.textContent=this._abbreviateFullQualifiedClassName(description);return span;}
span.textContent=description;return span;}};WebInspector.ShortcutsScreen=function()
{this._sections={};}
WebInspector.ShortcutsScreen.prototype={section:function(name)
{var section=this._sections[name];if(!section)
this._sections[name]=section=new WebInspector.ShortcutsSection(name);return section;},createShortcutsTabView:function()
{var orderedSections=[];for(var section in this._sections)
orderedSections.push(this._sections[section]);function compareSections(a,b)
{return a.order-b.order;}
orderedSections.sort(compareSections);var widget=new WebInspector.Widget();widget.element.className="settings-tab-container";widget.element.createChild("header").createChild("h3").createTextChild(WebInspector.UIString("Shortcuts"));var scrollPane=widget.element.createChild("div","help-container-wrapper");var container=scrollPane.createChild("div");container.className="help-content help-container";for(var i=0;i<orderedSections.length;++i)
orderedSections[i].renderSection(container);var note=scrollPane.createChild("p","help-footnote");note.appendChild(WebInspector.linkifyDocumentationURLAsNode("iterate/inspect-styles/shortcuts",WebInspector.UIString("Full list of DevTools keyboard shortcuts and gestures")));return widget;}}
WebInspector.shortcutsScreen;WebInspector.ShortcutsSection=function(name)
{this.name=name;this._lines=([]);this.order=++WebInspector.ShortcutsSection._sequenceNumber;};WebInspector.ShortcutsSection._sequenceNumber=0;WebInspector.ShortcutsSection.prototype={addKey:function(key,description)
{this._addLine(this._renderKey(key),description);},addRelatedKeys:function(keys,description)
{this._addLine(this._renderSequence(keys,"/"),description);},addAlternateKeys:function(keys,description)
{this._addLine(this._renderSequence(keys,WebInspector.UIString("or")),description);},_addLine:function(keyElement,description)
{this._lines.push({key:keyElement,text:description});},renderSection:function(container)
{var parent=container.createChild("div","help-block");var headLine=parent.createChild("div","help-line");headLine.createChild("div","help-key-cell");headLine.createChild("div","help-section-title help-cell").textContent=this.name;for(var i=0;i<this._lines.length;++i){var line=parent.createChild("div","help-line");var keyCell=line.createChild("div","help-key-cell");keyCell.appendChild(this._lines[i].key);keyCell.appendChild(this._createSpan("help-key-delimiter",":"));line.createChild("div","help-cell").textContent=this._lines[i].text;}},_renderSequence:function(sequence,delimiter)
{var delimiterSpan=this._createSpan("help-key-delimiter",delimiter);return this._joinNodes(sequence.map(this._renderKey.bind(this)),delimiterSpan);},_renderKey:function(key)
{var keyName=key.name;var plus=this._createSpan("help-combine-keys","+");return this._joinNodes(keyName.split(" + ").map(this._createSpan.bind(this,"help-key")),plus);},_createSpan:function(className,textContent)
{var node=createElement("span");node.className=className;node.textContent=textContent;return node;},_joinNodes:function(nodes,delimiter)
{var result=createDocumentFragment();for(var i=0;i<nodes.length;++i){if(i>0)
result.appendChild(delimiter.cloneNode(true));result.appendChild(nodes[i]);}
return result;}}
WebInspector.ShortcutsScreen.registerShortcuts=function()
{var elementsSection=WebInspector.shortcutsScreen.section(WebInspector.UIString("Elements Panel"));var navigate=WebInspector.ShortcutsScreen.ElementsPanelShortcuts.NavigateUp.concat(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.NavigateDown);elementsSection.addRelatedKeys(navigate,WebInspector.UIString("Navigate elements"));var expandCollapse=WebInspector.ShortcutsScreen.ElementsPanelShortcuts.Expand.concat(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.Collapse);elementsSection.addRelatedKeys(expandCollapse,WebInspector.UIString("Expand/collapse"));elementsSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.EditAttribute,WebInspector.UIString("Edit attribute"));elementsSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.HideElement,WebInspector.UIString("Hide element"));elementsSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.ToggleEditAsHTML,WebInspector.UIString("Toggle edit as HTML"));var stylesPaneSection=WebInspector.shortcutsScreen.section(WebInspector.UIString("Styles Pane"));var nextPreviousProperty=WebInspector.ShortcutsScreen.ElementsPanelShortcuts.NextProperty.concat(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.PreviousProperty);stylesPaneSection.addRelatedKeys(nextPreviousProperty,WebInspector.UIString("Next/previous property"));stylesPaneSection.addRelatedKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.IncrementValue,WebInspector.UIString("Increment value"));stylesPaneSection.addRelatedKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.DecrementValue,WebInspector.UIString("Decrement value"));stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.IncrementBy10,WebInspector.UIString("Increment by %f",10));stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.DecrementBy10,WebInspector.UIString("Decrement by %f",10));stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.IncrementBy100,WebInspector.UIString("Increment by %f",100));stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.DecrementBy100,WebInspector.UIString("Decrement by %f",100));stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.IncrementBy01,WebInspector.UIString("Increment by %f",0.1));stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.DecrementBy01,WebInspector.UIString("Decrement by %f",0.1));var section=WebInspector.shortcutsScreen.section(WebInspector.UIString("Debugger"));section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("debugger.toggle-pause"),WebInspector.UIString("Pause/ Continue"));section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("debugger.step-over"),WebInspector.UIString("Step over"));section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("debugger.step-into"),WebInspector.UIString("Step into"));section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("debugger.step-out"),WebInspector.UIString("Step out"));if(Runtime.experiments.isEnabled("stepIntoAsync"))
section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("debugger.step-into"),WebInspector.UIString("Step into"));var nextAndPrevFrameKeys=WebInspector.ShortcutsScreen.SourcesPanelShortcuts.NextCallFrame.concat(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.PrevCallFrame);section.addRelatedKeys(nextAndPrevFrameKeys,WebInspector.UIString("Next/previous call frame"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.EvaluateSelectionInConsole,WebInspector.UIString("Evaluate selection in console"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.AddSelectionToWatch,WebInspector.UIString("Add selection to watch"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.ToggleBreakpoint,WebInspector.UIString("Toggle breakpoint"));section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("debugger.toggle-breakpoints-active"),WebInspector.UIString("Toggle all breakpoints"));section=WebInspector.shortcutsScreen.section(WebInspector.UIString("Text Editor"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.GoToMember,WebInspector.UIString("Go to member"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.ToggleAutocompletion,WebInspector.UIString("Autocompletion"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.GoToLine,WebInspector.UIString("Go to line"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.JumpToPreviousLocation,WebInspector.UIString("Jump to previous editing location"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.JumpToNextLocation,WebInspector.UIString("Jump to next editing location"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.ToggleComment,WebInspector.UIString("Toggle comment"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.IncreaseCSSUnitByOne,WebInspector.UIString("Increment CSS unit by 1"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.DecreaseCSSUnitByOne,WebInspector.UIString("Decrement CSS unit by 1"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.IncreaseCSSUnitByTen,WebInspector.UIString("Increment CSS unit by 10"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.DecreaseCSSUnitByTen,WebInspector.UIString("Decrement CSS unit by 10"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.SelectNextOccurrence,WebInspector.UIString("Select next occurrence"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.SoftUndo,WebInspector.UIString("Soft undo"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.GotoMatchingBracket,WebInspector.UIString("Go to matching bracket"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.CloseEditorTab,WebInspector.UIString("Close editor tab"));section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("sources.switch-file"),WebInspector.UIString("Switch between files with the same name and different extensions."));section=WebInspector.shortcutsScreen.section(WebInspector.UIString("Timeline Panel"));section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("timeline.toggle-recording"),WebInspector.UIString("Start/stop recording"));section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("main.reload"),WebInspector.UIString("Record page reload"));section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("timeline.save-to-file"),WebInspector.UIString("Save timeline data"));section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("timeline.load-from-file"),WebInspector.UIString("Load timeline data"));section.addRelatedKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("timeline.jump-to-previous-frame").concat(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("timeline.jump-to-next-frame")),WebInspector.UIString("Jump to previous/next frame"));section=WebInspector.shortcutsScreen.section(WebInspector.UIString("Profiles Panel"));section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("profiler.toggle-recording"),WebInspector.UIString("Start/stop recording"));if(Runtime.experiments.isEnabled("layersPanel")){section=WebInspector.shortcutsScreen.section(WebInspector.UIString("Layers Panel"));section.addAlternateKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.ResetView,WebInspector.UIString("Reset view"));section.addAlternateKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.PanMode,WebInspector.UIString("Switch to pan mode"));section.addAlternateKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.RotateMode,WebInspector.UIString("Switch to rotate mode"));section.addAlternateKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.TogglePanRotate,WebInspector.UIString("Temporarily toggle pan/rotate mode while held"));section.addAlternateKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.ZoomIn,WebInspector.UIString("Zoom in"));section.addAlternateKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.ZoomOut,WebInspector.UIString("Zoom out"));section.addRelatedKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.Up.concat(WebInspector.ShortcutsScreen.LayersPanelShortcuts.Down),WebInspector.UIString("Pan or rotate up/down"));section.addRelatedKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.Left.concat(WebInspector.ShortcutsScreen.LayersPanelShortcuts.Right),WebInspector.UIString("Pan or rotate left/right"));}}
WebInspector.ShortcutsScreen.ElementsPanelShortcuts={NavigateUp:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up)],NavigateDown:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down)],Expand:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Right)],Collapse:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Left)],EditAttribute:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Enter)],HideElement:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.H)],ToggleEditAsHTML:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F2)],NextProperty:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Tab)],PreviousProperty:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Tab,WebInspector.KeyboardShortcut.Modifiers.Shift)],IncrementValue:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up)],DecrementValue:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down)],IncrementBy10:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageUp),WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up,WebInspector.KeyboardShortcut.Modifiers.Shift)],DecrementBy10:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageDown),WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down,WebInspector.KeyboardShortcut.Modifiers.Shift)],IncrementBy100:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageUp,WebInspector.KeyboardShortcut.Modifiers.Shift)],DecrementBy100:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageDown,WebInspector.KeyboardShortcut.Modifiers.Shift)],IncrementBy01:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up,WebInspector.KeyboardShortcut.Modifiers.Alt)],DecrementBy01:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down,WebInspector.KeyboardShortcut.Modifiers.Alt)]};WebInspector.ShortcutsScreen.SourcesPanelShortcuts={SelectNextOccurrence:[WebInspector.KeyboardShortcut.makeDescriptor("d",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],SoftUndo:[WebInspector.KeyboardShortcut.makeDescriptor("u",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],GotoMatchingBracket:[WebInspector.KeyboardShortcut.makeDescriptor("m",WebInspector.KeyboardShortcut.Modifiers.Ctrl)],ToggleAutocompletion:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Space,WebInspector.KeyboardShortcut.Modifiers.Ctrl)],IncreaseCSSUnitByOne:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up,WebInspector.KeyboardShortcut.Modifiers.Alt)],DecreaseCSSUnitByOne:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down,WebInspector.KeyboardShortcut.Modifiers.Alt)],IncreaseCSSUnitByTen:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageUp,WebInspector.KeyboardShortcut.Modifiers.Alt)],DecreaseCSSUnitByTen:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageDown,WebInspector.KeyboardShortcut.Modifiers.Alt)],EvaluateSelectionInConsole:[WebInspector.KeyboardShortcut.makeDescriptor("e",WebInspector.KeyboardShortcut.Modifiers.Shift|WebInspector.KeyboardShortcut.Modifiers.Ctrl)],AddSelectionToWatch:[WebInspector.KeyboardShortcut.makeDescriptor("a",WebInspector.KeyboardShortcut.Modifiers.Shift|WebInspector.KeyboardShortcut.Modifiers.Ctrl)],GoToMember:[WebInspector.KeyboardShortcut.makeDescriptor("p",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta|WebInspector.KeyboardShortcut.Modifiers.Shift)],GoToLine:[WebInspector.KeyboardShortcut.makeDescriptor("g",WebInspector.KeyboardShortcut.Modifiers.Ctrl)],ToggleBreakpoint:[WebInspector.KeyboardShortcut.makeDescriptor("b",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],NextCallFrame:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Period,WebInspector.KeyboardShortcut.Modifiers.Ctrl)],PrevCallFrame:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Comma,WebInspector.KeyboardShortcut.Modifiers.Ctrl)],ToggleComment:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Slash,WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],JumpToPreviousLocation:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Minus,WebInspector.KeyboardShortcut.Modifiers.Alt)],JumpToNextLocation:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Plus,WebInspector.KeyboardShortcut.Modifiers.Alt)],CloseEditorTab:[WebInspector.KeyboardShortcut.makeDescriptor("w",WebInspector.KeyboardShortcut.Modifiers.Alt)],Save:[WebInspector.KeyboardShortcut.makeDescriptor("s",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],SaveAll:[WebInspector.KeyboardShortcut.makeDescriptor("s",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta|WebInspector.KeyboardShortcut.Modifiers.ShiftOrOption)],};WebInspector.ShortcutsScreen.LayersPanelShortcuts={ResetView:[WebInspector.KeyboardShortcut.makeDescriptor("0")],PanMode:[WebInspector.KeyboardShortcut.makeDescriptor("x")],RotateMode:[WebInspector.KeyboardShortcut.makeDescriptor("v")],TogglePanRotate:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Shift)],ZoomIn:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Plus,WebInspector.KeyboardShortcut.Modifiers.Shift),WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.NumpadPlus)],ZoomOut:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Minus,WebInspector.KeyboardShortcut.Modifiers.Shift),WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.NumpadMinus)],Up:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up),WebInspector.KeyboardShortcut.makeDescriptor("w")],Down:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down),WebInspector.KeyboardShortcut.makeDescriptor("s")],Left:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Left),WebInspector.KeyboardShortcut.makeDescriptor("a")],Right:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Right),WebInspector.KeyboardShortcut.makeDescriptor("d")]};WebInspector.FrameworkEventListenersObject;WebInspector.EventListenerObjectInInspectedPage;WebInspector.EventListener.frameworkEventListeners=function(object)
{if(!object.target().isPage()){return Promise.resolve(({eventListeners:[],internalHandlers:null}));}
var listenersResult=({eventListeners:[]});return object.callFunctionPromise(frameworkEventListeners,undefined).then(assertCallFunctionResult).then(getOwnProperties).then(createEventListeners).then(returnResult).catchException(listenersResult);function getOwnProperties(object)
{return object.getOwnPropertiesPromise();}
function createEventListeners(result)
{if(!result.properties)
throw new Error("Object properties is empty");var promises=[];for(var property of result.properties){if(property.name==="eventListeners"&&property.value)
promises.push(convertToEventListeners(property.value).then(storeEventListeners));if(property.name==="internalHandlers"&&property.value)
promises.push(convertToInternalHandlers(property.value).then(storeInternalHandlers));if(property.name==="errorString"&&property.value)
printErrorString(property.value);}
return(Promise.all(promises));}
function convertToEventListeners(pageEventListenersObject)
{return WebInspector.RemoteArray.objectAsArray(pageEventListenersObject).map(toEventListener).then(filterOutEmptyObjects);function toEventListener(listenerObject)
{var type;var useCapture;var handler=null;var originalHandler=null;var location=null;var removeFunctionObject=null;var promises=[];promises.push(listenerObject.callFunctionJSONPromise(truncatePageEventListener,undefined).then(storeTruncatedListener));function truncatePageEventListener()
{return{type:this.type,useCapture:this.useCapture};}
function storeTruncatedListener(truncatedListener)
{type=truncatedListener.type;useCapture=truncatedListener.useCapture;}
promises.push(listenerObject.callFunctionPromise(handlerFunction).then(assertCallFunctionResult).then(storeOriginalHandler).then(toTargetFunction).then(storeFunctionWithDetails));function handlerFunction()
{return this.handler;}
function storeOriginalHandler(functionObject)
{originalHandler=functionObject;return originalHandler;}
function storeFunctionWithDetails(functionObject)
{handler=functionObject;return(functionObject.functionDetailsPromise().then(storeFunctionDetails));}
function storeFunctionDetails(functionDetails)
{location=functionDetails?functionDetails.location:null;}
promises.push(listenerObject.callFunctionPromise(getRemoveFunction).then(assertCallFunctionResult).then(storeRemoveFunction));function getRemoveFunction()
{return this.remove;}
function storeRemoveFunction(functionObject)
{if(functionObject.type!=="function")
return;removeFunctionObject=functionObject;}
return Promise.all(promises).then(createEventListener).catchException((null));function createEventListener()
{if(!location)
throw new Error("Empty event listener's location");return new WebInspector.EventListener(handler._target,type,useCapture,handler,originalHandler,location,removeFunctionObject,"frameworkUser");}}}
function convertToInternalHandlers(pageInternalHandlersObject)
{return WebInspector.RemoteArray.objectAsArray(pageInternalHandlersObject).map(toTargetFunction).then(WebInspector.RemoteArray.createFromRemoteObjects);}
function toTargetFunction(functionObject)
{return WebInspector.RemoteFunction.objectAsFunction(functionObject).targetFunction();}
function storeEventListeners(eventListeners)
{listenersResult.eventListeners=eventListeners;}
function storeInternalHandlers(internalHandlers)
{listenersResult.internalHandlers=internalHandlers;}
function printErrorString(errorString)
{WebInspector.console.error(errorString.value);}
function returnResult()
{return listenersResult;}
function assertCallFunctionResult(result)
{if(result.wasThrown||!result.object)
throw new Error("Exception in callFunction or empty result");return result.object;}
function filterOutEmptyObjects(objects)
{return objects.filter(filterOutEmpty);function filterOutEmpty(object)
{return!!object;}}
function frameworkEventListeners()
{var errorLines=[];var eventListeners=[];var internalHandlers=[];var fetchers=[jQueryFetcher];try{if(self.devtoolsFrameworkEventListeners&&isArrayLike(self.devtoolsFrameworkEventListeners))
fetchers=fetchers.concat(self.devtoolsFrameworkEventListeners);}catch(e){errorLines.push("devtoolsFrameworkEventListeners call produced error: "+toString(e));}
for(var i=0;i<fetchers.length;++i){try{var fetcherResult=fetchers[i](this);if(fetcherResult.eventListeners&&isArrayLike(fetcherResult.eventListeners)){eventListeners=eventListeners.concat(fetcherResult.eventListeners.map(checkEventListener).filter(nonEmptyObject));}
if(fetcherResult.internalHandlers&&isArrayLike(fetcherResult.internalHandlers))
internalHandlers=internalHandlers.concat(fetcherResult.internalHandlers.map(checkInternalHandler).filter(nonEmptyObject));}catch(e){errorLines.push("fetcher call produced error: "+toString(e));}}
var result={eventListeners:eventListeners};if(internalHandlers.length)
result.internalHandlers=internalHandlers;if(errorLines.length){var errorString="Framework Event Listeners API Errors:\n\t"+errorLines.join("\n\t");errorString=errorString.substr(0,errorString.length-1);result.errorString=errorString;}
return result;function isArrayLike(obj)
{if(!obj||typeof obj!=="object")
return false;try{if(typeof obj.splice==="function"){var len=obj.length;return typeof len==="number"&&(len>>>0===len&&(len>0||1/len>0));}}catch(e){}
return false;}
function checkEventListener(eventListener)
{try{var errorString="";if(!eventListener)
errorString+="empty event listener, ";var type=eventListener.type;if(!type||(typeof type!=="string"))
errorString+="event listener's type isn't string or empty, ";var useCapture=eventListener.useCapture;if(typeof useCapture!=="boolean")
errorString+="event listener's useCapture isn't boolean or undefined, ";var handler=eventListener.handler;if(!handler||(typeof handler!=="function"))
errorString+="event listener's handler isn't a function or empty, ";var remove=eventListener.remove;if(remove&&(typeof remove!=="function"))
errorString+="event listener's remove isn't a function, ";if(!errorString){return{type:type,useCapture:useCapture,handler:handler,remove:remove};}else{errorLines.push(errorString.substr(0,errorString.length-2));return null;}}catch(e){errorLines.push(toString(e));return null;}}
function checkInternalHandler(handler)
{if(handler&&(typeof handler==="function"))
return handler;errorLines.push("internal handler isn't a function or empty");return null;}
function toString(obj)
{try{return""+obj;}catch(e){return"<error>";}}
function nonEmptyObject(obj)
{return!!obj;}
function jQueryFetcher(node)
{if(!node||!(node instanceof Node))
return{eventListeners:[]};var jQuery=(window["jQuery"]);if(!jQuery||!jQuery.fn)
return{eventListeners:[]};var jQueryFunction=(jQuery);var data=jQuery._data||jQuery.data;var eventListeners=[];var internalHandlers=[];if(typeof data==="function"){var events=data(node,"events");for(var type in events){for(var key in events[type]){var frameworkListener=events[type][key];if(typeof frameworkListener==="object"||typeof frameworkListener==="function"){var listener={handler:frameworkListener.handler||frameworkListener,useCapture:true,type:type};listener.remove=jQueryRemove.bind(node,frameworkListener.selector);eventListeners.push(listener);}}}
var nodeData=data(node);if(nodeData&&typeof nodeData.handle==="function")
internalHandlers.push(nodeData.handle);}
var entry=jQueryFunction(node)[0];if(entry){var entryEvents=entry["$events"];for(var type in entryEvents){var events=entryEvents[type];for(var key in events){if(typeof events[key]==="function"){var listener={handler:events[key],useCapture:true,type:type};eventListeners.push(listener);}}}
if(entry&&entry["$handle"])
internalHandlers.push(entry["$handle"]);}
return{eventListeners:eventListeners,internalHandlers:internalHandlers};}
function jQueryRemove(selector,type,handler)
{if(!this||!(this instanceof Node))
return;var node=(this);var jQuery=(window["jQuery"]);if(!jQuery||!jQuery.fn)
return;var jQueryFunction=(jQuery);jQueryFunction(node).off(type,selector,handler);}}};WebInspector.EventListenersResult;WebInspector.EventListenersView=function(element)
{this._element=element;this._treeOutline=new TreeOutlineInShadow("event-listener-tree");this._treeOutline.registerRequiredCSS("components/objectValue.css");this._treeOutline.registerRequiredCSS("components/eventListenersView.css");this._treeOutline.setComparator(WebInspector.EventListenersTreeElement.comparator);this._treeOutline.element.classList.add("monospace");this._element.appendChild(this._treeOutline.element)
this._emptyHolder=createElementWithClass("div","info");this._emptyHolder.textContent=WebInspector.UIString("No Event Listeners");this._linkifier=new WebInspector.Linkifier();this._treeItemMap=new Map();}
WebInspector.EventListenersView.prototype={addObjects:function(objects)
{this.reset();var promises=[];for(var object of objects)
promises.push(this._addObject(object));return Promise.all(promises).then(this.addEmptyHolderIfNeeded.bind(this)).then(this._eventListenersArrivedForTest.bind(this));},_addObject:function(object)
{var eventListeners=null;var frameworkEventListenersObject=null;var promises=[];promises.push(object.eventListeners().then(storeEventListeners));promises.push(WebInspector.EventListener.frameworkEventListeners(object).then(storeFrameworkEventListenersObject));return Promise.all(promises).then(markInternalEventListeners).then(addEventListeners.bind(this));function storeEventListeners(result)
{eventListeners=result;}
function storeFrameworkEventListenersObject(result)
{frameworkEventListenersObject=result;}
function markInternalEventListeners()
{if(!eventListeners||!frameworkEventListenersObject.internalHandlers)
return Promise.resolve(undefined);return frameworkEventListenersObject.internalHandlers.object().callFunctionJSONPromise(isInternalEventListener,eventListeners.map(handlerArgument)).then(setIsInternal);function handlerArgument(listener)
{return WebInspector.RemoteObject.toCallArgument(listener.handler());}
function isInternalEventListener()
{var isInternal=[];var internalHandlersSet=new Set(this);for(var handler of arguments)
isInternal.push(internalHandlersSet.has(handler));return isInternal;}
function setIsInternal(isInternal)
{for(var i=0;i<eventListeners.length;++i){if(isInternal[i])
eventListeners[i].setListenerType("frameworkInternal");}}}
function addEventListeners()
{this._addObjectEventListeners(object,eventListeners);this._addObjectEventListeners(object,frameworkEventListenersObject.eventListeners);}},_addObjectEventListeners:function(object,eventListeners)
{if(!eventListeners)
return;for(var eventListener of eventListeners){var treeItem=this._getOrCreateTreeElementForType(eventListener.type());treeItem.addObjectEventListener(eventListener,object);}},showFrameworkListeners:function(showFramework)
{var eventTypes=this._treeOutline.rootElement().children();for(var eventType of eventTypes){var hiddenEventType=true;for(var listenerElement of eventType.children()){var listenerType=listenerElement.eventListener().listenerType();var hidden=false;if(listenerType==="frameworkUser"&&!showFramework)
hidden=true;if(listenerType==="frameworkInternal"&&showFramework)
hidden=true;listenerElement.hidden=hidden;hiddenEventType=hiddenEventType&&hidden;}
eventType.hidden=hiddenEventType;}},_getOrCreateTreeElementForType:function(type)
{var treeItem=this._treeItemMap.get(type);if(!treeItem){treeItem=new WebInspector.EventListenersTreeElement(type,this._linkifier);this._treeItemMap.set(type,treeItem);treeItem.hidden=true;this._treeOutline.appendChild(treeItem);}
this._emptyHolder.remove();return treeItem;},addEmptyHolderIfNeeded:function()
{var allHidden=true;for(var eventType of this._treeOutline.rootElement().children()){eventType.hidden=!eventType.firstChild();allHidden=allHidden&&eventType.hidden;}
if(allHidden&&!this._emptyHolder.parentNode)
this._element.appendChild(this._emptyHolder);},reset:function()
{var eventTypes=this._treeOutline.rootElement().children();for(var eventType of eventTypes)
eventType.removeChildren();this._linkifier.reset();},_eventListenersArrivedForTest:function()
{}}
WebInspector.EventListenersTreeElement=function(type,linkifier)
{TreeElement.call(this,type);this.toggleOnClick=true;this.selectable=false;this._linkifier=linkifier;}
WebInspector.EventListenersTreeElement.comparator=function(element1,element2){if(element1.title===element2.title)
return 0;return element1.title>element2.title?1:-1;}
WebInspector.EventListenersTreeElement.prototype={addObjectEventListener:function(eventListener,object)
{var treeElement=new WebInspector.ObjectEventListenerBar(eventListener,object,this._linkifier);this.appendChild((treeElement));},__proto__:TreeElement.prototype}
WebInspector.ObjectEventListenerBar=function(eventListener,object,linkifier)
{TreeElement.call(this,"",true);this._eventListener=eventListener;this.editable=false;this.selectable=false;this._setTitle(object,linkifier);}
WebInspector.ObjectEventListenerBar.prototype={onpopulate:function()
{var properties=[];var eventListener=this._eventListener;var runtimeModel=eventListener.target().runtimeModel;properties.push(runtimeModel.createRemotePropertyFromPrimitiveValue("useCapture",eventListener.useCapture()));if(typeof eventListener.handler()!=="undefined")
properties.push(new WebInspector.RemoteObjectProperty("handler",eventListener.handler()));WebInspector.ObjectPropertyTreeElement.populateWithProperties(this,properties,[],true,null);},_setTitle:function(object,linkifier)
{var title=this.listItemElement.createChild("span");var subtitle=this.listItemElement.createChild("span","event-listener-tree-subtitle");subtitle.appendChild(linkifier.linkifyRawLocation(this._eventListener.location(),this._eventListener.sourceURL()));title.appendChild(WebInspector.ObjectPropertiesSection.createValueElement(object,false));if(this._eventListener.removeFunction()){var deleteButton=title.createChild("span","event-listener-delete-button");deleteButton.textContent=WebInspector.UIString("Remove");deleteButton.title=WebInspector.UIString("Delete event listener");deleteButton.addEventListener("click",removeListener.bind(this),false);title.appendChild(deleteButton);}
function removeListener(event)
{event.consume();this._removeListenerBar();this._eventListener.remove();}},_removeListenerBar:function()
{var parent=this.parent;parent.removeChild(this);if(!parent.childCount()){parent.parent.removeChild(parent);return;}
var allHidden=true;for(var i=0;i<parent.childCount();++i)
if(!parent.childAt(i).hidden)
allHidden=false;parent.hidden=allHidden;},eventListener:function()
{return this._eventListener;},__proto__:TreeElement.prototype};WebInspector.reload=function()
{if(WebInspector.dockController.canDock()&&WebInspector.dockController.dockSide()===WebInspector.DockController.State.Undocked)
InspectorFrontendHost.setIsDocked(true,function(){});window.location.reload();};function defineCommonExtensionSymbols(apiPrivate)
{if(!apiPrivate.audits)
apiPrivate.audits={};apiPrivate.audits.Severity={Info:"info",Warning:"warning",Severe:"severe"};if(!apiPrivate.panels)
apiPrivate.panels={};apiPrivate.panels.SearchAction={CancelSearch:"cancelSearch",PerformSearch:"performSearch",NextSearchResult:"nextSearchResult",PreviousSearchResult:"previousSearchResult"};apiPrivate.Events={AuditStarted:"audit-started-",ButtonClicked:"button-clicked-",PanelObjectSelected:"panel-objectSelected-",NetworkRequestFinished:"network-request-finished",OpenResource:"open-resource",PanelSearch:"panel-search-",ResourceAdded:"resource-added",ResourceContentCommitted:"resource-content-committed",ViewShown:"view-shown-",ViewHidden:"view-hidden-"};apiPrivate.Commands={AddAuditCategory:"addAuditCategory",AddAuditResult:"addAuditResult",AddRequestHeaders:"addRequestHeaders",ApplyStyleSheet:"applyStyleSheet",CreatePanel:"createPanel",CreateSidebarPane:"createSidebarPane",CreateToolbarButton:"createToolbarButton",EvaluateOnInspectedPage:"evaluateOnInspectedPage",ForwardKeyboardEvent:"_forwardKeyboardEvent",GetHAR:"getHAR",GetPageResources:"getPageResources",GetRequestContent:"getRequestContent",GetResourceContent:"getResourceContent",InspectedURLChanged:"inspectedURLChanged",OpenResource:"openResource",Reload:"Reload",Subscribe:"subscribe",SetOpenResourceHandler:"setOpenResourceHandler",SetResourceContent:"setResourceContent",SetSidebarContent:"setSidebarContent",SetSidebarHeight:"setSidebarHeight",SetSidebarPage:"setSidebarPage",ShowPanel:"showPanel",StopAuditCategoryRun:"stopAuditCategoryRun",Unsubscribe:"unsubscribe",UpdateAuditProgress:"updateAuditProgress",UpdateButton:"updateButton"};}
function injectedExtensionAPI(injectedScriptId)
{var apiPrivate={};defineCommonExtensionSymbols(apiPrivate);var commands=apiPrivate.Commands;var events=apiPrivate.Events;var userAction=false;function EventSinkImpl(type,customDispatch)
{this._type=type;this._listeners=[];this._customDispatch=customDispatch;}
EventSinkImpl.prototype={addListener:function(callback)
{if(typeof callback!=="function")
throw"addListener: callback is not a function";if(this._listeners.length===0)
extensionServer.sendRequest({command:commands.Subscribe,type:this._type});this._listeners.push(callback);extensionServer.registerHandler("notify-"+this._type,this._dispatch.bind(this));},removeListener:function(callback)
{var listeners=this._listeners;for(var i=0;i<listeners.length;++i){if(listeners[i]===callback){listeners.splice(i,1);break;}}
if(this._listeners.length===0)
extensionServer.sendRequest({command:commands.Unsubscribe,type:this._type});},_fire:function(vararg)
{var listeners=this._listeners.slice();for(var i=0;i<listeners.length;++i)
listeners[i].apply(null,arguments);},_dispatch:function(request)
{if(this._customDispatch)
this._customDispatch.call(this,request);else
this._fire.apply(this,request.arguments);}}
function InspectorExtensionAPI()
{this.audits=new Audits();this.inspectedWindow=new InspectedWindow();this.panels=new Panels();this.network=new Network();defineDeprecatedProperty(this,"webInspector","resources","network");}
function Network()
{function dispatchRequestEvent(message)
{var request=message.arguments[1];request.__proto__=new Request(message.arguments[0]);this._fire(request);}
this.onRequestFinished=new EventSink(events.NetworkRequestFinished,dispatchRequestEvent);defineDeprecatedProperty(this,"network","onFinished","onRequestFinished");this.onNavigated=new EventSink(events.InspectedURLChanged);}
Network.prototype={getHAR:function(callback)
{function callbackWrapper(result)
{var entries=(result&&result.entries)||[];for(var i=0;i<entries.length;++i){entries[i].__proto__=new Request(entries[i]._requestId);delete entries[i]._requestId;}
callback(result);}
extensionServer.sendRequest({command:commands.GetHAR},callback&&callbackWrapper);},addRequestHeaders:function(headers)
{extensionServer.sendRequest({command:commands.AddRequestHeaders,headers:headers,extensionId:window.location.hostname});}}
function RequestImpl(id)
{this._id=id;}
RequestImpl.prototype={getContent:function(callback)
{function callbackWrapper(response)
{callback(response.content,response.encoding);}
extensionServer.sendRequest({command:commands.GetRequestContent,id:this._id},callback&&callbackWrapper);}}
function Panels()
{var panels={elements:new ElementsPanel(),sources:new SourcesPanel(),};function panelGetter(name)
{return panels[name];}
for(var panel in panels)
this.__defineGetter__(panel,panelGetter.bind(null,panel));this.applyStyleSheet=function(styleSheet){extensionServer.sendRequest({command:commands.ApplyStyleSheet,styleSheet:styleSheet});};}
Panels.prototype={create:function(title,icon,page,callback)
{var id="extension-panel-"+extensionServer.nextObjectId();var request={command:commands.CreatePanel,id:id,title:title,icon:icon,page:page};extensionServer.sendRequest(request,callback&&callback.bind(this,new ExtensionPanel(id)));},setOpenResourceHandler:function(callback)
{var hadHandler=extensionServer.hasHandler(events.OpenResource);function callbackWrapper(message)
{userAction=true;try{callback.call(null,new Resource(message.resource),message.lineNumber);}finally{userAction=false;}}
if(!callback)
extensionServer.unregisterHandler(events.OpenResource);else
extensionServer.registerHandler(events.OpenResource,callbackWrapper);if(hadHandler===!callback)
extensionServer.sendRequest({command:commands.SetOpenResourceHandler,"handlerPresent":!!callback});},openResource:function(url,lineNumber,callback)
{extensionServer.sendRequest({command:commands.OpenResource,"url":url,"lineNumber":lineNumber},callback);},get SearchAction()
{return apiPrivate.panels.SearchAction;}}
function ExtensionViewImpl(id)
{this._id=id;function dispatchShowEvent(message)
{var frameIndex=message.arguments[0];if(typeof frameIndex==="number")
this._fire(window.parent.frames[frameIndex]);else
this._fire();}
if(id){this.onShown=new EventSink(events.ViewShown+id,dispatchShowEvent);this.onHidden=new EventSink(events.ViewHidden+id);}}
function PanelWithSidebarImpl(hostPanelName)
{ExtensionViewImpl.call(this,null);this._hostPanelName=hostPanelName;this.onSelectionChanged=new EventSink(events.PanelObjectSelected+hostPanelName);}
PanelWithSidebarImpl.prototype={createSidebarPane:function(title,callback)
{var id="extension-sidebar-"+extensionServer.nextObjectId();var request={command:commands.CreateSidebarPane,panel:this._hostPanelName,id:id,title:title};function callbackWrapper()
{callback(new ExtensionSidebarPane(id));}
extensionServer.sendRequest(request,callback&&callbackWrapper);},__proto__:ExtensionViewImpl.prototype}
function declareInterfaceClass(implConstructor)
{return function()
{var impl={__proto__:implConstructor.prototype};implConstructor.apply(impl,arguments);populateInterfaceClass(this,impl);};}
function defineDeprecatedProperty(object,className,oldName,newName)
{var warningGiven=false;function getter()
{if(!warningGiven){console.warn(className+"."+oldName+" is deprecated. Use "+className+"."+newName+" instead");warningGiven=true;}
return object[newName];}
object.__defineGetter__(oldName,getter);}
function extractCallbackArgument(args)
{var lastArgument=args[args.length-1];return typeof lastArgument==="function"?lastArgument:undefined;}
var AuditCategory=declareInterfaceClass(AuditCategoryImpl);var AuditResult=declareInterfaceClass(AuditResultImpl);var Button=declareInterfaceClass(ButtonImpl);var EventSink=declareInterfaceClass(EventSinkImpl);var ExtensionPanel=declareInterfaceClass(ExtensionPanelImpl);var ExtensionSidebarPane=declareInterfaceClass(ExtensionSidebarPaneImpl);var PanelWithSidebar=declareInterfaceClass(PanelWithSidebarImpl);var Request=declareInterfaceClass(RequestImpl);var Resource=declareInterfaceClass(ResourceImpl);function ElementsPanel()
{PanelWithSidebar.call(this,"elements");}
ElementsPanel.prototype={__proto__:PanelWithSidebar.prototype}
function SourcesPanel()
{PanelWithSidebar.call(this,"sources");}
SourcesPanel.prototype={__proto__:PanelWithSidebar.prototype}
function ExtensionPanelImpl(id)
{ExtensionViewImpl.call(this,id);this.onSearch=new EventSink(events.PanelSearch+id);}
ExtensionPanelImpl.prototype={createStatusBarButton:function(iconPath,tooltipText,disabled)
{var id="button-"+extensionServer.nextObjectId();var request={command:commands.CreateToolbarButton,panel:this._id,id:id,icon:iconPath,tooltip:tooltipText,disabled:!!disabled};extensionServer.sendRequest(request);return new Button(id);},show:function()
{if(!userAction)
return;var request={command:commands.ShowPanel,id:this._id};extensionServer.sendRequest(request);},__proto__:ExtensionViewImpl.prototype}
function ExtensionSidebarPaneImpl(id)
{ExtensionViewImpl.call(this,id);}
ExtensionSidebarPaneImpl.prototype={setHeight:function(height)
{extensionServer.sendRequest({command:commands.SetSidebarHeight,id:this._id,height:height});},setExpression:function(expression,rootTitle,evaluateOptions)
{var request={command:commands.SetSidebarContent,id:this._id,expression:expression,rootTitle:rootTitle,evaluateOnPage:true,};if(typeof evaluateOptions==="object")
request.evaluateOptions=evaluateOptions;extensionServer.sendRequest(request,extractCallbackArgument(arguments));},setObject:function(jsonObject,rootTitle,callback)
{extensionServer.sendRequest({command:commands.SetSidebarContent,id:this._id,expression:jsonObject,rootTitle:rootTitle},callback);},setPage:function(page)
{extensionServer.sendRequest({command:commands.SetSidebarPage,id:this._id,page:page});},__proto__:ExtensionViewImpl.prototype}
function ButtonImpl(id)
{this._id=id;this.onClicked=new EventSink(events.ButtonClicked+id);}
ButtonImpl.prototype={update:function(iconPath,tooltipText,disabled)
{var request={command:commands.UpdateButton,id:this._id,icon:iconPath,tooltip:tooltipText,disabled:!!disabled};extensionServer.sendRequest(request);}};function Audits()
{}
Audits.prototype={addCategory:function(displayName,resultCount)
{var id="extension-audit-category-"+extensionServer.nextObjectId();if(typeof resultCount!=="undefined")
console.warn("Passing resultCount to audits.addCategory() is deprecated. Use AuditResult.updateProgress() instead.");extensionServer.sendRequest({command:commands.AddAuditCategory,id:id,displayName:displayName,resultCount:resultCount});return new AuditCategory(id);}}
function AuditCategoryImpl(id)
{function dispatchAuditEvent(request)
{var auditResult=new AuditResult(request.arguments[0]);try{this._fire(auditResult);}catch(e){console.error("Uncaught exception in extension audit event handler: "+e);auditResult.done();}}
this._id=id;this.onAuditStarted=new EventSink(events.AuditStarted+id,dispatchAuditEvent);}
function AuditResultImpl(id)
{this._id=id;this.createURL=this._nodeFactory.bind(this,"url");this.createSnippet=this._nodeFactory.bind(this,"snippet");this.createText=this._nodeFactory.bind(this,"text");this.createObject=this._nodeFactory.bind(this,"object");this.createNode=this._nodeFactory.bind(this,"node");}
AuditResultImpl.prototype={addResult:function(displayName,description,severity,details)
{if(details&&!(details instanceof AuditResultNode))
details=new AuditResultNode(Array.isArray(details)?details:[details]);var request={command:commands.AddAuditResult,resultId:this._id,displayName:displayName,description:description,severity:severity,details:details};extensionServer.sendRequest(request);},createResult:function()
{return new AuditResultNode(Array.prototype.slice.call(arguments));},updateProgress:function(worked,totalWork)
{extensionServer.sendRequest({command:commands.UpdateAuditProgress,resultId:this._id,progress:worked/totalWork});},done:function()
{extensionServer.sendRequest({command:commands.StopAuditCategoryRun,resultId:this._id});},get Severity()
{return apiPrivate.audits.Severity;},createResourceLink:function(url,lineNumber)
{return{type:"resourceLink",arguments:[url,lineNumber&&lineNumber-1]};},_nodeFactory:function(type)
{return{type:type,arguments:Array.prototype.slice.call(arguments,1)};}}
function AuditResultNode(contents)
{this.contents=contents;this.children=[];this.expanded=false;}
AuditResultNode.prototype={addChild:function()
{var node=new AuditResultNode(Array.prototype.slice.call(arguments));this.children.push(node);return node;}};function InspectedWindow()
{function dispatchResourceEvent(message)
{this._fire(new Resource(message.arguments[0]));}
function dispatchResourceContentEvent(message)
{this._fire(new Resource(message.arguments[0]),message.arguments[1]);}
this.onResourceAdded=new EventSink(events.ResourceAdded,dispatchResourceEvent);this.onResourceContentCommitted=new EventSink(events.ResourceContentCommitted,dispatchResourceContentEvent);}
InspectedWindow.prototype={reload:function(optionsOrUserAgent)
{var options=null;if(typeof optionsOrUserAgent==="object"){options=optionsOrUserAgent;}else if(typeof optionsOrUserAgent==="string"){options={userAgent:optionsOrUserAgent};console.warn("Passing userAgent as string parameter to inspectedWindow.reload() is deprecated. "+"Use inspectedWindow.reload({ userAgent: value}) instead.");}
extensionServer.sendRequest({command:commands.Reload,options:options});},eval:function(expression,evaluateOptions)
{var callback=extractCallbackArgument(arguments);function callbackWrapper(result)
{if(result.isError||result.isException)
callback(undefined,result);else
callback(result.value);}
var request={command:commands.EvaluateOnInspectedPage,expression:expression};if(typeof evaluateOptions==="object")
request.evaluateOptions=evaluateOptions;extensionServer.sendRequest(request,callback&&callbackWrapper);return null;},getResources:function(callback)
{function wrapResource(resourceData)
{return new Resource(resourceData);}
function callbackWrapper(resources)
{callback(resources.map(wrapResource));}
extensionServer.sendRequest({command:commands.GetPageResources},callback&&callbackWrapper);}}
function ResourceImpl(resourceData)
{this._url=resourceData.url;this._type=resourceData.type;}
ResourceImpl.prototype={get url()
{return this._url;},get type()
{return this._type;},getContent:function(callback)
{function callbackWrapper(response)
{callback(response.content,response.encoding);}
extensionServer.sendRequest({command:commands.GetResourceContent,url:this._url},callback&&callbackWrapper);},setContent:function(content,commit,callback)
{extensionServer.sendRequest({command:commands.SetResourceContent,url:this._url,content:content,commit:commit},callback);}}
var keyboardEventRequestQueue=[];var forwardTimer=null;function forwardKeyboardEvent(event)
{const Esc="U+001B";if(!event.ctrlKey&&!event.altKey&&!event.metaKey&&!/^F\d+$/.test(event.keyIdentifier)&&event.keyIdentifier!==Esc)
return;var requestPayload={eventType:event.type,ctrlKey:event.ctrlKey,altKey:event.altKey,metaKey:event.metaKey,keyIdentifier:event.keyIdentifier,location:event.location,keyCode:event.keyCode};keyboardEventRequestQueue.push(requestPayload);if(!forwardTimer)
forwardTimer=setTimeout(forwardEventQueue,0);}
function forwardEventQueue()
{forwardTimer=null;var request={command:commands.ForwardKeyboardEvent,entries:keyboardEventRequestQueue};extensionServer.sendRequest(request);keyboardEventRequestQueue=[];}
document.addEventListener("keydown",forwardKeyboardEvent,false);document.addEventListener("keypress",forwardKeyboardEvent,false);function ExtensionServerClient()
{this._callbacks={};this._handlers={};this._lastRequestId=0;this._lastObjectId=0;this.registerHandler("callback",this._onCallback.bind(this));var channel=new MessageChannel();this._port=channel.port1;this._port.addEventListener("message",this._onMessage.bind(this),false);this._port.start();window.parent.postMessage("registerExtension",[channel.port2],"*");}
ExtensionServerClient.prototype={sendRequest:function(message,callback)
{if(typeof callback==="function")
message.requestId=this._registerCallback(callback);this._port.postMessage(message);},hasHandler:function(command)
{return!!this._handlers[command];},registerHandler:function(command,handler)
{this._handlers[command]=handler;},unregisterHandler:function(command)
{delete this._handlers[command];},nextObjectId:function()
{return injectedScriptId.toString()+"_"+ ++this._lastObjectId;},_registerCallback:function(callback)
{var id=++this._lastRequestId;this._callbacks[id]=callback;return id;},_onCallback:function(request)
{if(request.requestId in this._callbacks){var callback=this._callbacks[request.requestId];delete this._callbacks[request.requestId];callback(request.result);}},_onMessage:function(event)
{var request=event.data;var handler=this._handlers[request.command];if(handler)
handler.call(this,request);}}
function populateInterfaceClass(interfaze,implementation)
{for(var member in implementation){if(member.charAt(0)==="_")
continue;var descriptor=null;for(var owner=implementation;owner&&!descriptor;owner=owner.__proto__)
descriptor=Object.getOwnPropertyDescriptor(owner,member);if(!descriptor)
continue;if(typeof descriptor.value==="function")
interfaze[member]=descriptor.value.bind(implementation);else if(typeof descriptor.get==="function")
interfaze.__defineGetter__(member,descriptor.get.bind(implementation));else
Object.defineProperty(interfaze,member,descriptor);}}
if(!extensionServer)
extensionServer=new ExtensionServerClient();return new InspectorExtensionAPI();}
function platformExtensionAPI(coreAPI)
{function getTabId()
{return tabId;}
chrome=window.chrome||{};var devtools_descriptor=Object.getOwnPropertyDescriptor(chrome,"devtools");if(!devtools_descriptor||devtools_descriptor.get)
Object.defineProperty(chrome,"devtools",{value:{},enumerable:true});chrome.devtools.inspectedWindow={};chrome.devtools.inspectedWindow.__defineGetter__("tabId",getTabId);chrome.devtools.inspectedWindow.__proto__=coreAPI.inspectedWindow;chrome.devtools.network=coreAPI.network;chrome.devtools.panels=coreAPI.panels;if(extensionInfo.exposeExperimentalAPIs!==false){chrome.experimental=chrome.experimental||{};chrome.experimental.devtools=chrome.experimental.devtools||{};var properties=Object.getOwnPropertyNames(coreAPI);for(var i=0;i<properties.length;++i){var descriptor=Object.getOwnPropertyDescriptor(coreAPI,properties[i]);Object.defineProperty(chrome.experimental.devtools,properties[i],descriptor);}
chrome.experimental.devtools.inspectedWindow=chrome.devtools.inspectedWindow;}
if(extensionInfo.exposeWebInspectorNamespace)
window.webInspector=coreAPI;}
function buildPlatformExtensionAPI(extensionInfo,inspectedTabId)
{return"var extensionInfo = "+JSON.stringify(extensionInfo)+";"+"var tabId = "+inspectedTabId+";"+
platformExtensionAPI.toString();}
function buildExtensionAPIInjectedScript(extensionInfo,inspectedTabId)
{return"(function(injectedScriptId){ "+"var extensionServer;"+
defineCommonExtensionSymbols.toString()+";"+
injectedExtensionAPI.toString()+";"+
buildPlatformExtensionAPI(extensionInfo,inspectedTabId)+";"+"platformExtensionAPI(injectedExtensionAPI(injectedScriptId));"+"return {};"+"})";};WebInspector.ExtensionAuditCategory=function(extensionOrigin,id,displayName,ruleCount)
{this.extensionOrigin=extensionOrigin;this.id=id;this.displayName=displayName;this.ruleCount=ruleCount;}
WebInspector.ExtensionAuditCategoryResults=function()
{}
WebInspector.ExtensionAuditCategoryResults.prototype={id:function(){},addResult:function(displayName,description,severity,details){},updateProgress:function(progress){},done:function(){}};if(!window.InspectorExtensionRegistry){WebInspector.InspectorExtensionRegistryStub=function()
{}
WebInspector.InspectorExtensionRegistryStub.prototype={getExtensionsAsync:function()
{}}
var InspectorExtensionRegistry=new WebInspector.InspectorExtensionRegistryStub();};WebInspector.ExtensionServer=function()
{this._clientObjects={};this._handlers={};this._subscribers={};this._subscriptionStartHandlers={};this._subscriptionStopHandlers={};this._extraHeaders={};this._requests={};this._lastRequestId=0;this._registeredExtensions={};this._status=new WebInspector.ExtensionStatus();this._sidebarPanes=[];this._auditCategories=[];var commands=WebInspector.extensionAPI.Commands;this._registerHandler(commands.AddAuditCategory,this._onAddAuditCategory.bind(this));this._registerHandler(commands.AddAuditResult,this._onAddAuditResult.bind(this));this._registerHandler(commands.AddRequestHeaders,this._onAddRequestHeaders.bind(this));this._registerHandler(commands.ApplyStyleSheet,this._onApplyStyleSheet.bind(this));this._registerHandler(commands.CreatePanel,this._onCreatePanel.bind(this));this._registerHandler(commands.CreateSidebarPane,this._onCreateSidebarPane.bind(this));this._registerHandler(commands.CreateToolbarButton,this._onCreateToolbarButton.bind(this));this._registerHandler(commands.EvaluateOnInspectedPage,this._onEvaluateOnInspectedPage.bind(this));this._registerHandler(commands.ForwardKeyboardEvent,this._onForwardKeyboardEvent.bind(this));this._registerHandler(commands.GetHAR,this._onGetHAR.bind(this));this._registerHandler(commands.GetPageResources,this._onGetPageResources.bind(this));this._registerHandler(commands.GetRequestContent,this._onGetRequestContent.bind(this));this._registerHandler(commands.GetResourceContent,this._onGetResourceContent.bind(this));this._registerHandler(commands.Reload,this._onReload.bind(this));this._registerHandler(commands.SetOpenResourceHandler,this._onSetOpenResourceHandler.bind(this));this._registerHandler(commands.SetResourceContent,this._onSetResourceContent.bind(this));this._registerHandler(commands.SetSidebarHeight,this._onSetSidebarHeight.bind(this));this._registerHandler(commands.SetSidebarContent,this._onSetSidebarContent.bind(this));this._registerHandler(commands.SetSidebarPage,this._onSetSidebarPage.bind(this));this._registerHandler(commands.ShowPanel,this._onShowPanel.bind(this));this._registerHandler(commands.StopAuditCategoryRun,this._onStopAuditCategoryRun.bind(this));this._registerHandler(commands.Subscribe,this._onSubscribe.bind(this));this._registerHandler(commands.OpenResource,this._onOpenResource.bind(this));this._registerHandler(commands.Unsubscribe,this._onUnsubscribe.bind(this));this._registerHandler(commands.UpdateButton,this._onUpdateButton.bind(this));this._registerHandler(commands.UpdateAuditProgress,this._onUpdateAuditProgress.bind(this));window.addEventListener("message",this._onWindowMessage.bind(this),false);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.AddExtensions,this._addExtensions,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.SetInspectedTabId,this._setInspectedTabId,this);this._initExtensions();}
WebInspector.ExtensionServer.Events={SidebarPaneAdded:"SidebarPaneAdded",AuditCategoryAdded:"AuditCategoryAdded"}
WebInspector.ExtensionServer.prototype={initializeExtensions:function()
{this._initializeCommandIssued=true;if(this._pendingExtensionInfos){this._pendingExtensionInfos.forEach(this._addExtension,this);delete this._pendingExtensionInfos;}},hasExtensions:function()
{return!!Object.keys(this._registeredExtensions).length;},notifySearchAction:function(panelId,action,searchString)
{this._postNotification(WebInspector.extensionAPI.Events.PanelSearch+panelId,action,searchString);},notifyViewShown:function(identifier,frameIndex)
{this._postNotification(WebInspector.extensionAPI.Events.ViewShown+identifier,frameIndex);},notifyViewHidden:function(identifier)
{this._postNotification(WebInspector.extensionAPI.Events.ViewHidden+identifier);},notifyButtonClicked:function(identifier)
{this._postNotification(WebInspector.extensionAPI.Events.ButtonClicked+identifier);},_inspectedURLChanged:function(event)
{this._requests={};var url=event.data;this._postNotification(WebInspector.extensionAPI.Events.InspectedURLChanged,url);},startAuditRun:function(categoryId,auditResults)
{this._clientObjects[auditResults.id()]=auditResults;this._postNotification("audit-started-"+categoryId,auditResults.id());},stopAuditRun:function(auditResults)
{delete this._clientObjects[auditResults.id()];},hasSubscribers:function(type)
{return!!this._subscribers[type];},_postNotification:function(type,vararg)
{var subscribers=this._subscribers[type];if(!subscribers)
return;var message={command:"notify-"+type,arguments:Array.prototype.slice.call(arguments,1)};for(var i=0;i<subscribers.length;++i)
subscribers[i].postMessage(message);},_onSubscribe:function(message,port)
{var subscribers=this._subscribers[message.type];if(subscribers)
subscribers.push(port);else{this._subscribers[message.type]=[port];if(this._subscriptionStartHandlers[message.type])
this._subscriptionStartHandlers[message.type]();}},_onUnsubscribe:function(message,port)
{var subscribers=this._subscribers[message.type];if(!subscribers)
return;subscribers.remove(port);if(!subscribers.length){delete this._subscribers[message.type];if(this._subscriptionStopHandlers[message.type])
this._subscriptionStopHandlers[message.type]();}},_onAddRequestHeaders:function(message)
{var id=message.extensionId;if(typeof id!=="string")
return this._status.E_BADARGTYPE("extensionId",typeof id,"string");var extensionHeaders=this._extraHeaders[id];if(!extensionHeaders){extensionHeaders={};this._extraHeaders[id]=extensionHeaders;}
for(var name in message.headers)
extensionHeaders[name]=message.headers[name];var allHeaders=({});for(var extension in this._extraHeaders){var headers=this._extraHeaders[extension];for(name in headers){if(typeof headers[name]==="string")
allHeaders[name]=headers[name];}}
WebInspector.multitargetNetworkManager.setExtraHTTPHeaders(allHeaders);},_onApplyStyleSheet:function(message)
{if(!Runtime.experiments.isEnabled("applyCustomStylesheet"))
return;var styleSheet=createElement("style");styleSheet.textContent=message.styleSheet;document.head.appendChild(styleSheet);},_onCreatePanel:function(message,port)
{var id=message.id;if(id in this._clientObjects||WebInspector.inspectorView.hasPanel(id))
return this._status.E_EXISTS(id);var page=this._expandResourcePath(port._extensionOrigin,message.page);var persistentId=port._extensionOrigin+message.title;persistentId=persistentId.replace(/\s/g,"");var panelDescriptor=new WebInspector.ExtensionServerPanelDescriptor(persistentId,message.title,new WebInspector.ExtensionPanel(this,persistentId,id,page));this._clientObjects[id]=panelDescriptor;WebInspector.inspectorView.addPanel(panelDescriptor);return this._status.OK();},_onShowPanel:function(message)
{var panelName=message.id;var panelDescriptor=this._clientObjects[message.id];if(panelDescriptor&&panelDescriptor instanceof WebInspector.ExtensionServerPanelDescriptor)
panelName=panelDescriptor.name();WebInspector.inspectorView.showPanel(panelName);},_onCreateToolbarButton:function(message,port)
{var panelDescriptor=this._clientObjects[message.panel];if(!panelDescriptor||!(panelDescriptor instanceof WebInspector.ExtensionServerPanelDescriptor))
return this._status.E_NOTFOUND(message.panel);var button=new WebInspector.ExtensionButton(this,message.id,this._expandResourcePath(port._extensionOrigin,message.icon),message.tooltip,message.disabled);this._clientObjects[message.id]=button;panelDescriptor.panel().then(appendButton);function appendButton(panel)
{(panel).addToolbarItem(button.toolbarButton());}
return this._status.OK();},_onUpdateButton:function(message,port)
{var button=this._clientObjects[message.id];if(!button||!(button instanceof WebInspector.ExtensionButton))
return this._status.E_NOTFOUND(message.id);button.update(this._expandResourcePath(port._extensionOrigin,message.icon),message.tooltip,message.disabled);return this._status.OK();},_onCreateSidebarPane:function(message)
{if(message.panel!=="elements"&&message.panel!=="sources")
return this._status.E_NOTFOUND(message.panel);var id=message.id;var sidebar=new WebInspector.ExtensionSidebarPane(this,message.panel,message.title,id);this._sidebarPanes.push(sidebar);this._clientObjects[id]=sidebar;this.dispatchEventToListeners(WebInspector.ExtensionServer.Events.SidebarPaneAdded,sidebar);return this._status.OK();},sidebarPanes:function()
{return this._sidebarPanes;},_onSetSidebarHeight:function(message)
{var sidebar=this._clientObjects[message.id];if(!sidebar)
return this._status.E_NOTFOUND(message.id);sidebar.setHeight(message.height);return this._status.OK();},_onSetSidebarContent:function(message,port)
{var sidebar=this._clientObjects[message.id];if(!sidebar)
return this._status.E_NOTFOUND(message.id);function callback(error)
{var result=error?this._status.E_FAILED(error):this._status.OK();this._dispatchCallback(message.requestId,port,result);}
if(message.evaluateOnPage)
return sidebar.setExpression(message.expression,message.rootTitle,message.evaluateOptions,port._extensionOrigin,callback.bind(this));sidebar.setObject(message.expression,message.rootTitle,callback.bind(this));},_onSetSidebarPage:function(message,port)
{var sidebar=this._clientObjects[message.id];if(!sidebar)
return this._status.E_NOTFOUND(message.id);sidebar.setPage(this._expandResourcePath(port._extensionOrigin,message.page));},_onOpenResource:function(message)
{var uiSourceCode=WebInspector.networkMapping.uiSourceCodeForURLForAnyTarget(message.url);if(uiSourceCode){WebInspector.Revealer.reveal(uiSourceCode.uiLocation(message.lineNumber,0));return this._status.OK();}
var resource=WebInspector.resourceForURL(message.url);if(resource){WebInspector.Revealer.reveal(resource,message.lineNumber);return this._status.OK();}
var request=WebInspector.NetworkLog.requestForURL(message.url);if(request){WebInspector.Revealer.reveal(request);return this._status.OK();}
return this._status.E_NOTFOUND(message.url);},_onSetOpenResourceHandler:function(message,port)
{var name=this._registeredExtensions[port._extensionOrigin].name||("Extension "+port._extensionOrigin);if(message.handlerPresent)
WebInspector.openAnchorLocationRegistry.registerHandler(name,this._handleOpenURL.bind(this,port));else
WebInspector.openAnchorLocationRegistry.unregisterHandler(name);},_handleOpenURL:function(port,details)
{var url=(details.url);var contentProvider=WebInspector.workspace.uiSourceCodeForURL(url)||WebInspector.resourceForURL(url);if(!contentProvider)
return false;var lineNumber=details.lineNumber;if(typeof lineNumber==="number")
lineNumber+=1;port.postMessage({command:"open-resource",resource:this._makeResource(contentProvider),lineNumber:lineNumber});return true;},_onReload:function(message)
{var options=(message.options||{});WebInspector.multitargetNetworkManager.setUserAgentOverride(typeof options.userAgent==="string"?options.userAgent:"");var injectedScript;if(options.injectedScript)
injectedScript="(function(){"+options.injectedScript+"})()";WebInspector.targetManager.reloadPage(!!options.ignoreCache,injectedScript);return this._status.OK();},_onEvaluateOnInspectedPage:function(message,port)
{function callback(error,remoteObject,wasThrown)
{var result;if(error||!remoteObject)
result=this._status.E_PROTOCOLERROR(error.toString());else if(wasThrown)
result={isException:true,value:remoteObject.description};else
result={value:remoteObject.value};this._dispatchCallback(message.requestId,port,result);}
return this.evaluate(message.expression,true,true,message.evaluateOptions,port._extensionOrigin,callback.bind(this));},_onGetHAR:function()
{var requests=WebInspector.NetworkLog.requests();var harLog=(new WebInspector.HARLog(requests)).build();for(var i=0;i<harLog.entries.length;++i)
harLog.entries[i]._requestId=this._requestId(requests[i]);return harLog;},_makeResource:function(contentProvider)
{return{url:contentProvider.contentURL(),type:contentProvider.contentType().name()};},_onGetPageResources:function()
{var resources={};function pushResourceData(contentProvider)
{if(!resources[contentProvider.contentURL()])
resources[contentProvider.contentURL()]=this._makeResource(contentProvider);}
var uiSourceCodes=WebInspector.workspace.uiSourceCodesForProjectType(WebInspector.projectTypes.Network);uiSourceCodes=uiSourceCodes.concat(WebInspector.workspace.uiSourceCodesForProjectType(WebInspector.projectTypes.ContentScripts));uiSourceCodes.forEach(pushResourceData.bind(this));for(var target of WebInspector.targetManager.targets())
target.resourceTreeModel.forAllResources(pushResourceData.bind(this));return Object.values(resources);},_getResourceContent:function(contentProvider,message,port)
{function onContentAvailable(content)
{var contentEncoded=false;if(contentProvider instanceof WebInspector.Resource)
contentEncoded=contentProvider.contentEncoded;if(contentProvider instanceof WebInspector.NetworkRequest)
contentEncoded=contentProvider.contentEncoded;var response={encoding:contentEncoded&&content?"base64":"",content:content};this._dispatchCallback(message.requestId,port,response);}
contentProvider.requestContent(onContentAvailable.bind(this));},_onGetRequestContent:function(message,port)
{var request=this._requestById(message.id);if(!request)
return this._status.E_NOTFOUND(message.id);this._getResourceContent(request,message,port);},_onGetResourceContent:function(message,port)
{var url=(message.url);var contentProvider=WebInspector.workspace.uiSourceCodeForURL(url)||WebInspector.resourceForURL(url);if(!contentProvider)
return this._status.E_NOTFOUND(url);this._getResourceContent(contentProvider,message,port);},_onSetResourceContent:function(message,port)
{function callbackWrapper(error)
{var response=error?this._status.E_FAILED(error):this._status.OK();this._dispatchCallback(message.requestId,port,response);}
var url=(message.url);var uiSourceCode=WebInspector.workspace.uiSourceCodeForURL(url);if(!uiSourceCode||!uiSourceCode.contentType().isDocumentOrScriptOrStyleSheet()){var resource=WebInspector.ResourceTreeModel.resourceForURL(url);if(!resource)
return this._status.E_NOTFOUND(url);return this._status.E_NOTSUPPORTED("Resource is not editable");}
uiSourceCode.setWorkingCopy(message.content);if(message.commit)
uiSourceCode.commitWorkingCopy();callbackWrapper.call(this,null);},_requestId:function(request)
{if(!request._extensionRequestId){request._extensionRequestId=++this._lastRequestId;this._requests[request._extensionRequestId]=request;}
return request._extensionRequestId;},_requestById:function(id)
{return this._requests[id];},_onAddAuditCategory:function(message,port)
{var category=new WebInspector.ExtensionAuditCategory(port._extensionOrigin,message.id,message.displayName,message.resultCount);this._clientObjects[message.id]=category;this._auditCategories.push(category);this.dispatchEventToListeners(WebInspector.ExtensionServer.Events.AuditCategoryAdded,category);},auditCategories:function()
{return this._auditCategories;},_onAddAuditResult:function(message)
{var auditResult=(this._clientObjects[message.resultId]);if(!auditResult)
return this._status.E_NOTFOUND(message.resultId);try{auditResult.addResult(message.displayName,message.description,message.severity,message.details);}catch(e){return e;}
return this._status.OK();},_onUpdateAuditProgress:function(message)
{var auditResult=(this._clientObjects[message.resultId]);if(!auditResult)
return this._status.E_NOTFOUND(message.resultId);auditResult.updateProgress(Math.min(Math.max(0,message.progress),1));},_onStopAuditCategoryRun:function(message)
{var auditRun=(this._clientObjects[message.resultId]);if(!auditRun)
return this._status.E_NOTFOUND(message.resultId);auditRun.done();},_onForwardKeyboardEvent:function(message)
{const Esc="U+001B";message.entries.forEach(handleEventEntry);function handleEventEntry(entry)
{if(!entry.ctrlKey&&!entry.altKey&&!entry.metaKey&&!/^F\d+$/.test(entry.keyIdentifier)&&entry.keyIdentifier!==Esc)
return;var event=new window.KeyboardEvent(entry.eventType,{keyIdentifier:entry.keyIdentifier,location:entry.location,ctrlKey:entry.ctrlKey,altKey:entry.altKey,shiftKey:entry.shiftKey,metaKey:entry.metaKey});event.__keyCode=keyCodeForEntry(entry);document.dispatchEvent(event);}
function keyCodeForEntry(entry)
{var keyCode=entry.keyCode;if(!keyCode){var match=entry.keyIdentifier.match(/^U\+([\dA-Fa-f]+)$/);if(match)
keyCode=parseInt(match[1],16);}
return keyCode||0;}},_dispatchCallback:function(requestId,port,result)
{if(requestId)
port.postMessage({command:"callback",requestId:requestId,result:result});},_initExtensions:function()
{this._registerAutosubscriptionHandler(WebInspector.extensionAPI.Events.ResourceAdded,WebInspector.workspace,WebInspector.Workspace.Events.UISourceCodeAdded,this._notifyResourceAdded);this._registerAutosubscriptionTargetManagerHandler(WebInspector.extensionAPI.Events.NetworkRequestFinished,WebInspector.NetworkManager,WebInspector.NetworkManager.EventTypes.RequestFinished,this._notifyRequestFinished);function onElementsSubscriptionStarted()
{WebInspector.notifications.addEventListener(WebInspector.NotificationService.Events.SelectedNodeChanged,this._notifyElementsSelectionChanged,this);}
function onElementsSubscriptionStopped()
{WebInspector.notifications.removeEventListener(WebInspector.NotificationService.Events.SelectedNodeChanged,this._notifyElementsSelectionChanged,this);}
this._registerSubscriptionHandler(WebInspector.extensionAPI.Events.PanelObjectSelected+"elements",onElementsSubscriptionStarted.bind(this),onElementsSubscriptionStopped.bind(this));this._registerResourceContentCommittedHandler(this._notifyUISourceCodeContentCommitted);WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.InspectedURLChanged,this._inspectedURLChanged,this);InspectorExtensionRegistry.getExtensionsAsync();},_notifyResourceAdded:function(event)
{var uiSourceCode=(event.data);this._postNotification(WebInspector.extensionAPI.Events.ResourceAdded,this._makeResource(uiSourceCode));},_notifyUISourceCodeContentCommitted:function(event)
{var uiSourceCode=(event.data.uiSourceCode);var content=(event.data.content);this._postNotification(WebInspector.extensionAPI.Events.ResourceContentCommitted,this._makeResource(uiSourceCode),content);},_notifyRequestFinished:function(event)
{var request=(event.data);this._postNotification(WebInspector.extensionAPI.Events.NetworkRequestFinished,this._requestId(request),(new WebInspector.HAREntry(request)).build());},_notifyElementsSelectionChanged:function()
{this._postNotification(WebInspector.extensionAPI.Events.PanelObjectSelected+"elements");},_addExtensions:function(event)
{if(WebInspector.extensionServer._overridePlatformExtensionAPIForTest)
window.buildPlatformExtensionAPI=WebInspector.extensionServer._overridePlatformExtensionAPIForTest;var extensionInfos=(event.data);if(this._initializeCommandIssued)
extensionInfos.forEach(this._addExtension,this);else
this._pendingExtensionInfos=extensionInfos;},_setInspectedTabId:function(event)
{this._inspectedTabId=(event.data);},_addExtension:function(extensionInfo)
{const urlOriginRegExp=new RegExp("([^:]+:\/\/[^/]*)\/");var startPage=extensionInfo.startPage;var name=extensionInfo.name;try{var originMatch=urlOriginRegExp.exec(startPage);if(!originMatch){console.error("Skipping extension with invalid URL: "+startPage);return false;}
var extensionOrigin=originMatch[1];if(!this._registeredExtensions[extensionOrigin]){InspectorFrontendHost.setInjectedScriptForOrigin(extensionOrigin,buildExtensionAPIInjectedScript(extensionInfo,this._inspectedTabId));this._registeredExtensions[extensionOrigin]={name:name};}
var iframe=createElement("iframe");iframe.src=startPage;iframe.style.display="none";document.body.appendChild(iframe);}catch(e){console.error("Failed to initialize extension "+startPage+":"+e);return false;}
return true;},_registerExtension:function(origin,port)
{if(!this._registeredExtensions.hasOwnProperty(origin)){if(origin!==window.location.origin)
console.error("Ignoring unauthorized client request from "+origin);return;}
port._extensionOrigin=origin;port.addEventListener("message",this._onmessage.bind(this),false);port.start();},_onWindowMessage:function(event)
{if(event.data==="registerExtension")
this._registerExtension(event.origin,event.ports[0]);},_onmessage:function(event)
{var message=event.data;var result;if(message.command in this._handlers)
result=this._handlers[message.command](message,event.target);else
result=this._status.E_NOTSUPPORTED(message.command);if(result&&message.requestId)
this._dispatchCallback(message.requestId,event.target,result);},_registerHandler:function(command,callback)
{console.assert(command);this._handlers[command]=callback;},_registerSubscriptionHandler:function(eventTopic,onSubscribeFirst,onUnsubscribeLast)
{this._subscriptionStartHandlers[eventTopic]=onSubscribeFirst;this._subscriptionStopHandlers[eventTopic]=onUnsubscribeLast;},_registerAutosubscriptionHandler:function(eventTopic,eventTarget,frontendEventType,handler)
{this._registerSubscriptionHandler(eventTopic,eventTarget.addEventListener.bind(eventTarget,frontendEventType,handler,this),eventTarget.removeEventListener.bind(eventTarget,frontendEventType,handler,this));},_registerAutosubscriptionTargetManagerHandler:function(eventTopic,modelClass,frontendEventType,handler)
{this._registerSubscriptionHandler(eventTopic,WebInspector.targetManager.addModelListener.bind(WebInspector.targetManager,modelClass,frontendEventType,handler,this),WebInspector.targetManager.removeModelListener.bind(WebInspector.targetManager,modelClass,frontendEventType,handler,this));},_registerResourceContentCommittedHandler:function(handler)
{function addFirstEventListener()
{WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.WorkingCopyCommittedByUser,handler,this);WebInspector.workspace.setHasResourceContentTrackingExtensions(true);}
function removeLastEventListener()
{WebInspector.workspace.setHasResourceContentTrackingExtensions(false);WebInspector.workspace.removeEventListener(WebInspector.Workspace.Events.WorkingCopyCommittedByUser,handler,this);}
this._registerSubscriptionHandler(WebInspector.extensionAPI.Events.ResourceContentCommitted,addFirstEventListener.bind(this),removeLastEventListener.bind(this));},_expandResourcePath:function(extensionPath,resourcePath)
{if(!resourcePath)
return;return extensionPath+this._normalizePath(resourcePath);},_normalizePath:function(path)
{var source=path.split("/");var result=[];for(var i=0;i<source.length;++i){if(source[i]===".")
continue;if(source[i]==="")
continue;if(source[i]==="..")
result.pop();else
result.push(source[i]);}
return"/"+result.join("/");},evaluate:function(expression,exposeCommandLineAPI,returnByValue,options,securityOrigin,callback)
{var contextId;function resolveURLToFrame(url)
{var found;function hasMatchingURL(frame)
{found=(frame.url===url)?frame:null;return found;}
WebInspector.ResourceTreeModel.frames().some(hasMatchingURL);return found;}
if(typeof options==="object"){var frame=options.frameURL?resolveURLToFrame(options.frameURL):WebInspector.targetManager.mainTarget().resourceTreeModel.mainFrame;if(!frame){if(options.frameURL)
console.warn("evaluate: there is no frame with URL "+options.frameURL);else
console.warn("evaluate: the main frame is not yet available");return this._status.E_NOTFOUND(options.frameURL||"<top>");}
var contextSecurityOrigin;if(options.useContentScriptContext)
contextSecurityOrigin=securityOrigin;else if(options.scriptExecutionContext)
contextSecurityOrigin=options.scriptExecutionContext;var context;var executionContexts=frame.target().runtimeModel.executionContexts();if(contextSecurityOrigin){for(var i=0;i<executionContexts.length;++i){var executionContext=executionContexts[i];if(executionContext.frameId===frame.id&&executionContext.origin===contextSecurityOrigin&&!executionContext.isMainWorldContext)
context=executionContext;}
if(!context){console.warn("The JavaScript context "+contextSecurityOrigin+" was not found in the frame "+frame.url)
return this._status.E_NOTFOUND(contextSecurityOrigin)}}else{for(var i=0;i<executionContexts.length;++i){var executionContext=executionContexts[i];if(executionContext.frameId===frame.id&&executionContext.isMainWorldContext)
context=executionContext;}
if(!context)
return this._status.E_FAILED(frame.url+" has no execution context");}
contextId=context.id;}
var target=target?target:WebInspector.targetManager.mainTarget();if(!target)
return;target.runtimeAgent().evaluate(expression,"extension",exposeCommandLineAPI,true,contextId,returnByValue,false,onEvalute);function onEvalute(error,result,wasThrown)
{if(error){callback(error,null,wasThrown);return;}
callback(error,target.runtimeModel.createRemoteObject(result),wasThrown);}},__proto__:WebInspector.Object.prototype}
WebInspector.ExtensionServerPanelDescriptor=function(name,title,panel)
{this._name=name;this._title=title;this._panel=panel;}
WebInspector.ExtensionServerPanelDescriptor.prototype={name:function()
{return this._name;},title:function()
{return this._title;},panel:function()
{return Promise.resolve(this._panel);}}
WebInspector.ExtensionStatus=function()
{function makeStatus(code,description)
{var details=Array.prototype.slice.call(arguments,2);var status={code:code,description:description,details:details};if(code!=="OK"){status.isError=true;console.log("Extension server error: "+String.vsprintf(description,details));}
return status;}
this.OK=makeStatus.bind(null,"OK","OK");this.E_EXISTS=makeStatus.bind(null,"E_EXISTS","Object already exists: %s");this.E_BADARG=makeStatus.bind(null,"E_BADARG","Invalid argument %s: %s");this.E_BADARGTYPE=makeStatus.bind(null,"E_BADARGTYPE","Invalid type for argument %s: got %s, expected %s");this.E_NOTFOUND=makeStatus.bind(null,"E_NOTFOUND","Object not found: %s");this.E_NOTSUPPORTED=makeStatus.bind(null,"E_NOTSUPPORTED","Object does not support requested operation: %s");this.E_PROTOCOLERROR=makeStatus.bind(null,"E_PROTOCOLERROR","Inspector protocol error: %s");this.E_FAILED=makeStatus.bind(null,"E_FAILED","Operation failed: %s");}
WebInspector.ExtensionStatus.Record;WebInspector.extensionAPI={};defineCommonExtensionSymbols(WebInspector.extensionAPI);WebInspector.extensionServer;;WebInspector.ExtensionPanel=function(server,panelName,id,pageURL)
{WebInspector.Panel.call(this,panelName);this._server=server;this._id=id;this.setHideOnDetach();this._panelToolbar=new WebInspector.Toolbar("hidden",this.element);this._searchableView=new WebInspector.SearchableView(this);this._searchableView.show(this.element);var extensionView=new WebInspector.ExtensionView(server,this._id,pageURL,"extension");extensionView.show(this._searchableView.element);this.setDefaultFocusedElement(extensionView.defaultFocusedElement());}
WebInspector.ExtensionPanel.prototype={defaultFocusedElement:function()
{return WebInspector.Widget.prototype.defaultFocusedElement.call(this);},addToolbarItem:function(item)
{this._panelToolbar.element.classList.remove("hidden");this._panelToolbar.appendToolbarItem(item);},searchCanceled:function()
{this._server.notifySearchAction(this._id,WebInspector.extensionAPI.panels.SearchAction.CancelSearch);this._searchableView.updateSearchMatchesCount(0);},searchableView:function()
{return this._searchableView;},performSearch:function(searchConfig,shouldJump,jumpBackwards)
{var query=searchConfig.query;this._server.notifySearchAction(this._id,WebInspector.extensionAPI.panels.SearchAction.PerformSearch,query);},jumpToNextSearchResult:function()
{this._server.notifySearchAction(this._id,WebInspector.extensionAPI.panels.SearchAction.NextSearchResult);},jumpToPreviousSearchResult:function()
{this._server.notifySearchAction(this._id,WebInspector.extensionAPI.panels.SearchAction.PreviousSearchResult);},supportsCaseSensitiveSearch:function()
{return false;},supportsRegexSearch:function()
{return false;},__proto__:WebInspector.Panel.prototype}
WebInspector.ExtensionButton=function(server,id,iconURL,tooltip,disabled)
{this._id=id;this._toolbarButton=new WebInspector.ToolbarButton("","");this._toolbarButton.addEventListener("click",server.notifyButtonClicked.bind(server,this._id));this.update(iconURL,tooltip,disabled);}
WebInspector.ExtensionButton.prototype={update:function(iconURL,tooltip,disabled)
{if(typeof iconURL==="string")
this._toolbarButton.setBackgroundImage(iconURL);if(typeof tooltip==="string")
this._toolbarButton.setTitle(tooltip);if(typeof disabled==="boolean")
this._toolbarButton.setEnabled(!disabled);},toolbarButton:function()
{return this._toolbarButton;}}
WebInspector.ExtensionSidebarPane=function(server,panelName,title,id)
{WebInspector.SidebarPane.call(this,title);this._panelName=panelName;this._server=server;this._id=id;}
WebInspector.ExtensionSidebarPane.prototype={id:function()
{return this._id;},panelName:function()
{return this._panelName;},setObject:function(object,title,callback)
{this._createObjectPropertiesView();this._setObject(WebInspector.RemoteObject.fromLocalObject(object),title,callback);},setExpression:function(expression,title,evaluateOptions,securityOrigin,callback)
{this._createObjectPropertiesView();this._server.evaluate(expression,true,false,evaluateOptions,securityOrigin,this._onEvaluate.bind(this,title,callback));},setPage:function(url)
{if(this._objectPropertiesView){this._objectPropertiesView.detach();delete this._objectPropertiesView;}
if(this._extensionView)
this._extensionView.detach(true);this._extensionView=new WebInspector.ExtensionView(this._server,this._id,url,"extension fill");this._extensionView.show(this.element);if(!this.element.style.height)
this.setHeight("150px");},setHeight:function(height)
{this.element.style.height=height;},_onEvaluate:function(title,callback,error,result,wasThrown)
{if(error)
callback(error.toString());else
this._setObject((result),title,callback);},_createObjectPropertiesView:function()
{if(this._objectPropertiesView)
return;if(this._extensionView){this._extensionView.detach(true);delete this._extensionView;}
this._objectPropertiesView=new WebInspector.ExtensionNotifierView(this._server,this._id);this._objectPropertiesView.show(this.element);},_setObject:function(object,title,callback)
{if(!this._objectPropertiesView){callback("operation cancelled");return;}
this._objectPropertiesView.element.removeChildren();var section=new WebInspector.ObjectPropertiesSection(object,title);if(!title)
section.titleLessMode();section.expand();section.editable=false;this._objectPropertiesView.element.appendChild(section.element);callback();},__proto__:WebInspector.SidebarPane.prototype};WebInspector.ExtensionView=function(server,id,src,className)
{WebInspector.Widget.call(this);this.setHideOnDetach();this.element.className="vbox flex-auto";this._server=server;this._id=id;this._iframe=createElement("iframe");this._iframe.addEventListener("load",this._onLoad.bind(this),false);this._iframe.src=src;this._iframe.className=className;this.setDefaultFocusedElement(this._iframe);this.element.appendChild(this._iframe);}
WebInspector.ExtensionView.prototype={wasShown:function()
{if(typeof this._frameIndex==="number")
this._server.notifyViewShown(this._id,this._frameIndex);},willHide:function()
{if(typeof this._frameIndex==="number")
this._server.notifyViewHidden(this._id);},_onLoad:function()
{var frames=(window.frames);this._frameIndex=Array.prototype.indexOf.call(frames,this._iframe.contentWindow);if(this.isShowing())
this._server.notifyViewShown(this._id,this._frameIndex);},__proto__:WebInspector.Widget.prototype}
WebInspector.ExtensionNotifierView=function(server,id)
{WebInspector.VBox.call(this);this._server=server;this._id=id;}
WebInspector.ExtensionNotifierView.prototype={wasShown:function()
{this._server.notifyViewShown(this._id);},willHide:function()
{this._server.notifyViewHidden(this._id);},__proto__:WebInspector.VBox.prototype};WebInspector.OverridesSupport=function()
{this._touchEmulationSuspended=false;this._emulateMobileEnabled=false;this._userAgent="";this._pageResizer=null;this._deviceScale=1;this._fixedDeviceScale=false;this._initialized=false;this._deviceMetricsThrottler=new WebInspector.Throttler(0);this.settings={};this.settings._emulationEnabled=WebInspector.settings.createSetting("emulationEnabled",false);if(Runtime.experiments.isEnabled("deviceMode"))
this.settings._emulationEnabled.set(false);this.settings.userAgent=WebInspector.settings.createSetting("userAgent","");this.settings.emulateResolution=WebInspector.settings.createSetting("emulateResolution",true);this.settings.deviceWidth=WebInspector.settings.createSetting("deviceWidth",360);this.settings.deviceHeight=WebInspector.settings.createSetting("deviceHeight",640);this.settings.deviceScaleFactor=WebInspector.settings.createSetting("deviceScaleFactor",0);this.settings.deviceFitWindow=WebInspector.settings.createSetting("deviceFitWindow",true);this.settings.emulateMobile=WebInspector.settings.createSetting("emulateMobile",false);this.settings.emulateTouch=WebInspector.settings.createSetting("emulateTouch",false);this.settings.geolocationOverride=WebInspector.settings.createSetting("geolocationOverride","");this.settings.deviceOrientationOverride=WebInspector.settings.createSetting("deviceOrientationOverride","");this.settings.screenOrientationOverride=WebInspector.settings.createSetting("screenOrientationOverride","");this.settings.javaScriptDisabled=WebInspector.moduleSetting("javaScriptDisabled");}
WebInspector.OverridesSupport.Events={OverridesWarningUpdated:"OverridesWarningUpdated",EmulationStateChanged:"EmulationStateChanged"}
WebInspector.OverridesSupport.MaxDeviceSize=9999;WebInspector.OverridesSupport.PageResizer=function()
{};WebInspector.OverridesSupport.PageResizer.Events={AvailableSizeChanged:"AvailableSizeChanged",ResizeRequested:"ResizeRequested",FixedScaleRequested:"FixedScaleRequested",InsetsChanged:"InsetsChanged"};WebInspector.OverridesSupport.PageResizer.prototype={update:function(dipWidth,dipHeight,scale,pageWidth,pageHeight){}};WebInspector.OverridesSupport.Device={};WebInspector.OverridesSupport.GeolocationPosition=function(latitude,longitude,error)
{this.latitude=latitude;this.longitude=longitude;this.error=error;}
WebInspector.OverridesSupport.GeolocationPosition.prototype={toSetting:function()
{return(typeof this.latitude==="number"&&typeof this.longitude==="number"&&typeof this.error==="string")?this.latitude+"@"+this.longitude+":"+this.error:"";}}
WebInspector.OverridesSupport.GeolocationPosition.parseSetting=function(value)
{if(value){var splitError=value.split(":");if(splitError.length===2){var splitPosition=splitError[0].split("@");if(splitPosition.length===2)
return new WebInspector.OverridesSupport.GeolocationPosition(parseFloat(splitPosition[0]),parseFloat(splitPosition[1]),splitError[1]);}}
return new WebInspector.OverridesSupport.GeolocationPosition(0,0,"");}
WebInspector.OverridesSupport.GeolocationPosition.parseUserInput=function(latitudeString,longitudeString,errorStatus)
{function isUserInputValid(value)
{if(!value)
return true;return/^[-]?[0-9]*[.]?[0-9]*$/.test(value);}
if(!latitudeString&&!longitudeString)
return null;var isLatitudeValid=isUserInputValid(latitudeString);var isLongitudeValid=isUserInputValid(longitudeString);if(!isLatitudeValid&&!isLongitudeValid)
return null;var latitude=isLatitudeValid?parseFloat(latitudeString):-1;var longitude=isLongitudeValid?parseFloat(longitudeString):-1;return new WebInspector.OverridesSupport.GeolocationPosition(latitude,longitude,errorStatus?"PositionUnavailable":"");}
WebInspector.OverridesSupport.DeviceOrientation=function(alpha,beta,gamma)
{this.alpha=alpha;this.beta=beta;this.gamma=gamma;}
WebInspector.OverridesSupport.DeviceOrientation.prototype={toSetting:function()
{return JSON.stringify(this);}}
WebInspector.OverridesSupport.DeviceOrientation.parseSetting=function(value)
{if(value){var jsonObject=JSON.parse(value);return new WebInspector.OverridesSupport.DeviceOrientation(jsonObject.alpha,jsonObject.beta,jsonObject.gamma);}
return new WebInspector.OverridesSupport.DeviceOrientation(0,0,0);}
WebInspector.OverridesSupport.DeviceOrientation.parseUserInput=function(alphaString,betaString,gammaString)
{function isUserInputValid(value)
{if(!value)
return true;return/^[-]?[0-9]*[.]?[0-9]*$/.test(value);}
if(!alphaString&&!betaString&&!gammaString)
return null;var isAlphaValid=isUserInputValid(alphaString);var isBetaValid=isUserInputValid(betaString);var isGammaValid=isUserInputValid(gammaString);if(!isAlphaValid&&!isBetaValid&&!isGammaValid)
return null;var alpha=isAlphaValid?parseFloat(alphaString):-1;var beta=isBetaValid?parseFloat(betaString):-1;var gamma=isGammaValid?parseFloat(gammaString):-1;return new WebInspector.OverridesSupport.DeviceOrientation(alpha,beta,gamma);}
WebInspector.OverridesSupport.deviceSizeValidator=function(value)
{if(!value||(/^[\d]+$/.test(value)&&value>=0&&value<=WebInspector.OverridesSupport.MaxDeviceSize))
return"";return WebInspector.UIString("Value must be non-negative integer");}
WebInspector.OverridesSupport.deviceScaleFactorValidator=function(value)
{if(!value||(/^[\d]+(\.\d+)?|\.\d+$/.test(value)&&value>=0&&value<=10))
return"";return WebInspector.UIString("Value must be non-negative float");}
WebInspector.OverridesSupport._touchEventsScriptIdSymbol=Symbol("OverridesSupport.touchEventsScriptIdSymbol");WebInspector.OverridesSupport.prototype={canEmulate:function()
{return!!this._target&&this._targetCanEmulate;},emulationEnabled:function()
{return this.canEmulate()&&this.settings._emulationEnabled.get();},setEmulationEnabled:function(enabled)
{if(this.canEmulate()){this.settings._emulationEnabled.set(enabled);this.dispatchEventToListeners(WebInspector.OverridesSupport.Events.EmulationStateChanged);if(enabled&&this.settings.emulateResolution.get())
this._target.emulationAgent().resetScrollAndPageScaleFactor();}},init:function(target,callback)
{if(target.isPage())
target.emulationAgent().canEmulate(canEmulateCallback.bind(this));else
canEmulateCallback.call(this,null,false);function canEmulateCallback(error,canEmulate)
{this._target=target;this._targetCanEmulate=!error&&canEmulate;this._initialized=true;if(this.canEmulate()){target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._onMainFrameNavigated,this);if(!Runtime.experiments.isEnabled("deviceMode")){var domModel=WebInspector.DOMModel.fromTarget(this._target);if(domModel)
domModel.addEventListener(WebInspector.DOMModel.Events.InspectModeWillBeToggled,this._inspectModeWillBeToggled,this);}
this._applyInitialOverrides();}
this.dispatchEventToListeners(WebInspector.OverridesSupport.Events.EmulationStateChanged);callback();}},setPageResizer:function(pageResizer,availableSize,insets)
{if(pageResizer===this._pageResizer)
return;if(this._pageResizer){this._pageResizer.removeEventListener(WebInspector.OverridesSupport.PageResizer.Events.AvailableSizeChanged,this._onPageResizerAvailableSizeChanged,this);this._pageResizer.removeEventListener(WebInspector.OverridesSupport.PageResizer.Events.ResizeRequested,this._onPageResizerResizeRequested,this);this._pageResizer.removeEventListener(WebInspector.OverridesSupport.PageResizer.Events.FixedScaleRequested,this._onPageResizerFixedScaleRequested,this);this._pageResizer.removeEventListener(WebInspector.OverridesSupport.PageResizer.Events.InsetsChanged,this._onPageResizerInsetsChanged,this);}
this._pageResizer=pageResizer;this._pageResizerAvailableSize=availableSize;this._pageResizerInsets=insets;if(this._pageResizer){this._pageResizer.addEventListener(WebInspector.OverridesSupport.PageResizer.Events.AvailableSizeChanged,this._onPageResizerAvailableSizeChanged,this);this._pageResizer.addEventListener(WebInspector.OverridesSupport.PageResizer.Events.ResizeRequested,this._onPageResizerResizeRequested,this);this._pageResizer.addEventListener(WebInspector.OverridesSupport.PageResizer.Events.FixedScaleRequested,this._onPageResizerFixedScaleRequested,this);this._pageResizer.addEventListener(WebInspector.OverridesSupport.PageResizer.Events.InsetsChanged,this._onPageResizerInsetsChanged,this);}
this._deviceMetricsChanged(false);},emulateDevice:function(device)
{this._deviceMetricsChangedListenerMuted=true;this._userAgentChangedListenerMuted=true;this.settings.userAgent.set(device.userAgent);this.settings.emulateResolution.set(true);this.settings.deviceWidth.set(device.width);this.settings.deviceHeight.set(device.height);this.settings.deviceScaleFactor.set(device.deviceScaleFactor);this.settings.emulateTouch.set(device.touch);this.settings.emulateMobile.set(device.mobile);delete this._deviceMetricsChangedListenerMuted;delete this._userAgentChangedListenerMuted;if(this._initialized){this._deviceMetricsChanged(true);this._userAgentChanged();}},reset:function()
{this._deviceMetricsChangedListenerMuted=true;this._userAgentChangedListenerMuted=true;this.settings.userAgent.set("");this.settings.emulateResolution.set(false);this.settings.deviceScaleFactor.set(0);this.settings.emulateTouch.set(false);this.settings.emulateMobile.set(false);this.settings.screenOrientationOverride.set("");delete this._deviceMetricsChangedListenerMuted;delete this._userAgentChangedListenerMuted;if(this._initialized){this._deviceMetricsChanged(false);this._userAgentChanged();}},isEmulatingDevice:function(device)
{var sameResolution=this.settings.emulateResolution.get()?(this.settings.deviceWidth.get()===device.width&&this.settings.deviceHeight.get()===device.height&&this.settings.deviceScaleFactor.get()===device.deviceScaleFactor):(!device.width&&!device.height&&!device.deviceScaleFactor);return this.settings.userAgent.get()===device.userAgent&&this.settings.emulateTouch.get()===device.touch&&this.settings.emulateMobile.get()===device.mobile&&sameResolution;},_inspectModeWillBeToggled:function(event)
{var inspectModeEnabled=(event.data);this._touchEmulationSuspended=inspectModeEnabled;this._emulateTouchEventsChanged();},_applyInitialOverrides:function()
{this.settings._emulationEnabled.addChangeListener(this._userAgentChanged,this);this.settings.userAgent.addChangeListener(this._userAgentChanged,this);this.settings._emulationEnabled.addChangeListener(this._deviceMetricsChanged.bind(this,false));this.settings.emulateResolution.addChangeListener(this._deviceMetricsChanged.bind(this,false));this.settings.deviceWidth.addChangeListener(this._deviceMetricsChanged.bind(this,false));this.settings.deviceHeight.addChangeListener(this._deviceMetricsChanged.bind(this,false));this.settings.deviceScaleFactor.addChangeListener(this._deviceMetricsChanged.bind(this,false));this.settings.emulateMobile.addChangeListener(this._deviceMetricsChanged.bind(this,false));this.settings.deviceFitWindow.addChangeListener(this._deviceMetricsChanged.bind(this,false));this.settings.geolocationOverride.addChangeListener(this._geolocationPositionChanged,this);this.settings.deviceOrientationOverride.addChangeListener(this._deviceOrientationChanged,this);this.settings._emulationEnabled.addChangeListener(this._screenOrientationChanged,this);this.settings.screenOrientationOverride.addChangeListener(this._screenOrientationChanged,this);this.settings._emulationEnabled.addChangeListener(this._emulateTouchEventsChanged,this);this.settings.emulateTouch.addChangeListener(this._emulateTouchEventsChanged,this);this.settings.javaScriptDisabled.addChangeListener(this._javaScriptDisabledChanged,this);this._javaScriptDisabledChanged();this.settings._emulationEnabled.addChangeListener(this._showRulersChanged,this);WebInspector.moduleSetting("showMetricsRulers").addChangeListener(this._showRulersChanged,this);this._showRulersChanged();if(this.emulationEnabled()){if(this.settings.screenOrientationOverride.get())
this._screenOrientationChanged();if(this.settings.emulateTouch.get())
this._emulateTouchEventsChanged();this._deviceMetricsChanged(true);this._userAgentChanged();}},_userAgentChanged:function()
{if(this._userAgentChangedListenerMuted)
return;var userAgent=this.emulationEnabled()?this.settings.userAgent.get():"";WebInspector.multitargetNetworkManager.setUserAgentOverride(userAgent);if(this._userAgent!==userAgent)
this._updateUserAgentWarningMessage(WebInspector.UIString("You might need to reload the page for proper user agent spoofing and viewport rendering."));this._userAgent=userAgent;},_onPageResizerAvailableSizeChanged:function(event)
{this._pageResizerAvailableSize=(event.data.size);this._pageResizerInsets=(event.data.insets);this._deviceMetricsChanged(false);},_onPageResizerInsetsChanged:function(event)
{var insets=(event.data);if(!insets.isEqual(this._pageResizerInsets)){this._pageResizerInsets=insets;this._deviceMetricsChanged(false);}},_onPageResizerResizeRequested:function(event)
{if(typeof event.data.width!=="undefined"){var width=(event.data.width);if(width!==this.settings.deviceWidth.get())
this.settings.deviceWidth.set(width);}
if(typeof event.data.height!=="undefined"){var height=(event.data.height);if(height!==this.settings.deviceHeight.get())
this.settings.deviceHeight.set(height);}},_onPageResizerFixedScaleRequested:function(event)
{this._fixedDeviceScale=(event.data);this._deviceMetricsChanged(false);},_deviceMetricsChanged:function(resetScrollAndPageScale)
{if(!this._initialized)
return;this._showRulersChanged();if(this._deviceMetricsChangedListenerMuted)
return;if(!this.emulationEnabled()){this._deviceMetricsThrottler.schedule(clearDeviceMetricsOverride.bind(this));if(this._pageResizer)
this._pageResizer.update(0,0,1,0,0);return;}
var dipWidth=this.settings.emulateResolution.get()?this.settings.deviceWidth.get():0;var dipHeight=this.settings.emulateResolution.get()?this.settings.deviceHeight.get():0;var overrideWidth=dipWidth;var overrideHeight=dipHeight;var screenWidth=dipWidth;var screenHeight=dipHeight;var positionX=0;var positionY=0;var scale=1;if(this._pageResizer){var available=this._pageResizerAvailableSize;var insets=this._pageResizerInsets;if(this.settings.deviceFitWindow.get()){if(this._fixedDeviceScale){scale=this._deviceScale;}else{scale=1;while(available.width<(dipWidth+insets.left+insets.right)*scale||available.height<(dipHeight+insets.top+insets.bottom)*scale)
scale*=0.8;}}
this._pageResizer.update(Math.min(dipWidth*scale,available.width-insets.left*scale),Math.min(dipHeight*scale,available.height-insets.top*scale),scale,(dipWidth+insets.left+insets.right)*scale,(dipHeight+insets.top+insets.bottom)*scale);if(scale===1&&available.width>=dipWidth&&available.height>=dipHeight){overrideWidth=0;overrideHeight=0;}
if(dipWidth===0&&dipHeight!==0)
overrideWidth=Math.round(available.width/scale);if(dipHeight===0&&dipWidth!==0)
overrideHeight=Math.round(available.height/scale);screenWidth=dipWidth+insets.left+insets.right;screenHeight=dipHeight+insets.top+insets.bottom;positionX=insets.left;positionY=insets.top;}
this._deviceScale=scale;this._deviceMetricsThrottler.schedule(setDeviceMetricsOverride.bind(this));function setDeviceMetricsOverride()
{var setDevicePromise=this._target.emulationAgent().setDeviceMetricsOverride(overrideWidth,overrideHeight,this.settings.emulateResolution.get()?this.settings.deviceScaleFactor.get():0,this.settings.emulateMobile.get(),this._pageResizer?false:this.settings.deviceFitWindow.get(),scale,0,0,screenWidth,screenHeight,positionX,positionY,apiCallback.bind(this))
var allPromises=[setDevicePromise];if(resetScrollAndPageScale)
allPromises.push(this._target.emulationAgent().resetScrollAndPageScaleFactor());return Promise.all(allPromises);}
function clearDeviceMetricsOverride()
{return this._target.emulationAgent().clearDeviceMetricsOverride(apiCallback.bind(this))}
function apiCallback(error)
{if(error){this._updateDeviceMetricsWarningMessage(WebInspector.UIString("Screen emulation is not available on this page."));this._deviceMetricsOverrideAppliedForTest();return;}
var mobileEnabled=this.emulationEnabled()&&this.settings.emulateMobile.get();if(this._emulateMobileEnabled!==mobileEnabled)
this._updateDeviceMetricsWarningMessage(WebInspector.UIString("You might need to reload the page for proper user agent spoofing and viewport rendering."));this._emulateMobileEnabled=mobileEnabled;this._deviceMetricsOverrideAppliedForTest();}},_deviceMetricsOverrideAppliedForTest:function()
{},setGeolocationOverrideEnabled:function(enabled)
{this._overrideGeolocation=enabled;this._geolocationPositionChanged();},_geolocationPositionChanged:function()
{if(!this._overrideGeolocation){this._target.emulationAgent().clearGeolocationOverride();return;}
var geolocation=WebInspector.OverridesSupport.GeolocationPosition.parseSetting(this.settings.geolocationOverride.get());if(geolocation.error)
this._target.emulationAgent().setGeolocationOverride();else
this._target.emulationAgent().setGeolocationOverride(geolocation.latitude,geolocation.longitude,150);},setDeviceOrientationOverrideEnabled:function(enabled)
{this._overrideDeviceOrientation=enabled;this._deviceOrientationChanged();},_deviceOrientationChanged:function()
{if(!this._overrideDeviceOrientation){this._target.deviceOrientationAgent().clearDeviceOrientationOverride();return;}
var deviceOrientation=WebInspector.OverridesSupport.DeviceOrientation.parseSetting(this.settings.deviceOrientationOverride.get());this._target.deviceOrientationAgent().setDeviceOrientationOverride(deviceOrientation.alpha,deviceOrientation.beta,deviceOrientation.gamma);},_screenOrientationChanged:function()
{if(!this.emulationEnabled()||!this.settings.screenOrientationOverride.get()){this._target.screenOrientationAgent().clearScreenOrientationOverride();return;}
var screenOrientation=this.settings.screenOrientationOverride.get();this._target.screenOrientationAgent().setScreenOrientationOverride(screenOrientation==="landscapePrimary"?90:0,screenOrientation);},_emulateTouchEventsChanged:function()
{var emulationEnabled=this.emulationEnabled()&&this.settings.emulateTouch.get()&&!this._touchEmulationSuspended;var configuration=this.settings.emulateMobile.get()?"mobile":"desktop";var target=this._target;const injectedFunction=function(){const touchEvents=["ontouchstart","ontouchend","ontouchmove","ontouchcancel"];var recepients=[window.__proto__,document.__proto__];for(var i=0;i<touchEvents.length;++i){for(var j=0;j<recepients.length;++j){if(!(touchEvents[i]in recepients[j]))
Object.defineProperty(recepients[j],touchEvents[i],{value:null,writable:true,configurable:true,enumerable:true});}}};var symbol=WebInspector.OverridesSupport._touchEventsScriptIdSymbol;if(typeof target[symbol]!=="undefined"){target.pageAgent().removeScriptToEvaluateOnLoad(target[symbol]);delete target[symbol];}
if(emulationEnabled)
target.pageAgent().addScriptToEvaluateOnLoad("("+injectedFunction.toString()+")()",scriptAddedCallback);function scriptAddedCallback(error,scriptId)
{if(error)
delete target[symbol];else
target[symbol]=scriptId;}
target.emulationAgent().setTouchEmulationEnabled(emulationEnabled,configuration);},_javaScriptDisabledChanged:function()
{this._target.emulationAgent().setScriptExecutionDisabled(this.settings.javaScriptDisabled.get());},_pageResizerActive:function()
{return this._pageResizer&&this.emulationEnabled();},_showRulersChanged:function()
{var showRulersValue=WebInspector.moduleSetting("showMetricsRulers").get();for(var target of WebInspector.targetManager.targets(WebInspector.Target.Type.Page)){var domModel=WebInspector.DOMModel.fromTarget(target);if(domModel)
domModel.setHighlightSettings(showRulersValue&&!this._pageResizerActive(),showRulersValue);}},_onMainFrameNavigated:function()
{if(!Runtime.experiments.isEnabled("deviceMode"))
this._deviceMetricsChanged(false);this._updateUserAgentWarningMessage("");this._updateDeviceMetricsWarningMessage("");},_dispatchWarningChanged:function()
{this.dispatchEventToListeners(WebInspector.OverridesSupport.Events.OverridesWarningUpdated);},_updateDeviceMetricsWarningMessage:function(warningMessage)
{this._deviceMetricsWarningMessage=warningMessage;this._dispatchWarningChanged();},_updateUserAgentWarningMessage:function(warningMessage)
{this._userAgentWarningMessage=warningMessage;this._dispatchWarningChanged();},warningMessage:function()
{return this._deviceMetricsWarningMessage||this._userAgentWarningMessage||"";},clearWarningMessage:function()
{this._deviceMetricsWarningMessage="";this._userAgentWarningMessage="";this._dispatchWarningChanged();},swapDimensions:function()
{var width=WebInspector.overridesSupport.settings.deviceWidth.get();var height=WebInspector.overridesSupport.settings.deviceHeight.get();WebInspector.overridesSupport.settings.deviceWidth.set(height);WebInspector.overridesSupport.settings.deviceHeight.set(width);},__proto__:WebInspector.Object.prototype}
WebInspector.overridesSupport;;WebInspector.EmulatedDevice=function()
{this.title="";this.type=WebInspector.EmulatedDevice.Type.Unknown;this.vertical={width:0,height:0,outlineInsets:null,outlineImage:null};this.horizontal={width:0,height:0,outlineInsets:null,outlineImage:null};this.deviceScaleFactor=1;this.capabilities=[WebInspector.EmulatedDevice.Capability.Touch,WebInspector.EmulatedDevice.Capability.Mobile];this.userAgent="";this.modes=[];this._show=WebInspector.EmulatedDevice._Show.Default;this._showByDefault=true;this._extension=null;}
WebInspector.EmulatedDevice.Mode;WebInspector.EmulatedDevice.Orientation;WebInspector.EmulatedDevice.Horizontal="horizontal";WebInspector.EmulatedDevice.Vertical="vertical";WebInspector.EmulatedDevice.Type={Phone:"phone",Tablet:"tablet",Notebook:"notebook",Desktop:"desktop",Unknown:"unknown"}
WebInspector.EmulatedDevice.Capability={Touch:"touch",Mobile:"mobile"}
WebInspector.EmulatedDevice._Show={Always:"Always",Default:"Default",Never:"Never"}
WebInspector.EmulatedDevice.fromJSONV1=function(json)
{try{function parseValue(object,key,type,defaultValue)
{if(typeof object!=="object"||object===null||!object.hasOwnProperty(key)){if(typeof defaultValue!=="undefined")
return defaultValue;throw new Error("Emulated device is missing required property '"+key+"'");}
var value=object[key];if(typeof value!==type||value===null)
throw new Error("Emulated device property '"+key+"' has wrong type '"+typeof value+"'");return value;}
function parseIntValue(object,key)
{var value=(parseValue(object,key,"number"));if(value!==Math.abs(value))
throw new Error("Emulated device value '"+key+"' must be integer");return value;}
function parseInsets(json)
{return new Insets(parseIntValue(json,"left"),parseIntValue(json,"top"),parseIntValue(json,"right"),parseIntValue(json,"bottom"));}
function parseOrientation(json)
{var result={};result.width=parseIntValue(json,"width");if(result.width<0||result.width>WebInspector.OverridesSupport.MaxDeviceSize)
throw new Error("Emulated device has wrong width: "+result.width);result.height=parseIntValue(json,"height");if(result.height<0||result.height>WebInspector.OverridesSupport.MaxDeviceSize)
throw new Error("Emulated device has wrong height: "+result.height);var outlineInsets=parseValue(json["outline"],"insets","object",null);if(outlineInsets){result.outlineInsets=parseInsets(outlineInsets);if(result.outlineInsets.left<0||result.outlineInsets.top<0)
throw new Error("Emulated device has wrong outline insets");result.outlineImage=(parseValue(json["outline"],"image","string"));}
return(result);}
var result=new WebInspector.EmulatedDevice();result.title=(parseValue(json,"title","string"));result.type=(parseValue(json,"type","string"));result.userAgent=(parseValue(json,"user-agent","string"));var capabilities=parseValue(json,"capabilities","object",[]);if(!Array.isArray(capabilities))
throw new Error("Emulated device capabilities must be an array");result.capabilities=[];for(var i=0;i<capabilities.length;++i){if(typeof capabilities[i]!=="string")
throw new Error("Emulated device capability must be a string");result.capabilities.push(capabilities[i]);}
result.deviceScaleFactor=(parseValue(json["screen"],"device-pixel-ratio","number"));if(result.deviceScaleFactor<0||result.deviceScaleFactor>100)
throw new Error("Emulated device has wrong deviceScaleFactor: "+result.deviceScaleFactor);result.vertical=parseOrientation(parseValue(json["screen"],"vertical","object"));result.horizontal=parseOrientation(parseValue(json["screen"],"horizontal","object"));var modes=parseValue(json,"modes","object",[]);if(!Array.isArray(modes))
throw new Error("Emulated device modes must be an array");result.modes=[];for(var i=0;i<modes.length;++i){var mode={};mode.title=(parseValue(modes[i],"title","string"));mode.orientation=(parseValue(modes[i],"orientation","string"));if(mode.orientation!==WebInspector.EmulatedDevice.Vertical&&mode.orientation!==WebInspector.EmulatedDevice.Horizontal)
throw new Error("Emulated device mode has wrong orientation '"+mode.orientation+"'");var orientation=result.orientationByName(mode.orientation);mode.insets=parseInsets(parseValue(modes[i],"insets","object"));if(mode.insets.top<0||mode.insets.left<0||mode.insets.right<0||mode.insets.bottom<0||mode.insets.top+mode.insets.bottom>orientation.height||mode.insets.left+mode.insets.right>orientation.width){throw new Error("Emulated device mode '"+mode.title+"'has wrong mode insets");}
mode.image=(parseValue(modes[i],"image","string",null));result.modes.push(mode);}
result._showByDefault=(parseValue(json,"show-by-default","boolean",undefined));result._show=(parseValue(json,"show","string",WebInspector.EmulatedDevice._Show.Default));return result;}catch(e){WebInspector.console.error("Failed to update emulated device list. "+String(e));return null;}}
WebInspector.EmulatedDevice.fromOverridesDevice=function(device,title,type)
{var result=new WebInspector.EmulatedDevice();result.title=title;result.type=type||WebInspector.EmulatedDevice.Type.Unknown;result.vertical.width=device.width;result.vertical.height=device.height;result.horizontal.width=device.height;result.horizontal.height=device.width;result.deviceScaleFactor=device.deviceScaleFactor;result.userAgent=device.userAgent;result.capabilities=[];if(device.touch)
result.capabilities.push(WebInspector.EmulatedDevice.Capability.Touch);if(device.mobile)
result.capabilities.push(WebInspector.EmulatedDevice.Capability.Mobile);return result;}
WebInspector.EmulatedDevice.deviceComparator=function(device1,device2)
{var order1=(device1._extension&&device1._extension.descriptor()["order"])||-1;var order2=(device2._extension&&device2._extension.descriptor()["order"])||-1;if(order1>order2)
return 1;if(order2>order1)
return-1;return device1.title<device2.title?-1:(device1.title>device2.title?1:0);}
WebInspector.EmulatedDevice.prototype={extension:function()
{return this._extension;},setExtension:function(extension)
{this._extension=extension;},modesForOrientation:function(orientation)
{var result=[];for(var index=0;index<this.modes.length;index++){if(this.modes[index].orientation===orientation)
result.push(this.modes[index]);}
return result;},_toJSON:function()
{var json={};json["title"]=this.title;json["type"]=this.type;json["user-agent"]=this.userAgent;json["capabilities"]=this.capabilities;json["screen"]={};json["screen"]["device-pixel-ratio"]=this.deviceScaleFactor;json["screen"]["vertical"]=this._orientationToJSON(this.vertical);json["screen"]["horizontal"]=this._orientationToJSON(this.horizontal);json["modes"]=[];for(var i=0;i<this.modes.length;++i){var mode={};mode["title"]=this.modes[i].title;mode["orientation"]=this.modes[i].orientation;mode["insets"]={};mode["insets"]["left"]=this.modes[i].insets.left;mode["insets"]["top"]=this.modes[i].insets.top;mode["insets"]["right"]=this.modes[i].insets.right;mode["insets"]["bottom"]=this.modes[i].insets.bottom;if(this.modes[i].image)
mode["image"]=this.modes[i].image;json["modes"].push(mode);}
json["show-by-default"]=this._showByDefault;json["show"]=this._show;return json;},_orientationToJSON:function(orientation)
{var json={};json["width"]=orientation.width;json["height"]=orientation.height;if(orientation.outlineInsets){json["outline"]={};json["outline"]["insets"]={};json["outline"]["insets"]["left"]=orientation.outlineInsets.left;json["outline"]["insets"]["top"]=orientation.outlineInsets.top;json["outline"]["insets"]["right"]=orientation.outlineInsets.right;json["outline"]["insets"]["bottom"]=orientation.outlineInsets.bottom;json["outline"]["image"]=orientation.outlineImage;}
return json;},modeToOverridesDevice:function(mode)
{var result={};var orientation=this.orientationByName(mode.orientation);result.width=orientation.width-mode.insets.left-mode.insets.right;result.height=orientation.height-mode.insets.top-mode.insets.bottom;result.deviceScaleFactor=this.deviceScaleFactor;result.userAgent=this.userAgent;result.touch=this.touch();result.mobile=this.mobile();return result;},modeImage:function(mode)
{if(!mode.image)
return"";if(!this._extension)
return mode.image;return this._extension.module().substituteURL(mode.image);},orientationByName:function(name)
{return name===WebInspector.EmulatedDevice.Vertical?this.vertical:this.horizontal;},show:function()
{if(this._show===WebInspector.EmulatedDevice._Show.Default)
return this._showByDefault;return this._show===WebInspector.EmulatedDevice._Show.Always;},setShow:function(show)
{this._show=show?WebInspector.EmulatedDevice._Show.Always:WebInspector.EmulatedDevice._Show.Never;},copyShowFrom:function(other)
{this._show=other._show;},touch:function()
{return this.capabilities.indexOf(WebInspector.EmulatedDevice.Capability.Touch)!==-1;},mobile:function()
{return this.capabilities.indexOf(WebInspector.EmulatedDevice.Capability.Mobile)!==-1;}}
WebInspector.EmulatedDevicesList=function()
{WebInspector.Object.call(this);this._standardSetting=WebInspector.settings.createSetting("standardEmulatedDeviceList",[]);this._standard=this._listFromJSONV1(this._standardSetting.get());this._updateStandardDevices();this._customSetting=WebInspector.settings.createSetting("customEmulatedDeviceList",[]);this._custom=this._listFromJSONV1(this._customSetting.get());}
WebInspector.EmulatedDevicesList.Events={CustomDevicesUpdated:"CustomDevicesUpdated",StandardDevicesUpdated:"StandardDevicesUpdated"}
WebInspector.EmulatedDevicesList.prototype={_updateStandardDevices:function()
{var devices=[];var extensions=self.runtime.extensions("emulated-device");for(var i=0;i<extensions.length;++i){var device=WebInspector.EmulatedDevice.fromJSONV1(extensions[i].descriptor()["device"]);device.setExtension(extensions[i]);devices.push(device);}
this._copyShowValues(this._standard,devices);this._standard=devices;this.saveStandardDevices();},_listFromJSONV1:function(jsonArray)
{var result=[];if(!Array.isArray(jsonArray))
return result;for(var i=0;i<jsonArray.length;++i){var device=WebInspector.EmulatedDevice.fromJSONV1(jsonArray[i]);if(device){result.push(device);if(!device.modes.length){device.modes.push({title:"",orientation:WebInspector.EmulatedDevice.Horizontal,insets:new Insets(0,0,0,0),image:null});device.modes.push({title:"",orientation:WebInspector.EmulatedDevice.Vertical,insets:new Insets(0,0,0,0),image:null});}}}
return result;},standard:function()
{return this._standard;},custom:function()
{return this._custom;},revealCustomSetting:function()
{WebInspector.Revealer.reveal(this._customSetting);},addCustomDevice:function(device)
{this._custom.push(device);this.saveCustomDevices();},removeCustomDevice:function(device)
{this._custom.remove(device);this.saveCustomDevices();},saveCustomDevices:function()
{var json=this._custom.map(function(device){return device._toJSON();});this._customSetting.set(json);this.dispatchEventToListeners(WebInspector.EmulatedDevicesList.Events.CustomDevicesUpdated);},saveStandardDevices:function()
{var json=this._standard.map(function(device){return device._toJSON();});this._standardSetting.set(json);this.dispatchEventToListeners(WebInspector.EmulatedDevicesList.Events.StandardDevicesUpdated);},_copyShowValues:function(from,to)
{var deviceById=new Map();for(var i=0;i<from.length;++i)
deviceById.set(from[i].title,from[i]);for(var i=0;i<to.length;++i){var title=to[i].title;if(deviceById.has(title))
to[i].copyShowFrom((deviceById.get(title)));}},__proto__:WebInspector.Object.prototype}
WebInspector.emulatedDevicesList;;WebInspector.DevicesSettingsTab=function()
{WebInspector.VBox.call(this);this.element.classList.add("settings-tab-container");this.element.classList.add("devices-settings-tab");this.registerRequiredCSS("emulation/devicesSettingsTab.css");var header=this.element.createChild("header");header.createChild("h3").createTextChild(WebInspector.UIString("Emulated Devices"));this.containerElement=this.element.createChild("div","help-container-wrapper").createChild("div","settings-tab help-content help-container");var buttonsRow=this.containerElement.createChild("div","devices-button-row");this._addCustomButton=createTextButton(WebInspector.UIString("Add custom device..."),this._addCustomDevice.bind(this));buttonsRow.appendChild(this._addCustomButton);this._list=new WebInspector.ListWidget(this);this._list.registerRequiredCSS("emulation/devicesSettingsTab.css");this._list.element.classList.add("devices-list");this._list.show(this.containerElement);this._muteUpdate=false;WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.CustomDevicesUpdated,this._devicesUpdated,this);WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.StandardDevicesUpdated,this._devicesUpdated,this);this.setDefaultFocusedElement(this._addCustomButton);}
WebInspector.DevicesSettingsTab.prototype={wasShown:function()
{WebInspector.VBox.prototype.wasShown.call(this);this._devicesUpdated();},_devicesUpdated:function()
{if(this._muteUpdate)
return;this._list.clear();var devices=WebInspector.emulatedDevicesList.custom().slice();for(var i=0;i<devices.length;++i)
this._list.appendItem(devices[i],true);this._list.appendSeparator();devices=WebInspector.emulatedDevicesList.standard().slice();devices.sort(WebInspector.EmulatedDevice.deviceComparator);for(var i=0;i<devices.length;++i)
this._list.appendItem(devices[i],false);},_muteAndSaveDeviceList:function(custom)
{this._muteUpdate=true;if(custom)
WebInspector.emulatedDevicesList.saveCustomDevices();else
WebInspector.emulatedDevicesList.saveStandardDevices();this._muteUpdate=false;},_addCustomDevice:function()
{var device=new WebInspector.EmulatedDevice();device.deviceScaleFactor=0;this._list.addNewItem(WebInspector.emulatedDevicesList.custom().length,device);},_toNumericInputValue:function(value)
{return value?String(value):"";},renderItem:function(item,editable)
{var device=(item);var element=createElementWithClass("div","devices-list-item");var checkbox=element.createChild("input","devices-list-checkbox");checkbox.type="checkbox";checkbox.checked=device.show();element.createChild("div","devices-list-title").textContent=device.title;element.addEventListener("click",onItemClicked.bind(this),false);return element;function onItemClicked(event)
{var show=!checkbox.checked;device.setShow(show);this._muteAndSaveDeviceList(editable);checkbox.checked=show;event.consume();}},removeItemRequested:function(item,index)
{WebInspector.emulatedDevicesList.removeCustomDevice((item));},commitEdit:function(item,editor,isNew)
{var device=(item);device.title=editor.control("title").value.trim();device.vertical.width=editor.control("width").value?parseInt(editor.control("width").value,10):0;device.vertical.height=editor.control("height").value?parseInt(editor.control("height").value,10):0;device.horizontal.width=device.vertical.height;device.horizontal.height=device.vertical.width;device.deviceScaleFactor=editor.control("scale").value?parseFloat(editor.control("scale").value):0;device.userAgent=editor.control("user-agent").value;device.modes=[];device.modes.push({title:"",orientation:WebInspector.EmulatedDevice.Vertical,insets:new Insets(0,0,0,0),images:null});device.modes.push({title:"",orientation:WebInspector.EmulatedDevice.Horizontal,insets:new Insets(0,0,0,0),images:null});if(isNew)
WebInspector.emulatedDevicesList.addCustomDevice(device);else
WebInspector.emulatedDevicesList.saveCustomDevices();this._addCustomButton.scrollIntoViewIfNeeded();this._addCustomButton.focus();},beginEdit:function(item)
{var device=(item);var editor=this._createEditor();editor.control("title").value=device.title;editor.control("width").value=this._toNumericInputValue(device.vertical.width);editor.control("height").value=this._toNumericInputValue(device.vertical.height);editor.control("scale").value=this._toNumericInputValue(device.deviceScaleFactor);editor.control("user-agent").value=device.userAgent;return editor;},_createEditor:function()
{if(this._editor)
return this._editor;var editor=new WebInspector.ListWidget.Editor();this._editor=editor;var content=editor.contentElement();var fields=content.createChild("div","devices-edit-fields");fields.appendChild(editor.createInput("title","text",WebInspector.UIString("Device name"),titleValidator));var screen=fields.createChild("div","hbox");var width=editor.createInput("width","text",WebInspector.UIString("Width"),sizeValidator);width.classList.add("device-edit-small");screen.appendChild(width);var height=editor.createInput("height","text",WebInspector.UIString("height"),sizeValidator);height.classList.add("device-edit-small");screen.appendChild(height);screen.appendChild(editor.createInput("scale","text",WebInspector.UIString("Device pixel ratio"),scaleValidator));fields.appendChild(editor.createInput("user-agent","text",WebInspector.UIString("User agent string"),userAgentValidator));return editor;function titleValidator(item,index,input)
{var value=input.value.trim();return value.length>0&&value.length<50;}
function sizeValidator(item,index,input)
{return!WebInspector.OverridesSupport.deviceSizeValidator(input.value);}
function scaleValidator(item,index,input)
{return!WebInspector.OverridesSupport.deviceScaleFactorValidator(input.value);}
function userAgentValidator(item,index,input)
{return true;}},__proto__:WebInspector.VBox.prototype};WebInspector.DeviceModeButtonProvider=function()
{var action=WebInspector.actionRegistry.action("emulation.toggle-device-mode");var button=WebInspector.Toolbar.createActionButton(action);WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.EmulationStateChanged,emulationEnabledChanged);WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.OverridesWarningUpdated,updateWarning);emulationEnabledChanged();updateWarning();function emulationEnabledChanged()
{action.setToggled(WebInspector.overridesSupport.emulationEnabled());}
function updateWarning()
{var message=WebInspector.overridesSupport.warningMessage();action.setTitle(message||WebInspector.UIString("Toggle device mode"));button.element.classList.toggle("warning",!!message);}
this._button=button;}
WebInspector.DeviceModeButtonProvider.prototype={item:function()
{return this._button;}}
WebInspector.ToggleDeviceModeActionDelegate=function()
{}
WebInspector.ToggleDeviceModeActionDelegate.prototype={handleAction:function(context,actionId)
{WebInspector.overridesSupport.setEmulationEnabled(!WebInspector.overridesSupport.emulationEnabled());return true;}};WebInspector.OverridesUI={}
WebInspector.DeviceSelect=function(rotateButton,callback)
{this._callback=callback;this._rotateButton=rotateButton;this.element=createElement("p");this._deviceSelectElement=this.element.createChild("select","device-select");this._deviceSelectElement.addEventListener("change",this._deviceSelected.bind(this),false);var container=this.element.createChild("div","mode-container");container.appendChild(this._rotateButton);this._rotateButton.addEventListener("click",this._rotateButtonClicked.bind(this),false);this._rotateButton.title=WebInspector.UIString("Change orientation");var modeSelectContainer=container.createChild("span","mode-select");this._modeSelectElement=modeSelectContainer.createChild("select");this._modeSelectElement.addEventListener("change",this._modeSelected.bind(this),false);this._modeLabelElement=modeSelectContainer.createChild("label");this._modeLabelElement.addEventListener("click",this._rotateButtonClicked.bind(this),false);this._modeLabelElement.title=WebInspector.UIString("Change orientation");this._emulatedSettingChangedMuted=false;this._lastOrientation=null;WebInspector.overridesSupport.settings.emulateResolution.addChangeListener(this._emulatedSettingChanged,this);WebInspector.overridesSupport.settings.deviceWidth.addChangeListener(this._emulatedSettingChanged,this);WebInspector.overridesSupport.settings.deviceHeight.addChangeListener(this._emulatedSettingChanged,this);WebInspector.overridesSupport.settings.deviceScaleFactor.addChangeListener(this._emulatedSettingChanged,this);WebInspector.overridesSupport.settings.emulateMobile.addChangeListener(this._emulatedSettingChanged,this);WebInspector.overridesSupport.settings.emulateTouch.addChangeListener(this._emulatedSettingChanged,this);WebInspector.overridesSupport.settings.userAgent.addChangeListener(this._emulatedSettingChanged,this);WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.CustomDevicesUpdated,this._deviceListChanged,this);WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.StandardDevicesUpdated,this._deviceListChanged,this);this._deviceListChanged();}
WebInspector.DeviceSelect.prototype={_deviceListChanged:function()
{this._deviceSelectElement.removeChildren();var selectDeviceOption=new Option(WebInspector.UIString("<Select model>"),WebInspector.UIString("<Select model>"));selectDeviceOption.device=null;selectDeviceOption.lastSelectedIndex=0;selectDeviceOption.disabled=true;this._deviceSelectElement.appendChild(selectDeviceOption);this._addDeviceGroup(WebInspector.UIString("Custom"),WebInspector.emulatedDevicesList.custom());this._addDeviceGroup(WebInspector.UIString("Devices"),WebInspector.emulatedDevicesList.standard());this._emulatedSettingChanged();},_addDeviceGroup:function(name,devices)
{devices=devices.filter(function(d){return d.show();});if(!devices.length)
return;devices.sort(WebInspector.EmulatedDevice.deviceComparator);var groupElement=this._deviceSelectElement.createChild("optgroup");groupElement.label=name;for(var i=0;i<devices.length;++i){var option=new Option(devices[i].title,devices[i].title);option.device=devices[i];option.lastSelectedIndex=0;groupElement.appendChild(option);}},_emulatedSettingChanged:function()
{if(this._emulatedSettingChangedMuted)
return;for(var i=1;i<this._deviceSelectElement.options.length;++i){var option=this._deviceSelectElement.options[i];var device=(option.device);for(var j=0;j<device.modes.length;j++){if(WebInspector.overridesSupport.isEmulatingDevice(device.modeToOverridesDevice(device.modes[j]))){this._select(device,device.modes[j]);return;}}}
this._select(null,null);},_select:function(device,mode)
{for(var i=0;i<this._deviceSelectElement.options.length;i++){if(this._deviceSelectElement.options[i].device===device)
this._deviceSelectElement.selectedIndex=i;}
this._updateModeSelect();for(var i=0;i<this._modeSelectElement.options.length;i++){if(this._modeSelectElement.options[i].mode===mode)
this._modeSelectElement.selectedIndex=i;}
this._updateModeControls();this._saveLastSelectedIndex();if(this._callback){var option=this._modeSelectElement.options[this._modeSelectElement.selectedIndex];this._callback(option.device,option.mode);}},_deviceSelected:function()
{this._updateModeSelect();this._modeSelected();},_updateModeSelect:function()
{this._modeSelectElement.removeChildren();var option=this._deviceSelectElement.options[this._deviceSelectElement.selectedIndex];var device=(option.device);if(this._deviceSelectElement.selectedIndex===0){this._addMode(device,null,"");}else if(device.modes.length===1){this._addMode(device,device.modes[0],WebInspector.UIString("Default"));}else{this._addOrientation(device,WebInspector.EmulatedDevice.Vertical,WebInspector.UIString("Portrait"));this._addOrientation(device,WebInspector.EmulatedDevice.Horizontal,WebInspector.UIString("Landscape"));}
this._updateRotateModes();var index=option.lastSelectedIndex;var modeOption=this._modeSelectElement.options[index];if(modeOption.rotateIndex!=-1){var rotateOption=this._modeSelectElement.options[modeOption.rotateIndex];if(rotateOption.mode&&rotateOption.mode.orientation===this._lastOrientation)
index=modeOption.rotateIndex;}
this._modeSelectElement.selectedIndex=index;this._updateModeControls();},_addOrientation:function(device,orientation,title)
{var modes=device.modesForOrientation(orientation);if(!modes.length)
return;if(modes.length===1){this._addMode(device,modes[0],title);}else{for(var index=0;index<modes.length;index++)
this._addMode(device,modes[index],title+" \u2013 "+modes[index].title);}},_addMode:function(device,mode,title)
{var option=new Option(title,title);option.mode=mode;option.device=device;this._modeSelectElement.appendChild(option);},_updateRotateModes:function()
{for(var i=0;i<this._modeSelectElement.options.length;i++){var modeI=this._modeSelectElement.options[i].mode;this._modeSelectElement.options[i].rotateIndex=-1;for(var j=0;j<this._modeSelectElement.options.length;j++){var modeJ=this._modeSelectElement.options[j].mode;if(modeI&&modeJ&&modeI.orientation!==modeJ.orientation&&modeI.title===modeJ.title)
this._modeSelectElement.options[i].rotateIndex=j;}}},_updateModeControls:function()
{this._modeLabelElement.textContent=this._modeSelectElement.options[this._modeSelectElement.selectedIndex].label;if(this._modeSelectElement.options.length<=1){this._modeSelectElement.classList.toggle("hidden",true);this._modeLabelElement.classList.toggle("hidden",true);}else{var showLabel=this._modeSelectElement.options.length===2&&this._modeSelectElement.options[0].rotateIndex===1;this._modeSelectElement.classList.toggle("hidden",showLabel);this._modeLabelElement.classList.toggle("hidden",!showLabel);}
this._rotateButton.classList.toggle("hidden",this._modeSelectElement.options[this._modeSelectElement.selectedIndex].rotateIndex===-1);},_modeSelected:function()
{this._saveLastSelectedIndex();this._updateModeControls();var option=this._modeSelectElement.options[this._modeSelectElement.selectedIndex];if(this._callback)
this._callback(option.device,option.mode);this._emulatedSettingChangedMuted=true;WebInspector.overridesSupport.emulateDevice(option.device.modeToOverridesDevice(option.mode));this._emulatedSettingChangedMuted=false;},_saveLastSelectedIndex:function()
{this._deviceSelectElement.options[this._deviceSelectElement.selectedIndex].lastSelectedIndex=this._modeSelectElement.selectedIndex;var option=this._modeSelectElement.options[this._modeSelectElement.selectedIndex];if(option.mode&&option.rotateIndex!=-1)
this._lastOrientation=option.mode.orientation;},_rotateButtonClicked:function()
{this._modeSelectElement.selectedIndex=this._modeSelectElement.options[this._modeSelectElement.selectedIndex].rotateIndex;this._modeSelected();}};WebInspector.InspectedPagePlaceholder=function()
{WebInspector.Widget.call(this);this.element.classList.add("inspected-page-placeholder");WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged,this._scheduleUpdate,this);this._margins={top:0,right:0,bottom:0,left:0};this.restoreMinimumSizeAndMargins();};WebInspector.InspectedPagePlaceholder.Events={Update:"Update"};WebInspector.InspectedPagePlaceholder.MarginValue=3;WebInspector.InspectedPagePlaceholder.prototype={_findMargins:function()
{var margins={top:0,right:0,bottom:0,left:0};if(this._useMargins){var adjacent={top:true,right:true,bottom:true,left:true};var widget=this;while(widget.parentWidget()){var parent=widget.parentWidget();if(parent instanceof WebInspector.SplitWidget){var side=parent.sidebarSide();if(adjacent[side]&&!parent.hasCustomResizer()&&parent.isResizable())
margins[side]=WebInspector.InspectedPagePlaceholder.MarginValue;adjacent[side]=false;}
widget=parent;}}
if(this._margins.top!==margins.top||this._margins.left!==margins.left||this._margins.right!==margins.right||this._margins.bottom!==margins.bottom){this._margins=margins;this._scheduleUpdate();}},onResize:function()
{this._findMargins();this._scheduleUpdate();},_scheduleUpdate:function()
{if(this._updateId)
this.element.window().cancelAnimationFrame(this._updateId);this._updateId=this.element.window().requestAnimationFrame(this.update.bind(this));},restoreMinimumSizeAndMargins:function()
{this._useMargins=true;this.setMinimumSize(50,50);this._findMargins();},clearMinimumSizeAndMargins:function()
{this._useMargins=false;this.setMinimumSize(1,1);this._findMargins();},_dipPageRect:function()
{var zoomFactor=WebInspector.zoomManager.zoomFactor();var rect=this.element.getBoundingClientRect();var bodyRect=this.element.ownerDocument.body.getBoundingClientRect();var left=Math.max(rect.left*zoomFactor+this._margins.left,bodyRect.left*zoomFactor);var top=Math.max(rect.top*zoomFactor+this._margins.top,bodyRect.top*zoomFactor);var bottom=Math.min(rect.bottom*zoomFactor-this._margins.bottom,bodyRect.bottom*zoomFactor);var right=Math.min(rect.right*zoomFactor-this._margins.right,bodyRect.right*zoomFactor);return{x:left,y:top,width:right-left,height:bottom-top};},update:function()
{delete this._updateId;var rect=this._dipPageRect();var bounds={x:Math.round(rect.x),y:Math.round(rect.y),height:Math.max(1,Math.round(rect.height)),width:Math.max(1,Math.round(rect.width))};this.dispatchEventToListeners(WebInspector.InspectedPagePlaceholder.Events.Update,bounds);},__proto__:WebInspector.Widget.prototype};;WebInspector.MediaQueryInspector=function(widthSetting)
{WebInspector.Widget.call(this,true);this.registerRequiredCSS("emulation/mediaQueryInspector.css");this.contentElement.classList.add("media-inspector-view","media-inspector-view-empty");this.contentElement.addEventListener("click",this._onMediaQueryClicked.bind(this),false);this.contentElement.addEventListener("contextmenu",this._onContextMenu.bind(this),false);this._mediaThrottler=new WebInspector.Throttler(0);this._widthSetting=widthSetting;this._offset=0;this._scale=1;this._lastReportedCount=0;WebInspector.targetManager.observeTargets(this);WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged,this._renderMediaQueries.bind(this),this);}
WebInspector.MediaQueryInspector.Section={Max:0,MinMax:1,Min:2}
WebInspector.MediaQueryInspector.Events={CountUpdated:"CountUpdated"}
WebInspector.MediaQueryInspector.prototype={targetAdded:function(target)
{if(this._cssModel)
return;this._cssModel=WebInspector.CSSStyleModel.fromTarget(target);if(!this._cssModel)
return;this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._scheduleMediaQueriesUpdate,this);this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._scheduleMediaQueriesUpdate,this);this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged,this._scheduleMediaQueriesUpdate,this);this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged,this._scheduleMediaQueriesUpdate,this);},targetRemoved:function(target)
{if(WebInspector.CSSStyleModel.fromTarget(target)!==this._cssModel)
return;this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._scheduleMediaQueriesUpdate,this);this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._scheduleMediaQueriesUpdate,this);this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged,this._scheduleMediaQueriesUpdate,this);this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged,this._scheduleMediaQueriesUpdate,this);delete this._cssModel;},setAxisTransform:function(offset,scale)
{if(this._offset===offset&&Math.abs(this._scale-scale)<1e-8)
return;this._offset=offset;this._scale=scale;this._renderMediaQueries();},setEnabled:function(enabled)
{this._enabled=enabled;this._scheduleMediaQueriesUpdate();},_onMediaQueryClicked:function(event)
{var mediaQueryMarker=event.target.enclosingNodeOrSelfWithClass("media-inspector-marker");if(!mediaQueryMarker)
return;var model=mediaQueryMarker._model;if(model.section()===WebInspector.MediaQueryInspector.Section.Max){this._widthSetting.set(model.maxWidthExpression().computedLength());return;}
if(model.section()===WebInspector.MediaQueryInspector.Section.Min){this._widthSetting.set(model.minWidthExpression().computedLength());return;}
var currentWidth=this._widthSetting.get();if(currentWidth!==model.minWidthExpression().computedLength())
this._widthSetting.set(model.minWidthExpression().computedLength());else
this._widthSetting.set(model.maxWidthExpression().computedLength());},_onContextMenu:function(event)
{if(!this._cssModel||!this._cssModel.isEnabled())
return;var mediaQueryMarker=event.target.enclosingNodeOrSelfWithClass("media-inspector-marker");if(!mediaQueryMarker)
return;var locations=mediaQueryMarker._locations;var uiLocations=new Map();for(var i=0;i<locations.length;++i){var uiLocation=WebInspector.cssWorkspaceBinding.rawLocationToUILocation(locations[i]);if(!uiLocation)
continue;var descriptor=String.sprintf("%s:%d:%d",uiLocation.uiSourceCode.url(),uiLocation.lineNumber+1,uiLocation.columnNumber+1);uiLocations.set(descriptor,uiLocation);}
var contextMenuItems=uiLocations.keysArray().sort();var contextMenu=new WebInspector.ContextMenu(event);var subMenuItem=contextMenu.appendSubMenuItem(WebInspector.UIString.capitalize("Reveal in ^source ^code"));for(var i=0;i<contextMenuItems.length;++i){var title=contextMenuItems[i];subMenuItem.appendItem(title,this._revealSourceLocation.bind(this,(uiLocations.get(title))));}
contextMenu.show();},_revealSourceLocation:function(location)
{WebInspector.Revealer.reveal(location);},_scheduleMediaQueriesUpdate:function()
{if(!this._enabled)
return;this._mediaThrottler.schedule(this._refetchMediaQueries.bind(this));},_refetchMediaQueries:function()
{if(!this._enabled||!this._cssModel)
return Promise.resolve();return this._cssModel.mediaQueriesPromise().then(this._rebuildMediaQueries.bind(this))},_squashAdjacentEqual:function(models)
{var filtered=[];for(var i=0;i<models.length;++i){var last=filtered.peekLast();if(!last||!last.equals(models[i]))
filtered.push(models[i]);}
return filtered;},_rebuildMediaQueries:function(cssMedias)
{var queryModels=[];for(var i=0;i<cssMedias.length;++i){var cssMedia=cssMedias[i];if(!cssMedia.mediaList)
continue;for(var j=0;j<cssMedia.mediaList.length;++j){var mediaQuery=cssMedia.mediaList[j];var queryModel=WebInspector.MediaQueryInspector.MediaQueryUIModel.createFromMediaQuery(cssMedia,mediaQuery);if(queryModel&&queryModel.rawLocation())
queryModels.push(queryModel);}}
queryModels.sort(compareModels);queryModels=this._squashAdjacentEqual(queryModels);var allEqual=this._cachedQueryModels&&this._cachedQueryModels.length==queryModels.length;for(var i=0;allEqual&&i<queryModels.length;++i)
allEqual=allEqual&&this._cachedQueryModels[i].equals(queryModels[i]);if(allEqual)
return;this._cachedQueryModels=queryModels;this._renderMediaQueries();function compareModels(model1,model2)
{return model1.compareTo(model2);}},_renderMediaQueries:function()
{if(!this._cachedQueryModels)
return;var markers=[];var lastMarker=null;for(var i=0;i<this._cachedQueryModels.length;++i){var model=this._cachedQueryModels[i];if(lastMarker&&lastMarker.model.dimensionsEqual(model)){lastMarker.locations.push(model.rawLocation());lastMarker.active=lastMarker.active||model.active();}else{lastMarker={active:model.active(),model:model,locations:[model.rawLocation()]};markers.push(lastMarker);}}
if(markers.length!==this._lastReportedCount){this._lastReportedCount=markers.length;this.dispatchEventToListeners(WebInspector.MediaQueryInspector.Events.CountUpdated,markers.length);}
if(!this.isShowing())
return;var oldChildrenCount=this.contentElement.children.length;this.contentElement.removeChildren();var container=null;for(var i=0;i<markers.length;++i){if(!i||markers[i].model.section()!==markers[i-1].model.section())
container=this.contentElement.createChild("div","media-inspector-marker-container");var marker=markers[i];var bar=this._createElementFromMediaQueryModel(marker.model);bar._model=marker.model;bar._locations=marker.locations;bar.classList.toggle("media-inspector-marker-inactive",!marker.active);container.appendChild(bar);}},_zoomFactor:function()
{return WebInspector.zoomManager.zoomFactor()/this._scale;},wasShown:function()
{this._renderMediaQueries();},_createElementFromMediaQueryModel:function(model)
{var zoomFactor=this._zoomFactor();var minWidthValue=model.minWidthExpression()?model.minWidthExpression().computedLength():0;const styleClassPerSection=["media-inspector-marker-max-width","media-inspector-marker-min-max-width","media-inspector-marker-min-width"];var markerElement=createElementWithClass("div","media-inspector-marker");var leftPixelValue=minWidthValue?(minWidthValue-this._offset)/zoomFactor:0;markerElement.style.left=leftPixelValue+"px";markerElement.classList.add(styleClassPerSection[model.section()]);var widthPixelValue=null;if(model.maxWidthExpression()&&model.minWidthExpression())
widthPixelValue=(model.maxWidthExpression().computedLength()-minWidthValue)/zoomFactor;else if(model.maxWidthExpression())
widthPixelValue=(model.maxWidthExpression().computedLength()-this._offset)/zoomFactor;else
markerElement.style.right="0";if(typeof widthPixelValue==="number")
markerElement.style.width=widthPixelValue+"px";if(model.minWidthExpression()){var labelClass=model.section()===WebInspector.MediaQueryInspector.Section.MinMax?"media-inspector-label-right":"media-inspector-label-left";var labelContainer=markerElement.createChild("div","media-inspector-marker-label-container media-inspector-marker-label-container-left");labelContainer.createChild("span","media-inspector-marker-label "+labelClass).textContent=model.minWidthExpression().value()+model.minWidthExpression().unit();}
if(model.maxWidthExpression()){var labelClass=model.section()===WebInspector.MediaQueryInspector.Section.MinMax?"media-inspector-label-left":"media-inspector-label-right";var labelContainer=markerElement.createChild("div","media-inspector-marker-label-container media-inspector-marker-label-container-right");labelContainer.createChild("span","media-inspector-marker-label "+labelClass).textContent=model.maxWidthExpression().value()+model.maxWidthExpression().unit();}
markerElement.title=model.mediaText();return markerElement;},__proto__:WebInspector.Widget.prototype};WebInspector.MediaQueryInspector.MediaQueryUIModel=function(cssMedia,minWidthExpression,maxWidthExpression,active)
{this._cssMedia=cssMedia;this._minWidthExpression=minWidthExpression;this._maxWidthExpression=maxWidthExpression;this._active=active;if(maxWidthExpression&&!minWidthExpression)
this._section=WebInspector.MediaQueryInspector.Section.Max;else if(minWidthExpression&&maxWidthExpression)
this._section=WebInspector.MediaQueryInspector.Section.MinMax;else
this._section=WebInspector.MediaQueryInspector.Section.Min;}
WebInspector.MediaQueryInspector.MediaQueryUIModel.createFromMediaQuery=function(cssMedia,mediaQuery)
{var maxWidthExpression=null;var maxWidthPixels=Number.MAX_VALUE;var minWidthExpression=null;var minWidthPixels=Number.MIN_VALUE;var expressions=mediaQuery.expressions();for(var i=0;i<expressions.length;++i){var expression=expressions[i];var feature=expression.feature();if(feature.indexOf("width")===-1)
continue;var pixels=expression.computedLength();if(feature.startsWith("max-")&&pixels<maxWidthPixels){maxWidthExpression=expression;maxWidthPixels=pixels;}else if(feature.startsWith("min-")&&pixels>minWidthPixels){minWidthExpression=expression;minWidthPixels=pixels;}}
if(minWidthPixels>maxWidthPixels||(!maxWidthExpression&&!minWidthExpression))
return null;return new WebInspector.MediaQueryInspector.MediaQueryUIModel(cssMedia,minWidthExpression,maxWidthExpression,mediaQuery.active());}
WebInspector.MediaQueryInspector.MediaQueryUIModel.prototype={equals:function(other)
{return this.compareTo(other)===0;},dimensionsEqual:function(other)
{return this.section()===other.section()&&(!this.minWidthExpression()||(this.minWidthExpression().computedLength()===other.minWidthExpression().computedLength()))&&(!this.maxWidthExpression()||(this.maxWidthExpression().computedLength()===other.maxWidthExpression().computedLength()));},compareTo:function(other)
{if(this.section()!==other.section())
return this.section()-other.section();if(this.dimensionsEqual(other)){var myLocation=this.rawLocation();var otherLocation=other.rawLocation();if(!myLocation&&!otherLocation)
return this.mediaText().compareTo(other.mediaText());if(myLocation&&!otherLocation)
return 1;if(!myLocation&&otherLocation)
return-1;if(this.active()!==other.active())
return this.active()?-1:1;return myLocation.url.compareTo(otherLocation.url)||myLocation.lineNumber-otherLocation.lineNumber||myLocation.columnNumber-otherLocation.columnNumber;}
if(this.section()===WebInspector.MediaQueryInspector.Section.Max)
return other.maxWidthExpression().computedLength()-this.maxWidthExpression().computedLength();if(this.section()===WebInspector.MediaQueryInspector.Section.Min)
return this.minWidthExpression().computedLength()-other.minWidthExpression().computedLength();return this.minWidthExpression().computedLength()-other.minWidthExpression().computedLength()||other.maxWidthExpression().computedLength()-this.maxWidthExpression().computedLength();},section:function()
{return this._section;},mediaText:function()
{return this._cssMedia.text;},rawLocation:function()
{if(!this._rawLocation)
this._rawLocation=this._cssMedia.rawLocation();return this._rawLocation;},minWidthExpression:function()
{return this._minWidthExpression;},maxWidthExpression:function()
{return this._maxWidthExpression;},active:function()
{return this._active;}};WebInspector.ResponsiveDesignView=function(inspectedPagePlaceholder)
{WebInspector.VBox.call(this);this.setMinimumSize(150,150);this.element.classList.add("responsive-design-view");this.registerRequiredCSS("emulation/responsiveDesignView.css");this._showMediaQueryInspectorSetting=WebInspector.settings.createSetting("showMediaQueryInspector",false);this._responsiveDesignContainer=new WebInspector.VBox();this._uiInitialized=false;this._inspectedPagePlaceholder=inspectedPagePlaceholder;inspectedPagePlaceholder.show(this.element);this._enabled=false;this._viewport={scrollX:0,scrollY:0,contentsWidth:0,contentsHeight:0,pageScaleFactor:1,minimumPageScaleFactor:1,maximumPageScaleFactor:1};this._drawContentsSize=true;this._deviceInsets=new Insets(0,0,0,0);this._pageContainerSrcset="";this._viewportChangedThrottler=new WebInspector.Throttler(0);this._pageScaleFactorThrottler=new WebInspector.Throttler(50);WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged,this._onZoomChanged,this);WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.EmulationStateChanged,this._emulationEnabledChanged,this);WebInspector.targetManager.observeTargets(this,WebInspector.Target.Type.Page);this._emulationEnabledChanged();};WebInspector.ResponsiveDesignView.RulerWidth=26;WebInspector.ResponsiveDesignView.RulerHeight=22;WebInspector.ResponsiveDesignView.RulerTopHeight=11;WebInspector.ResponsiveDesignView.RulerBottomHeight=9;WebInspector.ResponsiveDesignView.prototype={_ensureUIInitialized:function()
{if(this._uiInitialized)
return;this._uiInitialized=true;this._createToolbar();this._canvasContainer=new WebInspector.Widget();this._canvasContainer.element.classList.add("responsive-design");this._canvasContainer.show(this._responsiveDesignContainer.element);this._canvas=this._canvasContainer.element.createChild("canvas","fill responsive-design-canvas");this._mediaInspectorContainer=this._canvasContainer.element.createChild("div","responsive-design-media-container");WebInspector.Tooltip.addNativeOverrideContainer(this._mediaInspectorContainer);this._mediaInspector=new WebInspector.MediaQueryInspector(WebInspector.overridesSupport.settings.deviceWidth);this._updateMediaQueryInspector();WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.OverridesWarningUpdated,this._overridesWarningUpdated,this);this._slidersContainer=this._canvasContainer.element.createChild("div","vbox responsive-design-sliders-container");var genericDeviceOutline=this._slidersContainer.createChild("div","responsive-design-generic-outline-container");genericDeviceOutline.createChild("div","responsive-design-generic-outline");var widthSlider=this._slidersContainer.createChild("div","responsive-design-slider-width");widthSlider.createChild("div","responsive-design-thumb-handle");this._createResizer(widthSlider,true,false);var heightSlider=this._slidersContainer.createChild("div","responsive-design-slider-height");heightSlider.createChild("div","responsive-design-thumb-handle");this._createResizer(heightSlider,false,true);var cornerSlider=this._slidersContainer.createChild("div","responsive-design-slider-corner");this._createResizer(cornerSlider,true,true);this._pageContainer=this._slidersContainer.createChild("div","vbox flex-auto responsive-design-page-container");this._pageContainerImage=this._pageContainer.createChild("img","responsive-design-page-container-image hidden");this._pageContainerImage.addEventListener("load",this._onPageContainerImageLoaded.bind(this,true),false);this._pageContainerImage.addEventListener("error",this._onPageContainerImageLoaded.bind(this,false),false);this._pageScaleContainer=this._canvasContainer.element.createChild("div","hbox responsive-design-page-scale-container");this._decreasePageScaleButton=this._pageScaleContainer.createChild("button","responsive-design-page-scale-button responsive-design-page-scale-decrease");this._decreasePageScaleButton.createChild("div","glyph");this._decreasePageScaleButton.tabIndex=-1;this._decreasePageScaleButton.addEventListener("click",this._pageScaleButtonClicked.bind(this,false),false);this._pageScaleLabel=this._pageScaleContainer.createChild("label","responsive-design-page-scale-label");this._pageScaleLabel.title=WebInspector.UIString("Shift + drag to change page scale");this._pageScaleLabel.addEventListener("dblclick",this._resetPageScale.bind(this),false);this._increasePageScaleButton=this._pageScaleContainer.createChild("button","responsive-design-page-scale-button responsive-design-page-scale-increase");this._increasePageScaleButton.tabIndex=-1;this._increasePageScaleButton.createChild("div","glyph");this._increasePageScaleButton.addEventListener("click",this._pageScaleButtonClicked.bind(this,true),false);this._mediaInspector.addEventListener(WebInspector.MediaQueryInspector.Events.CountUpdated,this._updateMediaQueryInspectorButton,this);this._overridesWarningUpdated();},targetAdded:function(target)
{if(this._target)
return;this._target=target;target.registerEmulationDispatcher(new WebInspector.EmulationDispatcher(this));},targetRemoved:function(target)
{},_invalidateCache:function()
{delete this._cachedScale;delete this._cachedCssCanvasWidth;delete this._cachedCssCanvasHeight;delete this._cachedCssHeight;delete this._cachedCssWidth;delete this._cachedCssPageWidth;delete this._cachedCssPageHeight;delete this._cachedDeviceInsets;delete this._cachedZoomFactor;delete this._cachedViewport;delete this._cachedDrawContentsSize;delete this._cachedMediaInspectorHeight;delete this._availableSize;},_emulationEnabledChanged:function()
{var enabled=WebInspector.overridesSupport.emulationEnabled();if(enabled&&!this._enabled){WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.DeviceModeEnabled);this._invalidateCache();this._ignoreResize=true;this._ensureUIInitialized();this._enabled=true;this._mediaInspector.setEnabled(true);this._inspectedPagePlaceholder.clearMinimumSizeAndMargins();this._inspectedPagePlaceholder.show(this._pageContainer);this._responsiveDesignContainer.show(this.element);delete this._ignoreResize;this.onResize();}else if(!enabled&&this._enabled){this._mediaInspector.setEnabled(false);this._invalidateCache();this._ignoreResize=true;this._enabled=false;this._scale=1;this._inspectedPagePlaceholder.restoreMinimumSizeAndMargins();this._responsiveDesignContainer.detach();this._inspectedPagePlaceholder.show(this.element);delete this._ignoreResize;this.onResize();}},update:function(dipWidth,dipHeight,scale,pageWidth,pageHeight)
{this._scale=scale;this._dipWidth=dipWidth?Math.max(dipWidth,1):0;this._dipHeight=dipHeight?Math.max(dipHeight,1):0;this._pageWidth=pageWidth?Math.max(pageWidth,1):0;this._pageHeight=pageHeight?Math.max(pageHeight,1):0;this._updateUI();},updatePageResizer:function()
{var available=this._availableDipSize();WebInspector.overridesSupport.setPageResizer(this,available.size,available.insets);},_availableDipSize:function()
{if(typeof this._availableSize==="undefined"){if(!this._enabled)
return{size:new Size(1,1),insets:new Insets(0,0,0,0)};var zoomFactor=WebInspector.zoomManager.zoomFactor();var rect=this._canvasContainer.element.getBoundingClientRect();var rulerTotalHeight=this._rulerTotalHeightDIP();this._availableSize={size:new Size(Math.max(rect.width*zoomFactor-WebInspector.ResponsiveDesignView.RulerWidth,1),Math.max(rect.height*zoomFactor-rulerTotalHeight,1)),insets:this._deviceInsets};}
return this._availableSize;},_createResizer:function(element,x,y)
{var resizer=new WebInspector.ResizerWidget();resizer.addElement(element);resizer.setCursor(x&&y?"nwse-resize":(x?"ew-resize":"ns-resize"));resizer.addEventListener(WebInspector.ResizerWidget.Events.ResizeStart,this._onResizeStart,this);resizer.addEventListener(WebInspector.ResizerWidget.Events.ResizeUpdate,this._onResizeUpdate.bind(this,x,y));resizer.addEventListener(WebInspector.ResizerWidget.Events.ResizeEnd,this._onResizeEnd,this);return resizer;},_onResizeStart:function(event)
{this._drawContentsSize=false;var available=this._availableDipSize().size;this._slowPositionStart=null;this._resizeStart={x:this._dipWidth||available.width,y:this._dipHeight||available.height};this.dispatchEventToListeners(WebInspector.OverridesSupport.PageResizer.Events.FixedScaleRequested,true);this._updateUI();},_onResizeUpdate:function(x,y,event)
{if(event.data.shiftKey!==!!this._slowPositionStart)
this._slowPositionStart=event.data.shiftKey?{x:event.data.currentX,y:event.data.currentY}:null;var cssOffsetX=event.data.currentX-event.data.startX;var cssOffsetY=event.data.currentY-event.data.startY;if(this._slowPositionStart){cssOffsetX=(event.data.currentX-this._slowPositionStart.x)/10+this._slowPositionStart.x-event.data.startX;cssOffsetY=(event.data.currentY-this._slowPositionStart.y)/10+this._slowPositionStart.y-event.data.startY;}
var dipOffsetX=Math.round(cssOffsetX*WebInspector.zoomManager.zoomFactor());var dipOffsetY=Math.round(cssOffsetY*WebInspector.zoomManager.zoomFactor());var newSizeX=this._resizeStart.x+dipOffsetX;newSizeX=Math.round(newSizeX/(this._scale||1));newSizeX=Math.max(Math.min(newSizeX,WebInspector.OverridesSupport.MaxDeviceSize),1);var newSizeY=this._resizeStart.y+dipOffsetY;newSizeY=Math.round(newSizeY/(this._scale||1));newSizeY=Math.max(Math.min(newSizeY,WebInspector.OverridesSupport.MaxDeviceSize),1);var requested={};if(x)
requested.width=newSizeX;if(y)
requested.height=newSizeY;this.dispatchEventToListeners(WebInspector.OverridesSupport.PageResizer.Events.ResizeRequested,requested);},_onResizeEnd:function(event)
{this._drawContentsSize=true;this.dispatchEventToListeners(WebInspector.OverridesSupport.PageResizer.Events.FixedScaleRequested,false);delete this._resizeStart;this._updateUI();},_drawCanvas:function(cssCanvasWidth,cssCanvasHeight,rulerHeight)
{if(!this._enabled)
return;var canvas=this._canvas;var context=canvas.getContext("2d");canvas.style.width=cssCanvasWidth+"px";canvas.style.height=cssCanvasHeight+"px";var zoomFactor=WebInspector.zoomManager.zoomFactor();var dipCanvasWidth=cssCanvasWidth*zoomFactor;var dipCanvasHeight=cssCanvasHeight*zoomFactor;var deviceScaleFactor=window.devicePixelRatio;canvas.width=deviceScaleFactor*cssCanvasWidth;canvas.height=deviceScaleFactor*cssCanvasHeight;context.scale(canvas.width/dipCanvasWidth,canvas.height/dipCanvasHeight);context.font="11px "+WebInspector.fontFamily();const backgroundColor="rgb(102, 102, 102)";const lightLineColor="rgb(132, 132, 132)";const darkLineColor="rgb(114, 114, 114)";const rulerColor="rgb(125, 125, 125)";const textColor="rgb(186, 186, 186)";const contentsSizeColor="rgba(0, 0, 0, 0.3)";var scale=(this._scale||1)*this._viewport.pageScaleFactor;var rulerScale=0.5;while(Math.abs(rulerScale*scale-1)>Math.abs((rulerScale+0.5)*scale-1))
rulerScale+=0.5;var gridStep=50*scale*rulerScale;var gridSubStep=10*scale*rulerScale;var rulerSubStep=5*scale*rulerScale;var rulerStepCount=20;var rulerWidth=WebInspector.ResponsiveDesignView.RulerWidth;var dipGridWidth=dipCanvasWidth-rulerWidth;var dipGridHeight=dipCanvasHeight-rulerHeight;var dipScrollX=this._viewport.scrollX*scale;var dipScrollY=this._viewport.scrollY*scale;context.translate(rulerWidth,rulerHeight);context.fillStyle=backgroundColor;context.fillRect(0,0,dipGridWidth,dipGridHeight);context.translate(0.5,0.5);context.strokeStyle=rulerColor;context.fillStyle=textColor;context.lineWidth=1;context.save();var minXIndex=Math.ceil(dipScrollX/rulerSubStep);var maxXIndex=Math.floor((dipScrollX+dipGridWidth)/rulerSubStep);if(minXIndex){context.beginPath();context.moveTo(0,-rulerHeight);context.lineTo(0,0);context.stroke();}
context.translate(-dipScrollX,0);for(var index=minXIndex;index<=maxXIndex;index++){var x=index*rulerSubStep;var height=WebInspector.ResponsiveDesignView.RulerHeight*0.25;if(!(index%(rulerStepCount/4)))
height=WebInspector.ResponsiveDesignView.RulerHeight*0.5;if(!(index%(rulerStepCount/2)))
height=rulerHeight;if(!(index%rulerStepCount)){context.save();context.translate(x,0);context.fillText(Math.round(x/scale),2,-rulerHeight+10);context.restore();height=rulerHeight;}
context.beginPath();context.moveTo(x,-height);context.lineTo(x,0);context.stroke();}
context.restore();context.save();context.translate(0,this._deviceInsets.top);var minYIndex=Math.ceil(dipScrollY/rulerSubStep);var maxYIndex=Math.floor((dipScrollY+dipGridHeight)/rulerSubStep);context.translate(0,-dipScrollY);for(var index=minYIndex;index<=maxYIndex;index++){var y=index*rulerSubStep;var x=-rulerWidth*0.25;if(!(index%(rulerStepCount/4)))
x=-rulerWidth*0.5;if(!(index%(rulerStepCount/2)))
x=-rulerWidth*0.75;if(!(index%rulerStepCount)){context.save();context.translate(0,y);context.rotate(-Math.PI/2);context.fillText(Math.round(y/scale),2,-rulerWidth+10);context.restore();x=-rulerWidth;}
context.beginPath();context.moveTo(x,y);context.lineTo(0,y);context.stroke();}
context.restore();drawGrid(dipScrollX,dipScrollY+this._deviceInsets.top,darkLineColor,gridSubStep);drawGrid(dipScrollX,dipScrollY+this._deviceInsets.top,lightLineColor,gridStep);function drawGrid(scrollX,scrollY,color,step)
{context.strokeStyle=color;var minX=Math.ceil(scrollX/step)*step;var maxX=Math.floor((scrollX+dipGridWidth)/step)*step-minX;var minY=Math.ceil(scrollY/step)*step;var maxY=Math.floor((scrollY+dipGridHeight)/step)*step-minY;context.save();context.translate(minX-scrollX,0);for(var x=0;x<=maxX;x+=step){context.beginPath();context.moveTo(x,0);context.lineTo(x,dipGridHeight);context.stroke();}
context.restore();context.save();context.translate(0,minY-scrollY);for(var y=0;y<=maxY;y+=step){context.beginPath();context.moveTo(0,y);context.lineTo(dipGridWidth,y);context.stroke();}
context.restore();}
context.translate(-0.5,-0.5);var pageScaleAvailable=WebInspector.overridesSupport.settings.emulateMobile.get()||WebInspector.overridesSupport.settings.emulateTouch.get();if(this._drawContentsSize&&pageScaleAvailable){context.save();context.fillStyle=contentsSizeColor;var visibleContentsWidth=Math.max(0,Math.min(dipGridWidth,this._viewport.contentsWidth*scale-dipScrollX));var visibleContentsHeight=Math.max(0,Math.min(dipGridHeight,this._viewport.contentsHeight*scale-dipScrollY+this._deviceInsets.top));context.translate(0,this._deviceInsets.top);context.fillRect(0,Math.max(-this._deviceInsets.top,-dipScrollY),visibleContentsWidth,visibleContentsHeight);context.restore();}},_rulerTotalHeightDIP:function()
{var mediaInspectorHeight=this._mediaInspector.isShowing()?this._mediaInspector.element.offsetHeight:0;if(!mediaInspectorHeight)
return WebInspector.ResponsiveDesignView.RulerHeight;return WebInspector.ResponsiveDesignView.RulerTopHeight+WebInspector.ResponsiveDesignView.RulerBottomHeight+mediaInspectorHeight*WebInspector.zoomManager.zoomFactor();},_updateUI:function()
{if(!this._enabled||!this.isShowing())
return;var zoomFactor=WebInspector.zoomManager.zoomFactor();var rect=this._canvas.parentElement.getBoundingClientRect();var availableDip=this._availableDipSize().size;var cssCanvasWidth=rect.width;var cssCanvasHeight=rect.height;var mediaInspectorHeight=this._mediaInspector.isShowing()?this._mediaInspector.element.offsetHeight:0;var rulerTotalHeight=this._rulerTotalHeightDIP();this._mediaInspector.setAxisTransform(this._viewport.scrollX,this._scale*this._viewport.pageScaleFactor);if(this._cachedZoomFactor!==zoomFactor||this._cachedMediaInspectorHeight!==mediaInspectorHeight){var cssRulerWidth=WebInspector.ResponsiveDesignView.RulerWidth/zoomFactor+"px";var cssRulerHeight=(mediaInspectorHeight?WebInspector.ResponsiveDesignView.RulerTopHeight:WebInspector.ResponsiveDesignView.RulerHeight)/zoomFactor+"px";var cssCanvasOffset=rulerTotalHeight/zoomFactor+"px";this._slidersContainer.style.left=cssRulerWidth;this._slidersContainer.style.top=cssCanvasOffset;this._warningInfobar.element.style.height=cssCanvasOffset;this._pageScaleContainer.style.top=cssCanvasOffset;this._mediaInspectorContainer.style.left=cssRulerWidth;this._mediaInspectorContainer.style.marginTop=cssRulerHeight;this._warningInfobar.element.style.left=cssRulerWidth;}
var cssWidth=(this._dipWidth?this._dipWidth:availableDip.width)/zoomFactor;var cssHeight=(this._dipHeight?this._dipHeight:availableDip.height)/zoomFactor;var cssPageWidth=(this._pageWidth?this._pageWidth:availableDip.width)/zoomFactor;var cssPageHeight=(this._pageHeight?this._pageHeight:availableDip.height)/zoomFactor;var deviceInsets=new Insets(this._deviceInsets.left*this._scale/zoomFactor,this._deviceInsets.top*this._scale/zoomFactor,this._deviceInsets.right*this._scale/zoomFactor,this._deviceInsets.bottom*this._scale/zoomFactor);cssWidth+=deviceInsets.left+deviceInsets.right;cssHeight+=deviceInsets.top+deviceInsets.bottom;var insetsChanged=!deviceInsets.isEqual(this._cachedDeviceInsets);if(this._cachedCssWidth!==cssWidth||this._cachedCssHeight!==cssHeight||insetsChanged){this._slidersContainer.style.width=cssWidth+"px";this._slidersContainer.style.height=cssHeight+"px";this._pageContainer.style.paddingLeft=deviceInsets.left+"px";this._pageContainer.style.paddingTop=deviceInsets.top+"px";this._pageContainer.style.paddingRight=deviceInsets.right+"px";this._pageContainer.style.paddingBottom=deviceInsets.bottom+"px";this._inspectedPagePlaceholder.onResize();}
if(this._cachedCssPageWidth!==cssPageWidth||this._cachedCssPageHeight!==cssPageHeight){this._pageContainerImage.style.width=cssPageWidth+"px";this._pageContainerImage.style.height=cssPageHeight+"px";}
this._loadPageContainerImage();var pageScaleVisible=cssWidth+this._pageScaleContainerWidth+WebInspector.ResponsiveDesignView.RulerWidth/zoomFactor<=rect.width;this._pageScaleContainer.classList.toggle("hidden",!pageScaleVisible);var viewportChanged=!this._cachedViewport||this._cachedViewport.scrollX!==this._viewport.scrollX||this._cachedViewport.scrollY!==this._viewport.scrollY||this._cachedViewport.contentsWidth!==this._viewport.contentsWidth||this._cachedViewport.contentsHeight!==this._viewport.contentsHeight||this._cachedViewport.pageScaleFactor!==this._viewport.pageScaleFactor||this._cachedViewport.minimumPageScaleFactor!==this._viewport.minimumPageScaleFactor||this._cachedViewport.maximumPageScaleFactor!==this._viewport.maximumPageScaleFactor;var canvasInvalidated=viewportChanged||this._drawContentsSize!==this._cachedDrawContentsSize||this._cachedScale!==this._scale||this._cachedCssCanvasWidth!==cssCanvasWidth||this._cachedCssCanvasHeight!==cssCanvasHeight||this._cachedZoomFactor!==zoomFactor||this._cachedMediaInspectorHeight!==mediaInspectorHeight||insetsChanged;if(canvasInvalidated)
this._drawCanvas(cssCanvasWidth,cssCanvasHeight,rulerTotalHeight);if(viewportChanged){this._pageScaleLabel.textContent=WebInspector.UIString("%.1f",this._viewport.pageScaleFactor);this._decreasePageScaleButton.title=WebInspector.UIString("Scale down (minimum %.1f)",this._viewport.minimumPageScaleFactor);this._decreasePageScaleButton.disabled=this._viewport.pageScaleFactor<=this._viewport.minimumPageScaleFactor;this._increasePageScaleButton.title=WebInspector.UIString("Scale up (maximum %.1f)",this._viewport.maximumPageScaleFactor);this._increasePageScaleButton.disabled=this._viewport.pageScaleFactor>=this._viewport.maximumPageScaleFactor;}
this._cachedScale=this._scale;this._cachedCssCanvasWidth=cssCanvasWidth;this._cachedCssCanvasHeight=cssCanvasHeight;this._cachedCssHeight=cssHeight;this._cachedCssWidth=cssWidth;this._cachedCssPageWidth=cssPageWidth;this._cachedCssPageHeight=cssPageHeight;this._cachedDeviceInsets=deviceInsets;this._cachedZoomFactor=zoomFactor;this._cachedViewport=this._viewport;this._cachedDrawContentsSize=this._drawContentsSize;this._cachedMediaInspectorHeight=mediaInspectorHeight;},_loadPageContainerImage:function()
{if(this._pageContainerImage.getAttribute("srcset")===this._pageContainerSrcset)
return;this._pageContainerImage.setAttribute("srcset",this._pageContainerSrcset);if(!this._pageContainerSrcset)
this._pageContainerImage.classList.toggle("hidden",true);},_onPageContainerImageLoaded:function(success)
{this._pageContainerImage.classList.toggle("hidden",!success);},onResize:function()
{if(!this._enabled||this._ignoreResize)
return;var oldSize=this._availableSize;this._pageScaleContainer.classList.remove("hidden");this._pageScaleContainerWidth=this._pageScaleContainer.offsetWidth;delete this._availableSize;var newSize=this._availableDipSize();if(!oldSize||!newSize.size.isEqual(oldSize.size)||!newSize.insets.isEqual(oldSize.insets))
this.dispatchEventToListeners(WebInspector.OverridesSupport.PageResizer.Events.AvailableSizeChanged,newSize);this._updateUI();this._inspectedPagePlaceholder.onResize();},_onZoomChanged:function()
{this._updateUI();},_createToolbar:function()
{this._toolbarElement=this._responsiveDesignContainer.element.createChild("div","responsive-design-toolbar");this._createButtonsSection();this._createDeviceSection();this._toolbarElement.createChild("div","responsive-design-separator");this._createNetworkSection();this._toolbarElement.createChild("div","responsive-design-separator");var moreButtonContainer=this._toolbarElement.createChild("div","responsive-design-more-button-container");var moreButton=moreButtonContainer.createChild("button","responsive-design-more-button");moreButton.title=WebInspector.UIString("More overrides");moreButton.addEventListener("click",this._showEmulationInDrawer.bind(this),false);moreButton.textContent="\u2026";},_createButtonsSection:function()
{var buttonsToolbar=new WebInspector.Toolbar("",this._toolbarElement);buttonsToolbar.makeVertical();buttonsToolbar.setColor("white");buttonsToolbar.setToggledColor("rgb(105, 194, 236)");buttonsToolbar.element.classList.add("responsive-design-section","responsive-design-section-buttons");var resetButton=new WebInspector.ToolbarButton(WebInspector.UIString("Reset all overrides"),"clear-toolbar-item");buttonsToolbar.appendToolbarItem(resetButton);resetButton.addEventListener("click",WebInspector.overridesSupport.reset,WebInspector.overridesSupport);this._toggleMediaInspectorButton=new WebInspector.ToolbarToggle(WebInspector.UIString("Media queries not found"),"waterfall-toolbar-item");this._toggleMediaInspectorButton.setToggled(this._showMediaQueryInspectorSetting.get());this._toggleMediaInspectorButton.setEnabled(false);this._toggleMediaInspectorButton.addEventListener("click",this._onToggleMediaInspectorButtonClick,this);this._showMediaQueryInspectorSetting.addChangeListener(this._updateMediaQueryInspector,this);buttonsToolbar.appendToolbarItem(this._toggleMediaInspectorButton);},_createDeviceSection:function()
{var deviceSection=this._toolbarElement.createChild("div","responsive-design-section responsive-design-section-device");deviceSection.createChild("div","responsive-design-section-decorator");var deviceElement=deviceSection.createChild("div","responsive-design-suite responsive-design-suite-top").createChild("div");var fieldsetElement=deviceElement.createChild("fieldset");fieldsetElement.createChild("label").textContent=WebInspector.UIString("Device");var deviceSelect=new WebInspector.DeviceSelect(createElementWithClass("button","responsive-design-icon responsive-design-icon-swap"),this._deviceModeSelected.bind(this));fieldsetElement.appendChild(deviceSelect.element);deviceSelect.element.classList.add("responsive-design-device-select");var detailsElement=deviceSection.createChild("div","responsive-design-suite");var screenElement=detailsElement.createChild("div","");fieldsetElement=screenElement.createChild("fieldset");var emulateResolutionCheckbox=WebInspector.SettingsUI.createSettingCheckbox("",WebInspector.overridesSupport.settings.emulateResolution,true,WebInspector.UIString("Emulate screen resolution"));themeCheckbox(emulateResolutionCheckbox);fieldsetElement.appendChild(emulateResolutionCheckbox);fieldsetElement.createChild("label").textContent=WebInspector.UIString("Screen");var resolutionFieldset=WebInspector.SettingsUI.createSettingFieldset(WebInspector.overridesSupport.settings.emulateResolution);fieldsetElement.appendChild(resolutionFieldset);resolutionFieldset.appendChild(WebInspector.SettingsUI.createSettingInputField("",WebInspector.overridesSupport.settings.deviceWidth,true,4,"3em",WebInspector.OverridesSupport.deviceSizeValidator,true,true,WebInspector.UIString("\u2013")));resolutionFieldset.createTextChild("\u00D7");resolutionFieldset.appendChild(WebInspector.SettingsUI.createSettingInputField("",WebInspector.overridesSupport.settings.deviceHeight,true,4,"3em",WebInspector.OverridesSupport.deviceSizeValidator,true,true,WebInspector.UIString("\u2013")));detailsElement.createChild("div","responsive-design-suite-separator");var dprElement=detailsElement.createChild("div","");var resolutionFieldset2=WebInspector.SettingsUI.createSettingFieldset(WebInspector.overridesSupport.settings.emulateResolution);dprElement.appendChild(resolutionFieldset2);var dprButton=resolutionFieldset2.createChild("div","responsive-design-icon responsive-design-icon-dpr");dprButton.title=WebInspector.UIString("Device pixel ratio");resolutionFieldset2.appendChild(WebInspector.SettingsUI.createSettingInputField("",WebInspector.overridesSupport.settings.deviceScaleFactor,true,4,"1.9em",WebInspector.OverridesSupport.deviceScaleFactorValidator,true,true,WebInspector.UIString("\u2013")));detailsElement.createChild("div","responsive-design-suite-separator");var fitToWindowElement=detailsElement.createChild("div","");fieldsetElement=fitToWindowElement.createChild("fieldset");var fitCheckbox=WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Zoom to fit"),WebInspector.overridesSupport.settings.deviceFitWindow,true,WebInspector.UIString("Zoom to fit available space"))
fieldsetElement.appendChild(fitCheckbox);themeCheckbox(fitCheckbox);function themeCheckbox(checkbox)
{checkbox.checkColor="rgb(255, 156, 0)";checkbox.backgroundColor="rgb(102, 102, 102)";checkbox.borderColor="rgb(45, 45, 45)";}},_createNetworkSection:function()
{var networkSection=this._toolbarElement.createChild("div","responsive-design-section responsive-design-section-network");networkSection.createChild("div","responsive-design-section-decorator");var networkLabel=networkSection.createChild("div","responsive-design-suite responsive-design-suite-top").createChild("div").createChild("label");networkLabel.textContent=WebInspector.UIString("Network");var showDrawerButton=networkSection.createChild("div","responsive-design-suite").createChild("a");showDrawerButton.textContent=WebInspector.UIString("Configure throttling");var action=WebInspector.actionRegistry.action("network.show-config");showDrawerButton.addEventListener("click",action.execute.bind(action));},_onToggleMediaInspectorButtonClick:function()
{this._showMediaQueryInspectorSetting.set(!this._toggleMediaInspectorButton.toggled());},_updateMediaQueryInspector:function()
{this._toggleMediaInspectorButton.setToggled(this._showMediaQueryInspectorSetting.get());if(this._mediaInspector.isShowing()===this._showMediaQueryInspectorSetting.get())
return;if(this._mediaInspector.isShowing())
this._mediaInspector.detach();else
this._mediaInspector.show(this._mediaInspectorContainer);this.onResize();},_updateMediaQueryInspectorButton:function(event)
{var count=(event.data);this._toggleMediaInspectorButton.setEnabled(!!count);this._toggleMediaInspectorButton.setTitle(!count?WebInspector.UIString("Media queries not found"):WebInspector.UIString((count===1?"%d media query found":"%d media queries found"),count));},_overridesWarningUpdated:function()
{var message=WebInspector.overridesSupport.warningMessage();if(!message){if(this._warningInfobar){this._warningInfobar.dispose();delete this._warningInfobar;}}
if(!this._warningInfobar){this._warningInfobar=WebInspector.Infobar.create(WebInspector.Infobar.Type.Warning,message,WebInspector.moduleSetting("disableOverridesWarning"));if(this._warningInfobar){this._warningInfobar.element.classList.add("responsive-design-warning");this._warningInfobar.setCloseCallback(WebInspector.overridesSupport.clearWarningMessage.bind(WebInspector.overridesSupport));this._canvasContainer.element.appendChild(this._warningInfobar.element);}}else{this._warningInfobar.setText(message);}},_showEmulationInDrawer:function()
{WebInspector.Revealer.reveal(WebInspector.overridesSupport);},_deviceModeSelected:function(device,mode)
{this._pageContainerSrcset="";if(device&&mode){var orientation=device.orientationByName(mode.orientation);this._deviceInsets=mode.insets;WebInspector.overridesSupport.settings.screenOrientationOverride.set(mode.orientation==WebInspector.EmulatedDevice.Horizontal?"landscapePrimary":"portraitPrimary");this._pageContainerSrcset=device.modeImage(mode);}else{this._deviceInsets=new Insets(0,0,0,0);WebInspector.overridesSupport.settings.screenOrientationOverride.set("");}
this.dispatchEventToListeners(WebInspector.OverridesSupport.PageResizer.Events.InsetsChanged,this._deviceInsets);},_viewportChanged:function(viewport)
{if(viewport){this._viewport=viewport;this._viewport.minimumPageScaleFactor=Math.max(0.1,this._viewport.minimumPageScaleFactor);this._viewport.minimumPageScaleFactor=Math.min(this._viewport.minimumPageScaleFactor,this._viewport.pageScaleFactor);this._viewport.maximumPageScaleFactor=Math.min(10,this._viewport.maximumPageScaleFactor);this._viewport.maximumPageScaleFactor=Math.max(this._viewport.maximumPageScaleFactor,this._viewport.pageScaleFactor);this._viewportChangedThrottler.schedule(this._updateUIThrottled.bind(this));}},_updateUIThrottled:function()
{this._updateUI();return Promise.resolve();},_pageScaleButtonClicked:function(increase,event)
{this._pageScaleFactorThrottler.schedule(updatePageScaleFactor.bind(this));function updatePageScaleFactor()
{if(this._target&&this._viewport){var value=this._viewport.pageScaleFactor;value=increase?value*1.1:value/1.1;value=Math.min(this._viewport.maximumPageScaleFactor,value);value=Math.max(this._viewport.minimumPageScaleFactor,value);this._target.emulationAgent().setPageScaleFactor(value);}
return Promise.resolve();}},_resetPageScale:function()
{this._pageScaleFactorThrottler.schedule(updatePageScaleFactor.bind(this));function updatePageScaleFactor()
{if(this._target&&this._viewport&&this._viewport.minimumPageScaleFactor<=1&&this._viewport.maximumPageScaleFactor>=1)
this._target.emulationAgent().setPageScaleFactor(1);return Promise.resolve();}},__proto__:WebInspector.VBox.prototype};WebInspector.EmulationDispatcher=function(responsiveDesignView)
{this._responsiveDesignView=responsiveDesignView;}
WebInspector.EmulationDispatcher.prototype={viewportChanged:function(viewport)
{this._responsiveDesignView._viewportChanged(viewport);}};WebInspector.OverridesView=function()
{WebInspector.VBox.call(this);this.setMinimumSize(0,30);this.registerRequiredCSS("emulation/overrides.css");this.element.classList.add("overrides-view");this._deviceElement=this._createDeviceElement();this._splashScreenElement=this.element.createChild("div","overrides-splash-screen");this._splashScreenElement.appendChild(createTextButton(WebInspector.UIString("Enable emulation"),this._toggleEmulationEnabled.bind(this),"overrides-enable-button"));this._unavailableSplashScreenElement=this.element.createChild("div","overrides-splash-screen");this._unavailableSplashScreenElement.createTextChild(WebInspector.UIString("Emulation is not available."));this._warningFooter=this.element.createChild("div","overrides-footer");this._overridesWarningUpdated();WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.OverridesWarningUpdated,this._overridesWarningUpdated,this);WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.EmulationStateChanged,this._emulationStateChanged,this);this._emulationStateChanged();}
WebInspector.OverridesView.prototype={_createDeviceElement:function()
{var container=this.element.createChild("div","overrides-device");var disableButtonElement=createTextButton(WebInspector.UIString("Disable emulation"),this._toggleEmulationEnabled.bind(this),"overrides-disable-button");disableButtonElement.id="overrides-disable-button";container.appendChild(disableButtonElement);var fieldsetElement=container.createChild("fieldset");fieldsetElement.id="metrics-override-section";var deviceModelElement=fieldsetElement.createChild("p","overrides-device-model-section");deviceModelElement.createChild("span").textContent=WebInspector.UIString("Device:");var rotateButton=createElement("button");rotateButton.textContent=" \u21C4 ";var deviceSelect=new WebInspector.DeviceSelect(rotateButton,null);deviceModelElement.appendChild(deviceSelect.element);var deviceModelFieldset=fieldsetElement.createChild("fieldset","overrides-device-model-settings");var emulateResolutionCheckbox=WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Emulate screen resolution"),WebInspector.overridesSupport.settings.emulateResolution,true);deviceModelFieldset.appendChild(emulateResolutionCheckbox);var resolutionFieldset=WebInspector.SettingsUI.createSettingFieldset(WebInspector.overridesSupport.settings.emulateResolution);deviceModelFieldset.appendChild(resolutionFieldset);var tableElement=resolutionFieldset.createChild("table");var rowElement=tableElement.createChild("tr");var cellElement=rowElement.createChild("td");cellElement.createTextChild(WebInspector.UIString("Resolution:"));cellElement=rowElement.createChild("td");var widthOverrideInput=WebInspector.SettingsUI.createSettingInputField("",WebInspector.overridesSupport.settings.deviceWidth,true,4,"80px",WebInspector.OverridesSupport.deviceSizeValidator,true,true,WebInspector.UIString("\u2013"));cellElement.appendChild(widthOverrideInput);var heightOverrideInput=WebInspector.SettingsUI.createSettingInputField("",WebInspector.overridesSupport.settings.deviceHeight,true,4,"80px",WebInspector.OverridesSupport.deviceSizeValidator,true,true,WebInspector.UIString("\u2013"));cellElement.appendChild(heightOverrideInput);rowElement=tableElement.createChild("tr");cellElement=rowElement.createChild("td");cellElement.colSpan=4;rowElement=tableElement.createChild("tr");rowElement.title=WebInspector.UIString("Ratio between a device's physical pixels and device-independent pixels");rowElement.createChild("td").createTextChild(WebInspector.UIString("Device pixel ratio:"));rowElement.createChild("td").appendChild(WebInspector.SettingsUI.createSettingInputField("",WebInspector.overridesSupport.settings.deviceScaleFactor,true,4,"80px",WebInspector.OverridesSupport.deviceScaleFactorValidator,true,true,WebInspector.UIString("\u2013")));var mobileCheckbox=WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Emulate mobile"),WebInspector.overridesSupport.settings.emulateMobile,true);mobileCheckbox.title=WebInspector.UIString("Enable meta viewport, overlay scrollbars, text autosizing and default 980px body width");deviceModelFieldset.appendChild(mobileCheckbox);deviceModelFieldset.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Emulate touch screen"),WebInspector.overridesSupport.settings.emulateTouch,true));var resetButtonElement=createTextButton(WebInspector.UIString("Reset"),WebInspector.overridesSupport.reset.bind(WebInspector.overridesSupport));resetButtonElement.id="overrides-reset-button";deviceModelFieldset.appendChild(resetButtonElement);fieldsetElement.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Shrink to fit"),WebInspector.overridesSupport.settings.deviceFitWindow,true));var footnote=container.createChild("p","help-footnote");footnote.appendChild(WebInspector.linkifyDocumentationURLAsNode("iterate/device-mode/",WebInspector.UIString("More information about screen emulation")));return container;},_overridesWarningUpdated:function()
{var message=WebInspector.overridesSupport.warningMessage();this._warningFooter.classList.toggle("hidden",!message);this._warningFooter.textContent=message;},_toggleEmulationEnabled:function()
{WebInspector.overridesSupport.setEmulationEnabled(!WebInspector.overridesSupport.emulationEnabled());},_emulationStateChanged:function()
{this._unavailableSplashScreenElement.classList.toggle("hidden",WebInspector.overridesSupport.canEmulate());this._deviceElement.classList.toggle("hidden",!WebInspector.overridesSupport.emulationEnabled());this._splashScreenElement.classList.toggle("hidden",WebInspector.overridesSupport.emulationEnabled()||!WebInspector.overridesSupport.canEmulate());},__proto__:WebInspector.VBox.prototype}
WebInspector.OverridesView.Revealer=function()
{}
WebInspector.OverridesView.Revealer.prototype={reveal:function(overridesSupport)
{WebInspector.inspectorView.showViewInDrawer("emulation");return Promise.resolve();}};WebInspector.SensorsView=function()
{WebInspector.VBox.call(this,true);this.registerRequiredCSS("emulation/sensors.css");this.contentElement.classList.add("sensors-view");this._appendGeolocationOverrideControl();this._appendDeviceOrientationOverrideControl();}
WebInspector.SensorsView.prototype={_appendGeolocationOverrideControl:function()
{const geolocationSetting=WebInspector.overridesSupport.settings.geolocationOverride.get();var geolocation=WebInspector.OverridesSupport.GeolocationPosition.parseSetting(geolocationSetting);var checkboxLabel=createCheckboxLabel(WebInspector.UIString("Emulate geolocation coordinates"));this._geolocationOverrideCheckbox=checkboxLabel.checkboxElement;this._geolocationOverrideCheckbox.addEventListener("click",this._geolocationOverrideCheckboxClicked.bind(this));this.contentElement.appendChild(checkboxLabel);this._geolocationFieldset=this._createGeolocationOverrideElement(geolocation);this._geolocationFieldset.disabled=true;this.contentElement.appendChild(this._geolocationFieldset);},_geolocationOverrideCheckboxClicked:function()
{var enabled=this._geolocationOverrideCheckbox.checked;WebInspector.overridesSupport.setGeolocationOverrideEnabled(enabled);if(enabled&&!this._latitudeElement.value)
this._latitudeElement.focus();this._geolocationFieldset.disabled=!enabled;},_applyGeolocationUserInput:function()
{this._setGeolocationPosition(WebInspector.OverridesSupport.GeolocationPosition.parseUserInput(this._latitudeElement.value.trim(),this._longitudeElement.value.trim(),this._geolocationErrorElement.checked),true);},_setGeolocationPosition:function(geolocation,userInputModified)
{if(!geolocation)
return;if(!userInputModified){this._latitudeElement.value=geolocation.latitude;this._longitudeElement.value=geolocation.longitude;}
var value=geolocation.toSetting();WebInspector.overridesSupport.settings.geolocationOverride.set(value);},_createGeolocationOverrideElement:function(geolocation)
{var fieldsetElement=createElement("fieldset");fieldsetElement.id="geolocation-override-section";var tableElement=fieldsetElement.createChild("table");var rowElement=tableElement.createChild("tr");var cellElement=rowElement.createChild("td");cellElement=rowElement.createChild("td");cellElement.createTextChild(WebInspector.UIString("Lat = "));this._latitudeElement=WebInspector.SettingsUI.createInput(cellElement,"geolocation-override-latitude",String(geolocation.latitude),this._applyGeolocationUserInput.bind(this),true);cellElement.createTextChild(" , ");cellElement.createTextChild(WebInspector.UIString("Lon = "));this._longitudeElement=WebInspector.SettingsUI.createInput(cellElement,"geolocation-override-longitude",String(geolocation.longitude),this._applyGeolocationUserInput.bind(this),true);rowElement=tableElement.createChild("tr");cellElement=rowElement.createChild("td");cellElement.colSpan=2;var geolocationErrorLabelElement=createCheckboxLabel(WebInspector.UIString("Emulate position unavailable"),!geolocation||!!geolocation.error);var geolocationErrorCheckboxElement=geolocationErrorLabelElement.checkboxElement;geolocationErrorCheckboxElement.id="geolocation-error";geolocationErrorCheckboxElement.addEventListener("click",this._applyGeolocationUserInput.bind(this),false);this._geolocationErrorElement=geolocationErrorCheckboxElement;cellElement.appendChild(geolocationErrorLabelElement);return fieldsetElement;},_appendDeviceOrientationOverrideControl:function()
{const deviceOrientationSetting=WebInspector.overridesSupport.settings.deviceOrientationOverride.get();var deviceOrientation=WebInspector.OverridesSupport.DeviceOrientation.parseSetting(deviceOrientationSetting);var checkboxLabel=createCheckboxLabel(WebInspector.UIString("Emulate accelerometer"));this._overrideDeviceOrientationCheckbox=checkboxLabel.checkboxElement;this._overrideDeviceOrientationCheckbox.addEventListener("click",this._deviceOrientationOverrideCheckboxClicked.bind(this));this.contentElement.appendChild(checkboxLabel);this._deviceOrientationFieldset=this._createDeviceOrientationOverrideElement(deviceOrientation);this._deviceOrientationFieldset.disabled=true;this.contentElement.appendChild(this._deviceOrientationFieldset);},_deviceOrientationOverrideCheckboxClicked:function()
{var enabled=this._overrideDeviceOrientationCheckbox.checked;WebInspector.overridesSupport.setDeviceOrientationOverrideEnabled(enabled);if(enabled&&!this._alphaElement.value)
this._alphaElement.focus();this._deviceOrientationFieldset.disabled=!enabled;},_applyDeviceOrientationUserInput:function()
{this._setDeviceOrientation(WebInspector.OverridesSupport.DeviceOrientation.parseUserInput(this._alphaElement.value.trim(),this._betaElement.value.trim(),this._gammaElement.value.trim()),WebInspector.SensorsView.DeviceOrientationModificationSource.UserInput);},_resetDeviceOrientation:function()
{this._setDeviceOrientation(new WebInspector.OverridesSupport.DeviceOrientation(0,0,0),WebInspector.SensorsView.DeviceOrientationModificationSource.ResetButton);},_setDeviceOrientation:function(deviceOrientation,modificationSource)
{if(!deviceOrientation)
return;if(modificationSource!=WebInspector.SensorsView.DeviceOrientationModificationSource.UserInput){this._alphaElement.value=deviceOrientation.alpha;this._betaElement.value=deviceOrientation.beta;this._gammaElement.value=deviceOrientation.gamma;}
if(modificationSource!=WebInspector.SensorsView.DeviceOrientationModificationSource.UserDrag)
this._setBoxOrientation(deviceOrientation);var value=deviceOrientation.toSetting();WebInspector.overridesSupport.settings.deviceOrientationOverride.set(value);},_createAxisInput:function(parentElement,id,label,defaultText)
{var div=parentElement.createChild("div","accelerometer-axis-input-container");div.createTextChild(label);return WebInspector.SettingsUI.createInput(div,id,defaultText,this._applyDeviceOrientationUserInput.bind(this),true);},_createDeviceOrientationOverrideElement:function(deviceOrientation)
{var fieldsetElement=createElement("fieldset");fieldsetElement.classList.add("device-orientation-override-section");var tableElement=fieldsetElement.createChild("table");var rowElement=tableElement.createChild("tr");var cellElement=rowElement.createChild("td","accelerometer-inputs-cell");this._alphaElement=this._createAxisInput(cellElement,"device-orientation-override-alpha","\u03B1: ",String(deviceOrientation.alpha));this._betaElement=this._createAxisInput(cellElement,"device-orientation-override-beta","\u03B2: ",String(deviceOrientation.beta));this._gammaElement=this._createAxisInput(cellElement,"device-orientation-override-gamma","\u03B3: ",String(deviceOrientation.gamma));cellElement.appendChild(createTextButton(WebInspector.UIString("Reset"),this._resetDeviceOrientation.bind(this),"accelerometer-reset-button"));this._stageElement=rowElement.createChild("td","accelerometer-stage");this._boxElement=this._stageElement.createChild("section","accelerometer-box");this._boxElement.createChild("section","front");this._boxElement.createChild("section","top");this._boxElement.createChild("section","back");this._boxElement.createChild("section","left");this._boxElement.createChild("section","right");this._boxElement.createChild("section","bottom");WebInspector.installDragHandle(this._stageElement,this._onBoxDragStart.bind(this),this._onBoxDrag.bind(this),this._onBoxDragEnd.bind(this),"move");this._setBoxOrientation(deviceOrientation);return fieldsetElement;},_setBoxOrientation:function(deviceOrientation)
{var matrix=new WebKitCSSMatrix();this._boxMatrix=matrix.rotate(-deviceOrientation.beta,deviceOrientation.gamma,-deviceOrientation.alpha);this._boxElement.style.webkitTransform=this._boxMatrix.toString();},_onBoxDrag:function(event)
{var mouseMoveVector=this._calculateRadiusVector(event.x,event.y);if(!mouseMoveVector)
return true;event.consume(true);var axis=WebInspector.Geometry.crossProduct(this._mouseDownVector,mouseMoveVector);axis.normalize();var angle=WebInspector.Geometry.calculateAngle(this._mouseDownVector,mouseMoveVector);var matrix=new WebKitCSSMatrix();var rotationMatrix=matrix.rotateAxisAngle(axis.x,axis.y,axis.z,angle);this._currentMatrix=rotationMatrix.multiply(this._boxMatrix);this._boxElement.style.webkitTransform=this._currentMatrix;var eulerAngles=WebInspector.Geometry.EulerAngles.fromRotationMatrix(this._currentMatrix);var newOrientation=new WebInspector.OverridesSupport.DeviceOrientation(-eulerAngles.alpha,-eulerAngles.beta,eulerAngles.gamma);this._setDeviceOrientation(newOrientation,WebInspector.SensorsView.DeviceOrientationModificationSource.UserDrag);return false;},_onBoxDragStart:function(event)
{if(!this._overrideDeviceOrientationCheckbox.checked)
return false;this._mouseDownVector=this._calculateRadiusVector(event.x,event.y);if(!this._mouseDownVector)
return false;event.consume(true);return true;},_onBoxDragEnd:function()
{this._boxMatrix=this._currentMatrix;},_calculateRadiusVector:function(x,y)
{var rect=this._stageElement.getBoundingClientRect();var radius=Math.max(rect.width,rect.height)/2;var sphereX=(x-rect.left-rect.width/2)/radius;var sphereY=(y-rect.top-rect.height/2)/radius;var sqrSum=sphereX*sphereX+sphereY*sphereY;if(sqrSum>0.5)
return new WebInspector.Geometry.Vector(sphereX,sphereY,0.5/Math.sqrt(sqrSum));return new WebInspector.Geometry.Vector(sphereX,sphereY,Math.sqrt(1-sqrSum));},__proto__:WebInspector.VBox.prototype}
WebInspector.SensorsView.DeviceOrientationModificationSource={UserInput:"userInput",UserDrag:"userDrag",ResetButton:"resetButton"}
WebInspector.SensorsView.instance=function()
{if(!WebInspector.SensorsView._instanceObject)
WebInspector.SensorsView._instanceObject=new WebInspector.SensorsView();return WebInspector.SensorsView._instanceObject;}
WebInspector.SensorsView.ShowActionDelegate=function()
{}
WebInspector.SensorsView.ShowActionDelegate.prototype={handleAction:function(context,actionId)
{WebInspector.inspectorView.showViewInDrawer("sensors");return true;}};WebInspector.DeviceModeModel=function(updateCallback)
{this._updateCallback=updateCallback;this._screenRect=new WebInspector.Rect(0,0,1,1);this._visiblePageRect=new WebInspector.Rect(0,0,1,1);this._availableSize=new Size(1,1);this._preferredSize=new Size(1,1);this._deviceMetricsThrottler=new WebInspector.Throttler(0);this._appliedDeviceSize=new Size(1,1);this._currentDeviceScaleFactor=window.devicePixelRatio;this._appliedDeviceScaleFactor=0;this._scaleSetting=WebInspector.settings.createSetting("emulation.deviceScale",1);this._scaleSetting.addChangeListener(this._scaleSettingChanged,this);if(!this._scaleSetting.get())
this._scaleSetting.set(1);this._widthSetting=WebInspector.settings.createSetting("emulation.deviceWidth",400);this._widthSetting.addChangeListener(this._widthSettingChanged,this);this._heightSetting=WebInspector.settings.createSetting("emulation.deviceHeight",0);this._heightSetting.addChangeListener(this._heightSettingChanged,this);this._uaSetting=WebInspector.settings.createSetting("emulation.deviceUA",WebInspector.DeviceModeModel.UA.Mobile);this._uaSetting.addChangeListener(this._uaSettingChanged,this);this._deviceScaleFactorSetting=WebInspector.settings.createSetting("emulation.deviceScaleFactor",0);this._deviceScaleFactorSetting.addChangeListener(this._deviceScaleFactorSettingChanged,this);this._type=WebInspector.DeviceModeModel.Type.None;this._device=null;this._mode=null;this._touchEnabled=false;this._touchConfiguration="";this._screenOrientation="";this._fitScale=1;this._target=null;WebInspector.targetManager.observeTargets(this,WebInspector.Target.Type.Page);}
WebInspector.DeviceModeModel.Type={None:"None",Responsive:"Responsive",Device:"Device"}
WebInspector.DeviceModeModel.UA={Mobile:"Mobile",Desktop:"Desktop",DesktopTouch:"DesktopTouch"}
WebInspector.DeviceModeModel.MaxDeviceSize=10000;WebInspector.DeviceModeModel.deviceSizeValidator=function(value)
{if(/^[\d]+$/.test(value)&&value>0&&value<=WebInspector.DeviceModeModel.MaxDeviceSize)
return"";return WebInspector.UIString("Value must be positive integer");}
WebInspector.DeviceModeModel._touchEventsScriptIdSymbol=Symbol("DeviceModeModel.touchEventsScriptIdSymbol");WebInspector.DeviceModeModel._defaultMobileUserAgent="Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36";WebInspector.DeviceModeModel._defaultMobileScaleFactor=2;WebInspector.DeviceModeModel.prototype={setAvailableSize:function(availableSize,preferredSize)
{this._availableSize=availableSize;this._preferredSize=preferredSize;this._calculateAndEmulate(false);},emulate:function(type,device,mode)
{this._type=type;if(type===WebInspector.DeviceModeModel.Type.Device){console.assert(device&&mode,"Must pass device and mode for device emulation");this._device=device;this._mode=mode;}else{this._device=null;this._mode=null;}
if(type!==WebInspector.DeviceModeModel.Type.None)
WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.DeviceModeEnabled);this._calculateAndEmulate(true);},device:function()
{return this._device;},mode:function()
{return this._mode;},type:function()
{return this._type;},screenImage:function()
{return(this._device&&this._mode)?this._device.modeImage(this._mode):"";},screenRect:function()
{return this._screenRect;},visiblePageRect:function()
{return this._visiblePageRect;},scale:function()
{return this._scale;},fitScale:function()
{return this._fitScale;},appliedDeviceSize:function()
{return this._appliedDeviceSize;},appliedDeviceScaleFactor:function()
{return this._appliedDeviceScaleFactor;},scaleSetting:function()
{return this._scaleSetting;},widthSetting:function()
{return this._widthSetting;},heightSetting:function()
{return this._heightSetting;},uaSetting:function()
{return this._uaSetting;},deviceScaleFactorSetting:function()
{return this._deviceScaleFactorSetting;},defaultDeviceScaleFactor:function()
{if(this._type===WebInspector.DeviceModeModel.Type.Responsive)
return this._uaSetting.get()===WebInspector.DeviceModeModel.UA.Mobile?WebInspector.DeviceModeModel._defaultMobileScaleFactor:this._currentDeviceScaleFactor;else if(this._type===WebInspector.DeviceModeModel.Type.Device)
return this._device.deviceScaleFactor;else
return this._currentDeviceScaleFactor;},reset:function()
{this._deviceScaleFactorSetting.set(0);this._scaleSetting.set(1);this._widthSetting.set(400);this._heightSetting.set(0);this._uaSetting.set(WebInspector.DeviceModeModel.UA.Mobile);},targetAdded:function(target)
{if(!this._target){this._target=target;var domModel=WebInspector.DOMModel.fromTarget(this._target);domModel.addEventListener(WebInspector.DOMModel.Events.InspectModeWillBeToggled,this._inspectModeWillBeToggled,this);}},_inspectModeWillBeToggled:function(event)
{var inspectModeEnabled=(event.data);if(inspectModeEnabled){this._applyTouch(false,false);return;}
if(this._type===WebInspector.DeviceModeModel.Type.Device)
this._applyTouch(this._device.touch(),this._device.mobile());else if(this._type===WebInspector.DeviceModeModel.Type.None)
this._applyTouch(false,false);else if(this._type===WebInspector.DeviceModeModel.Type.Responsive)
this._applyTouch(this._uaSetting.get()!==WebInspector.DeviceModeModel.UA.Desktop,this._uaSetting.get()===WebInspector.DeviceModeModel.UA.Mobile);},targetRemoved:function(target)
{if(this._target===target)
this._target=null;},_scaleSettingChanged:function()
{this._calculateAndEmulate(true);},_widthSettingChanged:function()
{this._calculateAndEmulate(false);},_heightSettingChanged:function()
{this._calculateAndEmulate(false);},_uaSettingChanged:function()
{this._calculateAndEmulate(true);},_deviceScaleFactorSettingChanged:function()
{this._calculateAndEmulate(false);},_calculateAndEmulate:function(resetScrollAndPageScale)
{if(this._type===WebInspector.DeviceModeModel.Type.Device){var orientation=this._device.orientationByName(this._mode.orientation);var screenWidth=orientation.width;var screenHeight=orientation.height;this._applyDeviceMetrics(new Size(screenWidth,screenHeight),this._mode.insets,this._scaleSetting.get(),this._device.deviceScaleFactor,this._device.mobile(),resetScrollAndPageScale);this._applyUserAgent(this._device.userAgent);this._applyTouch(this._device.touch(),this._device.mobile());this._applyScreenOrientation(this._mode.orientation==WebInspector.EmulatedDevice.Horizontal?"landscapePrimary":"portraitPrimary");}else if(this._type===WebInspector.DeviceModeModel.Type.None){this._applyDeviceMetrics(this._availableSize,new Insets(0,0,0,0),1,0,false,resetScrollAndPageScale);this._applyUserAgent("");this._applyTouch(false,false);this._applyScreenOrientation("");}else if(this._type===WebInspector.DeviceModeModel.Type.Responsive){var screenWidth=this._widthSetting.get()||this._preferredSize.width/(this._scaleSetting.get()||1);var screenHeight=this._heightSetting.get()||this._preferredSize.height/(this._scaleSetting.get()||1);var mobile=this._uaSetting.get()===WebInspector.DeviceModeModel.UA.Mobile;var defaultDeviceScaleFactor=mobile?WebInspector.DeviceModeModel._defaultMobileScaleFactor:0;this._applyDeviceMetrics(new Size(screenWidth,screenHeight),new Insets(0,0,0,0),this._scaleSetting.get(),this._deviceScaleFactorSetting.get()||defaultDeviceScaleFactor,mobile,resetScrollAndPageScale);this._applyUserAgent(mobile?WebInspector.DeviceModeModel._defaultMobileUserAgent:"");this._applyTouch(this._uaSetting.get()!==WebInspector.DeviceModeModel.UA.Desktop,mobile);this._applyScreenOrientation(screenHeight>=screenWidth?"portraitPrimary":"landscapePrimary");}
this._updateCallback.call(null);},_calculateFitScale:function(screenWidth,screenHeight)
{var scale=Math.min(screenWidth?this._preferredSize.width/screenWidth:1,screenHeight?this._preferredSize.height/screenHeight:1);return Math.min(scale,1);},_applyUserAgent:function(userAgent)
{WebInspector.multitargetNetworkManager.setUserAgentOverride(userAgent);},_applyDeviceMetrics:function(screenSize,insets,scale,deviceScaleFactor,mobile,resetScrollAndPageScale)
{screenSize.width=Math.max(1,Math.floor(screenSize.width));screenSize.height=Math.max(1,Math.floor(screenSize.height));this._fitScale=this._calculateFitScale(screenSize.width,screenSize.height);var pageWidth=screenSize.width-insets.left-insets.right;var pageHeight=screenSize.height-insets.top-insets.bottom;var positionX=insets.left;var positionY=insets.top;this._appliedDeviceSize=screenSize;this._screenRect=new WebInspector.Rect(Math.max(0,(this._availableSize.width-screenSize.width*scale)/2),0,screenSize.width*scale,screenSize.height*scale);this._visiblePageRect=new WebInspector.Rect(positionX*scale,positionY*scale,Math.min(pageWidth*scale,this._availableSize.width-this._screenRect.left-positionX*scale),Math.min(pageHeight*scale,this._availableSize.height-this._screenRect.top-positionY*scale));this._scale=scale;this._appliedDeviceScaleFactor=deviceScaleFactor;if(scale===1&&this._availableSize.width>=screenSize.width&&this._availableSize.height>=screenSize.height){pageWidth=0;pageHeight=0;}
this._deviceMetricsThrottler.schedule(setDeviceMetricsOverride.bind(this));function setDeviceMetricsOverride()
{if(!this._target)
return Promise.resolve();var clear=!pageWidth&&!pageHeight&&!mobile&&!deviceScaleFactor&&scale===1;var setDevicePromise=clear?this._target.emulationAgent().clearDeviceMetricsOverride(this._deviceMetricsOverrideAppliedForTest.bind(this)):this._target.emulationAgent().setDeviceMetricsOverride(pageWidth,pageHeight,deviceScaleFactor,mobile,false,scale,0,0,screenSize.width,screenSize.height,positionX,positionY,this._deviceMetricsOverrideAppliedForTest.bind(this));var allPromises=[setDevicePromise];if(resetScrollAndPageScale)
allPromises.push(this._target.emulationAgent().resetScrollAndPageScaleFactor());return Promise.all(allPromises);}},_deviceMetricsOverrideAppliedForTest:function()
{},_applyTouch:function(touchEnabled,mobile)
{var configuration=mobile?"mobile":"desktop";if(!this._target||(this._touchEnabled===touchEnabled&&this._touchConfiguration===configuration))
return;var target=this._target;const injectedFunction=function(){const touchEvents=["ontouchstart","ontouchend","ontouchmove","ontouchcancel"];var recepients=[window.__proto__,document.__proto__];for(var i=0;i<touchEvents.length;++i){for(var j=0;j<recepients.length;++j){if(!(touchEvents[i]in recepients[j]))
Object.defineProperty(recepients[j],touchEvents[i],{value:null,writable:true,configurable:true,enumerable:true});}}};var symbol=WebInspector.DeviceModeModel._touchEventsScriptIdSymbol;if(typeof target[symbol]!=="undefined"){target.pageAgent().removeScriptToEvaluateOnLoad(target[symbol]);delete target[symbol];}
if(touchEnabled)
target.pageAgent().addScriptToEvaluateOnLoad("("+injectedFunction.toString()+")()",scriptAddedCallback);function scriptAddedCallback(error,scriptId)
{if(error)
delete target[symbol];else
target[symbol]=scriptId;}
target.emulationAgent().setTouchEmulationEnabled(touchEnabled,configuration);this._touchEnabled=touchEnabled;this._touchConfiguration=configuration;},_applyScreenOrientation:function(orientation)
{if(!this._target||orientation===this._screenOrientation)
return;this._screenOrientation=orientation;if(!this._screenOrientation)
this._target.screenOrientationAgent().clearScreenOrientationOverride();else
this._target.screenOrientationAgent().setScreenOrientationOverride(this._screenOrientation==="landscapePrimary"?90:0,(this._screenOrientation));}};WebInspector.DeviceModeView=function()
{WebInspector.VBox.call(this,true);this.setMinimumSize(150,150);this.element.classList.add("device-mode-view");this.registerRequiredCSS("emulation/deviceModeView.css");WebInspector.Tooltip.addNativeOverrideContainer(this.contentElement);this._model=new WebInspector.DeviceModeModel(this._updateUI.bind(this));this._mediaInspector=new WebInspector.MediaQueryInspector(this._model.widthSetting());this._showMediaInspectorSetting=WebInspector.settings.createSetting("showMediaQueryInspector",false);this._showMediaInspectorSetting.addChangeListener(this._updateUI,this);this._showRulersSetting=WebInspector.settings.createSetting("emulation.showRulers",false);this._showRulersSetting.addChangeListener(this._updateUI,this);this._topRuler=new WebInspector.DeviceModeView.Ruler(true,this._model.widthSetting().set.bind(this._model.widthSetting()));this._topRuler.element.classList.add("device-mode-ruler-top");this._leftRuler=new WebInspector.DeviceModeView.Ruler(false,this._model.heightSetting().set.bind(this._model.heightSetting()));this._leftRuler.element.classList.add("device-mode-ruler-left");this._createUI();WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged,this._updateUI,this);};WebInspector.DeviceModeView.prototype={_createUI:function()
{this._toolbar=new WebInspector.DeviceModeView.Toolbar(this._model,this._showMediaInspectorSetting,this._showRulersSetting);this.contentElement.appendChild(this._toolbar.element());this._contentClip=this.contentElement.createChild("div","device-mode-content-clip vbox");this._mediaInspectorContainer=this._contentClip.createChild("div","device-mode-media-container");this._contentArea=this._contentClip.createChild("div","device-mode-content-area");this._screenArea=this._contentArea.createChild("div","device-mode-screen-area");this._screenImage=this._screenArea.createChild("img","device-mode-screen-image hidden");this._screenImage.addEventListener("load",this._onScreenImageLoaded.bind(this,true),false);this._screenImage.addEventListener("error",this._onScreenImageLoaded.bind(this,false),false);this._cornerResizerElement=this._screenArea.createChild("div","device-mode-resizer device-mode-corner-resizer");this._cornerResizerElement.createChild("div","");this._createResizer(this._cornerResizerElement,true,true);this._widthResizerElement=this._screenArea.createChild("div","device-mode-resizer device-mode-width-resizer");this._widthResizerElement.createChild("div","");this._createResizer(this._widthResizerElement,true,false);this._heightResizerElement=this._screenArea.createChild("div","device-mode-resizer device-mode-height-resizer");this._heightResizerElement.createChild("div","");this._createResizer(this._heightResizerElement,false,true);this._heightResizerElement.addEventListener("dblclick",this._model.heightSetting().set.bind(this._model.heightSetting(),0),false);this._pageArea=this._screenArea.createChild("div","device-mode-page-area");this._pageArea.createChild("content");},toggleDeviceMode:function()
{this._toolbar.toggleDeviceMode();},_createResizer:function(element,width,height)
{var resizer=new WebInspector.ResizerWidget();resizer.addElement(element);resizer.setCursor(width&&height?"nwse-resize":(width?"ew-resize":"ns-resize"));resizer.addEventListener(WebInspector.ResizerWidget.Events.ResizeStart,this._onResizeStart,this);resizer.addEventListener(WebInspector.ResizerWidget.Events.ResizeUpdate,this._onResizeUpdate.bind(this,width,height));resizer.addEventListener(WebInspector.ResizerWidget.Events.ResizeEnd,this._onResizeEnd,this);return resizer;},_onResizeStart:function(event)
{this._slowPositionStart=null;this._resizeStart=this._model.screenRect().size();},_onResizeUpdate:function(width,height,event)
{if(event.data.shiftKey!==!!this._slowPositionStart)
this._slowPositionStart=event.data.shiftKey?{x:event.data.currentX,y:event.data.currentY}:null;var cssOffsetX=event.data.currentX-event.data.startX;var cssOffsetY=event.data.currentY-event.data.startY;if(this._slowPositionStart){cssOffsetX=(event.data.currentX-this._slowPositionStart.x)/10+this._slowPositionStart.x-event.data.startX;cssOffsetY=(event.data.currentY-this._slowPositionStart.y)/10+this._slowPositionStart.y-event.data.startY;}
if(width){var dipOffsetX=cssOffsetX*WebInspector.zoomManager.zoomFactor();var newWidth=this._resizeStart.width+dipOffsetX*2;newWidth=Math.round(newWidth/this._model.scale());newWidth=Math.max(Math.min(newWidth,WebInspector.DeviceModeModel.MaxDeviceSize),1);this._model.widthSetting().set(newWidth);}
if(height){var dipOffsetY=cssOffsetY*WebInspector.zoomManager.zoomFactor();var newHeight=this._resizeStart.height+dipOffsetY;newHeight=Math.round(newHeight/this._model.scale());newHeight=Math.max(Math.min(newHeight,WebInspector.DeviceModeModel.MaxDeviceSize),1);this._model.heightSetting().set(newHeight);}},_onResizeEnd:function(event)
{delete this._resizeStart;WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.ResizedViewInResponsiveMode);},_resizeTo:function(width,height)
{this._model.widthSetting().set(width);this._model.heightSetting().set(height);},_updateUI:function()
{if(!this.isShowing())
return;var zoomFactor=WebInspector.zoomManager.zoomFactor();var callDoResize=false;var showRulers=this._showRulersSetting.get()&&this._model.type()!==WebInspector.DeviceModeModel.Type.None;var contentAreaResized=false;var updateRulers=false;var cssScreenRect=this._model.screenRect().scale(1/zoomFactor);if(!cssScreenRect.isEqual(this._cachedCssScreenRect)){this._screenArea.style.left=cssScreenRect.left+"px";this._screenArea.style.top=cssScreenRect.top+"px";this._screenArea.style.width=cssScreenRect.width+"px";this._screenArea.style.height=cssScreenRect.height+"px";this._leftRuler.element.style.left=cssScreenRect.left+"px";updateRulers=true;callDoResize=true;this._cachedCssScreenRect=cssScreenRect;}
var cssVisiblePageRect=this._model.visiblePageRect().scale(1/zoomFactor);if(!cssVisiblePageRect.isEqual(this._cachedCssVisiblePageRect)){this._pageArea.style.left=cssVisiblePageRect.left+"px";this._pageArea.style.top=cssVisiblePageRect.top+"px";this._pageArea.style.width=cssVisiblePageRect.width+"px";this._pageArea.style.height=cssVisiblePageRect.height+"px";callDoResize=true;this._cachedCssVisiblePageRect=cssVisiblePageRect;}
var resizable=this._model.type()===WebInspector.DeviceModeModel.Type.Responsive;if(resizable!==this._cachedResizable){this._widthResizerElement.classList.toggle("hidden",!resizable);this._heightResizerElement.classList.toggle("hidden",!resizable);this._cornerResizerElement.classList.toggle("hidden",!resizable);this._cachedResizable=resizable;}
var mediaInspectorVisible=this._showMediaInspectorSetting.get()&&this._model.type()!==WebInspector.DeviceModeModel.Type.None;if(mediaInspectorVisible!==this._cachedMediaInspectorVisible){if(mediaInspectorVisible)
this._mediaInspector.show(this._mediaInspectorContainer);else
this._mediaInspector.detach();contentAreaResized=true;callDoResize=true;this._cachedMediaInspectorVisible=mediaInspectorVisible;}
if(showRulers!==this._cachedShowRulers){this._contentArea.classList.toggle("device-mode-rulers-visible",showRulers);if(showRulers){this._topRuler.show(this._contentClip,this._contentArea);this._leftRuler.show(this._contentArea);}else{this._topRuler.detach();this._leftRuler.detach();}
contentAreaResized=true;callDoResize=true;this._cachedShowRulers=showRulers;}
if(this._model.scale()!==this._cachedScale){updateRulers=true;this._cachedScale=this._model.scale();}
this._toolbar.update();this._loadScreenImage(this._model.screenImage());this._mediaInspector.setAxisTransform(-cssScreenRect.left*zoomFactor/this._model.scale(),this._model.scale());if(callDoResize)
this.doResize();if(updateRulers){this._topRuler.render(this._cachedCssScreenRect?this._cachedCssScreenRect.left:0,this._model.scale());this._leftRuler.render(0,this._model.scale());}
if(contentAreaResized)
this._contentAreaResized();},_loadScreenImage:function(srcset)
{if(this._screenImage.getAttribute("srcset")===srcset)
return;this._screenImage.setAttribute("srcset",srcset);if(!srcset)
this._screenImage.classList.toggle("hidden",true);},_onScreenImageLoaded:function(success)
{this._screenImage.classList.toggle("hidden",!success);},_contentAreaResized:function()
{var zoomFactor=WebInspector.zoomManager.zoomFactor();var rect=this._contentArea.getBoundingClientRect();var handleWidth=this._widthResizerElement.offsetWidth;var handleHeight=this._heightResizerElement.offsetHeight;var availableSize=new Size(Math.max(rect.width*zoomFactor,1),Math.max(rect.height*zoomFactor,1));var preferredSize=new Size(Math.max((rect.width-2*handleWidth)*zoomFactor,1),Math.max((rect.height-handleHeight)*zoomFactor,1));this._model.setAvailableSize(availableSize,preferredSize);},onResize:function()
{if(this.isShowing())
this._contentAreaResized();},wasShown:function()
{this._mediaInspector.setEnabled(true);this._toolbar.restore();},willHide:function()
{this._mediaInspector.setEnabled(false);},__proto__:WebInspector.VBox.prototype}
WebInspector.DeviceModeView.Toolbar=function(model,showMediaInspectorSetting,showRulersSetting)
{this._model=model;this._showMediaInspectorSetting=showMediaInspectorSetting;this._showRulersSetting=showRulersSetting;this._lastMode=new Map();this._lastDevice=null;this._appliedSizeItems=[];this._scaleItems=[];this._visibleToolbar=null;this._element=createElementWithClass("div","device-mode-toolbar");var leftContainer=this._element.createChild("div","device-mode-toolbar-left");var leftToolbar=new WebInspector.Toolbar("",leftContainer);this._noneItem=new WebInspector.ToolbarToggle(WebInspector.UIString("Full"),"enter-fullscreen-toolbar-item");leftToolbar.appendToolbarItem(this._noneItem);this._noneItem.addEventListener("click",this._noneButtonClick,this);this._responsiveItem=new WebInspector.ToolbarToggle(WebInspector.UIString("Responsive"),"responsive-toolbar-item");leftToolbar.appendToolbarItem(this._responsiveItem);this._responsiveItem.addEventListener("click",this._responsiveButtonClick,this);this._deviceItem=new WebInspector.ToolbarToggle(WebInspector.UIString("Device"),"phone-toolbar-item");leftToolbar.appendToolbarItem(this._deviceItem);this._deviceItem.addEventListener("click",this._deviceButtonClick,this);leftToolbar.appendSeparator();var middle=this._element.createChild("div","device-mode-toolbar-middle-container");this._noneToolbar=this._wrapMiddleToolbar(middle,this._createNoneToolbar());this._responsiveToolbar=this._wrapMiddleToolbar(middle,this._createResponsiveToolbar());this._deviceToolbar=this._wrapMiddleToolbar(middle,this._createDeviceToolbar());var rightContainer=this._element.createChild("div","device-mode-toolbar-right");rightContainer.createChild("div","device-mode-toolbar-spacer");var rightToolbar=new WebInspector.Toolbar("",rightContainer);rightToolbar.makeWrappable(true);rightToolbar.appendSeparator();var moreOptionsButton=new WebInspector.ToolbarMenuButton(this._appendMenuItems.bind(this));moreOptionsButton.setTitle(WebInspector.UIString("More options"));rightToolbar.appendToolbarItem(moreOptionsButton);this._persistenceSetting=WebInspector.settings.createSetting("emulation.deviceModeViewPersistence",{type:WebInspector.DeviceModeModel.Type.None,device:"",orientation:"",mode:""});this._restored=false;}
WebInspector.DeviceModeView.Toolbar.prototype={_wrapMiddleToolbar:function(parent,toolbar)
{toolbar.makeWrappable();var container=parent.createChild("div","device-mode-toolbar-middle fill");container.createChild("div","device-mode-toolbar-spacer");container.appendChild(toolbar.element);container.createChild("div","device-mode-toolbar-spacer");container.classList.add("hidden");return container;},_createNoneToolbar:function()
{var toolbar=new WebInspector.Toolbar("");this._appendAppliedSizeItems(toolbar);return toolbar;},_createResponsiveToolbar:function()
{var toolbar=new WebInspector.Toolbar("");var widthInput=createElementWithClass("input","device-mode-size-input");widthInput.maxLength=5;widthInput.title=WebInspector.UIString("Width");WebInspector.SettingsUI.bindSettingInputField(widthInput,this._model.widthSetting(),true,WebInspector.DeviceModeModel.deviceSizeValidator,true);toolbar.appendToolbarItem(this._wrapToolbarItem(widthInput));var xElement=createElementWithClass("div","device-mode-x");xElement.textContent="\u00D7";toolbar.appendToolbarItem(this._wrapToolbarItem(xElement));var heightInput=createElementWithClass("input","device-mode-size-input");heightInput.maxLength=5;heightInput.title=WebInspector.UIString("Height (leave empty to fit)");WebInspector.SettingsUI.bindSettingInputField(heightInput,this._model.heightSetting(),true,validateHeight,true,true);toolbar.appendToolbarItem(this._wrapToolbarItem(heightInput));this._heightInput=heightInput;toolbar.appendSeparator();this._appendScaleItem(toolbar);return toolbar;function validateHeight(value)
{return!value?"":WebInspector.DeviceModeModel.deviceSizeValidator(value);}},_createDeviceToolbar:function()
{var toolbar=new WebInspector.Toolbar("");this._deviceSelect=this._createDeviceSelect();toolbar.appendToolbarItem(this._wrapToolbarItem(this._deviceSelect));this._modeButton=new WebInspector.ToolbarButton("","rotate-screen-toolbar-item");this._modeButton.addEventListener("click",this._modeMenuClicked,this);toolbar.appendToolbarItem(this._modeButton);toolbar.appendSeparator();this._appendAppliedSizeItems(toolbar);toolbar.appendSeparator();this._appendScaleItem(toolbar);return toolbar;},_appendAppliedSizeItems:function(toolbar)
{var item=new WebInspector.ToolbarLabel();this._appliedSizeItems.push(item);toolbar.appendToolbarItem(item);},_appendScaleItem:function(toolbar)
{var scaleItem=new WebInspector.ToolbarMenuButton(this._appendScaleMenuItems.bind(this));scaleItem.setTitle(WebInspector.UIString("Click to change zoom"));scaleItem.setGlyph("");scaleItem.setBold(false);scaleItem.addDropDownArrow();toolbar.appendToolbarItem(scaleItem);this._scaleItems.push(scaleItem);},_appendScaleMenuItems:function(contextMenu)
{var scaleSetting=this._model.scaleSetting();appendScaleItem(WebInspector.UIString("25%"),0.25);appendScaleItem(WebInspector.UIString("50%"),0.5);appendScaleItem(WebInspector.UIString("100%"),1);appendScaleItem(WebInspector.UIString("150%"),1.5);appendScaleItem(WebInspector.UIString("200%"),2);contextMenu.appendSeparator();contextMenu.appendItem(WebInspector.UIString("Fit (%.0f%%)",this._model.fitScale()*100),scaleSetting.set.bind(scaleSetting,this._model.fitScale()),false);function appendScaleItem(title,value)
{contextMenu.appendCheckboxItem(title,scaleSetting.set.bind(scaleSetting,value),scaleSetting.get()===value,false);}},_appendMenuItems:function(contextMenu)
{var uaDisabled=this._model.type()!==WebInspector.DeviceModeModel.Type.Responsive;var uaSetting=this._model.uaSetting();var uaSubmenu=contextMenu.appendSubMenuItem(WebInspector.UIString("User agent type"),false);var uaValue=this._model.uaSetting().get();if(this._model.type()===WebInspector.DeviceModeModel.Type.None)
uaValue=WebInspector.DeviceModeModel.UA.Desktop;if(this._model.type()===WebInspector.DeviceModeModel.Type.Device)
uaValue=this._model.device().mobile()?WebInspector.DeviceModeModel.UA.Mobile:this._model.device().touch()?WebInspector.DeviceModeModel.UA.DesktopTouch:WebInspector.DeviceModeModel.UA.Desktop;appendUAItem(WebInspector.UIString("Mobile"),WebInspector.DeviceModeModel.UA.Mobile);appendUAItem(WebInspector.UIString("Desktop"),WebInspector.DeviceModeModel.UA.Desktop);appendUAItem(WebInspector.UIString("Desktop with touch"),WebInspector.DeviceModeModel.UA.DesktopTouch);function appendUAItem(title,value)
{uaSubmenu.appendCheckboxItem(title,uaSetting.set.bind(uaSetting,value),uaValue===value,uaDisabled);}
var deviceScaleFactorDisabled=this._model.type()!==WebInspector.DeviceModeModel.Type.Responsive;var deviceScaleFactorSubmenu=contextMenu.appendSubMenuItem(WebInspector.UIString("Device pixel ratio"),false);var deviceScaleFactorSetting=this._model.deviceScaleFactorSetting();var deviceScaleFactorValue=deviceScaleFactorDisabled?0:deviceScaleFactorSetting.get();appendDeviceScaleFactorItem(WebInspector.UIString("Default: %f",this._model.defaultDeviceScaleFactor()),0);deviceScaleFactorSubmenu.appendSeparator();appendDeviceScaleFactorItem(WebInspector.UIString("1"),1);appendDeviceScaleFactorItem(WebInspector.UIString("2"),2);appendDeviceScaleFactorItem(WebInspector.UIString("3"),3);function appendDeviceScaleFactorItem(title,value)
{deviceScaleFactorSubmenu.appendCheckboxItem(title,deviceScaleFactorSetting.set.bind(deviceScaleFactorSetting,value),deviceScaleFactorValue===value,deviceScaleFactorDisabled);}
contextMenu.appendItem(WebInspector.UIString("Reset to defaults"),this._model.reset.bind(this._model),this._model.type()!==WebInspector.DeviceModeModel.Type.Responsive);contextMenu.appendSeparator();contextMenu.appendCheckboxItem(WebInspector.UIString("Show media queries"),this._toggleMediaInspector.bind(this),this._showMediaInspectorSetting.get(),this._model.type()===WebInspector.DeviceModeModel.Type.None);contextMenu.appendCheckboxItem(WebInspector.UIString("Show rulers"),this._toggleRulers.bind(this),this._showRulersSetting.get(),this._model.type()===WebInspector.DeviceModeModel.Type.None);contextMenu.appendItem(WebInspector.UIString("Configure network\u2026"),this._openNetworkConfig.bind(this),false);},_toggleMediaInspector:function()
{this._showMediaInspectorSetting.set(!this._showMediaInspectorSetting.get());},_toggleRulers:function()
{this._showRulersSetting.set(!this._showRulersSetting.get());},_openNetworkConfig:function()
{InspectorFrontendHost.bringToFront();WebInspector.actionRegistry.action("network.show-config").execute();},_wrapToolbarItem:function(element)
{var container=createElement("div");var shadowRoot=WebInspector.createShadowRootWithCoreStyles(container,"emulation/deviceModeToolbar.css");shadowRoot.appendChild(element);return new WebInspector.ToolbarItem(container);},_noneButtonClick:function()
{this._model.emulate(WebInspector.DeviceModeModel.Type.None,null,null);},_responsiveButtonClick:function()
{this._model.emulate(WebInspector.DeviceModeModel.Type.Responsive,null,null);},_deviceButtonClick:function()
{this._emulateDevice(this._lastDevice||this._deviceSelect.options[0].device||WebInspector.emulatedDevicesList.standard()[0]);},_emulateDevice:function(device)
{this._model.emulate(WebInspector.DeviceModeModel.Type.Device,device,this._lastMode.get(device)||device.modes[0]);},_createDeviceSelect:function()
{var select=createElementWithClass("select","device-mode-device-select");WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.CustomDevicesUpdated,deviceListChanged,this);WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.StandardDevicesUpdated,deviceListChanged,this);populateDeviceList.call(this);select.addEventListener("change",optionSelected.bind(this),false);return select;function populateDeviceList()
{select.removeChildren();var devicesGroup=select.createChild("optgroup");devicesGroup.label=WebInspector.UIString("Devices");addGroup.call(this,devicesGroup,WebInspector.emulatedDevicesList.standard());var customGroup=select.createChild("optgroup");customGroup.label=WebInspector.UIString("Custom");addGroup.call(this,customGroup,WebInspector.emulatedDevicesList.custom());var editCustomOption=new Option(WebInspector.UIString("Edit\u2026"),WebInspector.UIString("Edit\u2026"));editCustomOption.edit=true;customGroup.appendChild(editCustomOption);}
function deviceListChanged()
{populateDeviceList.call(this);if(!this._updateDeviceSelectedIndex()&&this._model.type()===WebInspector.DeviceModeModel.Type.Device){select.selectedIndex=0;if(!select.options[0].edit)
this._emulateDevice(select.options[0].device);}}
function addGroup(parent,devices)
{devices=devices.filter(function(d){return d.show();});devices.sort(WebInspector.EmulatedDevice.deviceComparator);for(var device of devices)
addOption.call(this,parent,device);}
function addOption(parent,device)
{var option=new Option(device.title,device.title);option.device=device;parent.appendChild(option);if(device===this._model.device())
select.selectedIndex=Array.prototype.slice.call(select.options).indexOf(option);}
function optionSelected()
{var option=select.options[select.selectedIndex];if(option.edit){WebInspector.emulatedDevicesList.revealCustomSetting();this._updateDeviceSelectedIndex();}else{this._emulateDevice(option.device);}}},_updateDeviceSelectedIndex:function()
{for(var i=0;i<this._deviceSelect.options.length;++i){if(this._deviceSelect.options[i].device===this._model.device()){this._deviceSelect.selectedIndex=i;return true;}}
return false;},_modeMenuClicked:function(event)
{var device=this._model.device();var model=this._model;if(device.modes.length===2&&device.modes[0].orientation!==device.modes[1].orientation){model.emulate(model.type(),model.device(),model.mode()===device.modes[0]?device.modes[1]:device.modes[0]);return;}
var contextMenu=new WebInspector.ContextMenu((event.data),false,event.target.element.totalOffsetLeft(),event.target.element.totalOffsetTop()+event.target.element.offsetHeight);addOrientation(WebInspector.EmulatedDevice.Vertical,WebInspector.UIString("Portrait"));addOrientation(WebInspector.EmulatedDevice.Horizontal,WebInspector.UIString("Landscape"));contextMenu.show();function addOrientation(orientation,title)
{var modes=device.modesForOrientation(orientation);if(!modes.length)
return;if(modes.length===1){addMode(modes[0],title);}else{for(var index=0;index<modes.length;index++)
addMode(modes[index],title+" \u2013 "+modes[index].title);}}
function addMode(mode,title)
{contextMenu.appendCheckboxItem(title,applyMode.bind(null,mode),model.mode()===mode,false);}
function applyMode(mode)
{model.emulate(model.type(),model.device(),mode);}},element:function()
{return this._element;},update:function()
{var updatePersistence=false;if(this._model.type()!==this._cachedModelType){this._noneItem.setToggled(this._model.type()===WebInspector.DeviceModeModel.Type.None);this._responsiveItem.setToggled(this._model.type()===WebInspector.DeviceModeModel.Type.Responsive);this._deviceItem.setToggled(this._model.type()===WebInspector.DeviceModeModel.Type.Device);var toolbar=null;if(this._model.type()===WebInspector.DeviceModeModel.Type.None)
toolbar=this._noneToolbar;else if(this._model.type()===WebInspector.DeviceModeModel.Type.Responsive)
toolbar=this._responsiveToolbar;else if(this._model.type()===WebInspector.DeviceModeModel.Type.Device)
toolbar=this._deviceToolbar;if(this._visibleToolbar!==toolbar){if(this._visibleToolbar)
this._visibleToolbar.classList.add("hidden");if(toolbar){toolbar.classList.remove("hidden");toolbar.animate([{opacity:"0"},{opacity:"1"}],{duration:100});}
this._visibleToolbar=toolbar;}
this._previousModelType=this._cachedModelType;this._cachedModelType=this._model.type();updatePersistence=true;}
var size=this._model.appliedDeviceSize();if(!size.isEqual(this._cachedSize)){for(var item of this._appliedSizeItems)
item.setText(WebInspector.UIString("%d \u00D7 %d",size.width,size.height));this._heightInput.placeholder=size.height;this._cachedSize=size;}
if(this._model.scale()!==this._cachedScale){for(var item of this._scaleItems)
item.setText(WebInspector.UIString("%.0f%%",this._model.scale()*100));this._cachedScale=this._model.scale();}
if(this._model.device()!==this._cachedModelDevice){var device=this._model.device();if(device){var modeCount=device?device.modes.length:0;this._modeButton.setEnabled(modeCount>=2);this._modeButton.setTitle(modeCount===2?WebInspector.UIString("Rotate"):WebInspector.UIString("Screen options"));}
this._updateDeviceSelectedIndex();this._cachedModelDevice=device;updatePersistence=true;}
if(this._model.type()===WebInspector.DeviceModeModel.Type.Device){this._lastDevice=this._model.device();this._lastMode.set((this._model.device()),(this._model.mode()));}
if(this._model.mode()!==this._cachedModelMode){this._cachedModelMode=this._model.mode();updatePersistence=true;}
if(updatePersistence){var value=this._persistenceSetting.get();value.type=this._cachedModelType;if(this._cachedModelDevice){value.device=this._cachedModelDevice.title;value.orientation=this._cachedModelMode?this._cachedModelMode.orientation:"";value.mode=this._cachedModelMode?this._cachedModelMode.title:"";}
this._persistenceSetting.set(value);}},restore:function()
{if(this._restored)
return;this._restored=true;for(var i=0;i<this._deviceSelect.options.length;++i){if(this._deviceSelect.options[i].device&&this._deviceSelect.options[i].device.title===this._persistenceSetting.get().device)
this._lastDevice=this._deviceSelect.options[i].device;}
if(this._lastDevice){for(var i=0;i<this._lastDevice.modes.length;++i){if(this._lastDevice.modes[i].orientation===this._persistenceSetting.get().orientation&&this._lastDevice.modes[i].title===this._persistenceSetting.get().mode)
this._lastMode.set(this._lastDevice,this._lastDevice.modes[i]);}}else{this._model.emulate(WebInspector.DeviceModeModel.Type.None,null,null);}
this._applyType((this._persistenceSetting.get().type));},toggleDeviceMode:function()
{this._applyType(this._model.type()===WebInspector.DeviceModeModel.Type.None?(this._previousModelType||WebInspector.DeviceModeModel.Type.Responsive):WebInspector.DeviceModeModel.Type.None);},_applyType:function(type)
{if(type===WebInspector.DeviceModeModel.Type.Responsive)
this._responsiveButtonClick();else if(type===WebInspector.DeviceModeModel.Type.Device)
this._deviceButtonClick();else
this._noneButtonClick();}}
WebInspector.DeviceModeView.Ruler=function(horizontal,applyCallback)
{WebInspector.VBox.call(this);this._contentElement=this.element.createChild("div","device-mode-ruler flex-auto");this._horizontal=horizontal;this._scale=1;this._offset=0;this._count=0;this._throttler=new WebInspector.Throttler(0);this._applyCallback=applyCallback;}
WebInspector.DeviceModeView.Ruler.prototype={render:function(offset,scale)
{this._scale=scale;this._offset=offset;if(this._horizontal)
this.element.style.paddingLeft=this._offset+"px";else
this.element.style.paddingTop=this._offset+"px";this._throttler.schedule(this._update.bind(this));},onResize:function()
{this._throttler.schedule(this._update.bind(this));},_update:function()
{var zoomFactor=WebInspector.zoomManager.zoomFactor();var size=this._horizontal?this._contentElement.offsetWidth:this._contentElement.offsetHeight;if(this._scale!==this._renderedScale||zoomFactor!==this._renderedZoomFactor){this._contentElement.removeChildren();this._count=0;this._renderedScale=this._scale;this._renderedZoomFactor=zoomFactor;}
var dipSize=size*zoomFactor/this._scale;var count=Math.ceil(dipSize/5);var step=1;if(this._scale<0.8)
step=2;if(this._scale<0.6)
step=5;if(this._scale<0.5)
step=20;for(var i=count;i<this._count;i++){if(!(i%step))
this._contentElement.lastChild.remove();}
for(var i=this._count;i<count;i++){if(i%step)
continue;var marker=this._contentElement.createChild("div","device-mode-ruler-marker");if(i){if(this._horizontal)
marker.style.left=(5*i)*this._scale/zoomFactor+"px";else
marker.style.top=(5*i)*this._scale/zoomFactor+"px";if(!(i%20)){var text=marker.createChild("div","device-mode-ruler-text");text.textContent=i*5;text.addEventListener("click",this._onMarkerClick.bind(this,i*5),false);}}
if(!(i%10))
marker.classList.add("device-mode-ruler-marker-large");else if(!(i%5))
marker.classList.add("device-mode-ruler-marker-medium");}
this._count=count;return Promise.resolve();},_onMarkerClick:function(size)
{this._applyCallback.call(null,size);},__proto__:WebInspector.VBox.prototype}
WebInspector.DeviceModeView.ActionDelegate=function()
{}
WebInspector.DeviceModeView.ActionDelegate.prototype={handleAction:function(context,actionId)
{if(actionId==="emulation.toggle-device-mode"&&WebInspector.DeviceModeView._wrapperInstance){WebInspector.DeviceModeView._wrapperInstance._toggleDeviceMode();return true;}
if(actionId==="emulation.toggle-device-toolbar"&&WebInspector.DeviceModeView._wrapperInstance){WebInspector.DeviceModeView._wrapperInstance._toggleDeviceToolbar();return true;}
return false;}}
WebInspector.DeviceModeView.Wrapper=function(inspectedPagePlaceholder)
{WebInspector.VBox.call(this);WebInspector.DeviceModeView._wrapperInstance=this;this._inspectedPagePlaceholder=inspectedPagePlaceholder;this._deviceModeView=new WebInspector.DeviceModeView();this._showDeviceToolbarSetting=WebInspector.settings.createSetting("emulation.showDeviceToolbar",true);this._showDeviceToolbarSetting.addChangeListener(this._update,this);this._update();}
WebInspector.DeviceModeView._wrapperInstance;WebInspector.DeviceModeView.Wrapper.prototype={_toggleDeviceMode:function()
{if(this._showDeviceToolbarSetting.get())
this._deviceModeView.toggleDeviceMode();},_toggleDeviceToolbar:function()
{this._showDeviceToolbarSetting.set(!this._showDeviceToolbarSetting.get());},_update:function()
{if(this._showDeviceToolbarSetting.get()){this._deviceModeView.show(this.element);this._inspectedPagePlaceholder.clearMinimumSizeAndMargins();this._inspectedPagePlaceholder.show(this._deviceModeView.element);}else{this._deviceModeView.detach();this._inspectedPagePlaceholder.restoreMinimumSizeAndMargins();this._inspectedPagePlaceholder.show(this.element);this._deviceModeView._model.emulate(WebInspector.DeviceModeModel.Type.None,null,null);}},__proto__:WebInspector.VBox.prototype};WebInspector.AdvancedApp=function()
{WebInspector.dockController.addEventListener(WebInspector.DockController.Events.BeforeDockSideChanged,this._openToolboxWindow,this);};WebInspector.AdvancedApp.prototype={presentUI:function(document,callback)
{var rootView=new WebInspector.RootView();this._rootSplitWidget=new WebInspector.SplitWidget(false,true,"InspectorView.splitViewState",555,300,true);this._rootSplitWidget.show(rootView.element);this._rootSplitWidget.setSidebarWidget(WebInspector.inspectorView);this._inspectedPagePlaceholder=new WebInspector.InspectedPagePlaceholder();this._inspectedPagePlaceholder.addEventListener(WebInspector.InspectedPagePlaceholder.Events.Update,this._onSetInspectedPageBounds.bind(this),this);if(Runtime.experiments.isEnabled("deviceMode"))
this._responsiveDesignView=new WebInspector.DeviceModeView.Wrapper(this._inspectedPagePlaceholder);else
this._responsiveDesignView=new WebInspector.ResponsiveDesignView(this._inspectedPagePlaceholder);WebInspector.dockController.addEventListener(WebInspector.DockController.Events.BeforeDockSideChanged,this._onBeforeDockSideChange,this);WebInspector.dockController.addEventListener(WebInspector.DockController.Events.DockSideChanged,this._onDockSideChange,this);WebInspector.dockController.addEventListener(WebInspector.DockController.Events.AfterDockSideChanged,this._onAfterDockSideChange,this);this._onDockSideChange();WebInspector.inspectorView.showInitialPanel();console.timeStamp("AdvancedApp.attachToBody");rootView.attachToDocument(document);this._inspectedPagePlaceholder.update();if(this._isDocked())
callback();else
this._presentUICallback=callback;},_openToolboxWindow:function(event)
{if((event.data.to)!==WebInspector.DockController.State.Undocked)
return;if(this._toolboxWindow)
return;var url=window.location.href.replace("inspector.html","toolbox.html");this._toolboxWindow=window.open(url,undefined);},toolboxLoaded:function(toolboxDocument)
{WebInspector.initializeUIUtils(toolboxDocument,WebInspector.settings.createSetting("uiTheme","default"));WebInspector.installComponentRootStyles((toolboxDocument.body));WebInspector.ContextMenu.installHandler(toolboxDocument);WebInspector.Tooltip.installHandler(toolboxDocument);this._toolboxRootView=new WebInspector.RootView();this._toolboxRootView.attachToDocument(toolboxDocument);this._updateResponsiveDesignView();if(this._presentUICallback){var callback=this._presentUICallback;delete this._presentUICallback;callback();}},_updateResponsiveDesignView:function()
{if(this._isDocked())
this._rootSplitWidget.setMainWidget(this._responsiveDesignView);else if(this._toolboxRootView)
this._responsiveDesignView.show(this._toolboxRootView.element);if(!Runtime.experiments.isEnabled("deviceMode")&&(this._isDocked()||this._toolboxRootView))
this._responsiveDesignView.updatePageResizer();},_onBeforeDockSideChange:function(event)
{if((event.data.to)===WebInspector.DockController.State.Undocked&&this._toolboxRootView){this._rootSplitWidget.hideSidebar();this._inspectedPagePlaceholder.update();}
this._changingDockSide=true;},_onDockSideChange:function(event)
{this._updateResponsiveDesignView();var toDockSide=event?(event.data.to):WebInspector.dockController.dockSide();if(toDockSide===WebInspector.DockController.State.Undocked){this._updateForUndocked();}else if(this._toolboxRootView&&event&&(event.data.from)===WebInspector.DockController.State.Undocked){this._rootSplitWidget.hideSidebar();}else{this._updateForDocked(toDockSide);}},_onAfterDockSideChange:function(event)
{if(!this._changingDockSide)
return;if((event.data.from)===WebInspector.DockController.State.Undocked){this._updateForDocked((event.data.to));}
this._changingDockSide=false;this._inspectedPagePlaceholder.update();},_updateForDocked:function(dockSide)
{this._rootSplitWidget.setVertical(dockSide===WebInspector.DockController.State.DockedToRight);this._rootSplitWidget.setSecondIsSidebar(dockSide===WebInspector.DockController.State.DockedToRight||dockSide===WebInspector.DockController.State.DockedToBottom);this._rootSplitWidget.toggleResizer(this._rootSplitWidget.resizerElement(),true);this._rootSplitWidget.toggleResizer(WebInspector.inspectorView.topResizerElement(),dockSide===WebInspector.DockController.State.DockedToBottom);this._rootSplitWidget.showBoth();},_updateForUndocked:function()
{this._rootSplitWidget.toggleResizer(this._rootSplitWidget.resizerElement(),false);this._rootSplitWidget.toggleResizer(WebInspector.inspectorView.topResizerElement(),false);this._rootSplitWidget.hideMain();},_isDocked:function()
{return WebInspector.dockController.dockSide()!==WebInspector.DockController.State.Undocked;},_onSetInspectedPageBounds:function(event)
{if(this._changingDockSide)
return;var window=this._inspectedPagePlaceholder.element.window();if(!window.innerWidth||!window.innerHeight)
return;if(!this._inspectedPagePlaceholder.isShowing())
return;var bounds=(event.data);console.timeStamp("AdvancedApp.setInspectedPageBounds");InspectorFrontendHost.setInspectedPageBounds(bounds);}};WebInspector.AdvancedApp._appInstance;WebInspector.AdvancedApp._instance=function()
{if(!WebInspector.AdvancedApp._appInstance)
WebInspector.AdvancedApp._appInstance=new WebInspector.AdvancedApp();return WebInspector.AdvancedApp._appInstance;};WebInspector.AdvancedAppProvider=function()
{};WebInspector.AdvancedAppProvider.prototype={createApp:function()
{return WebInspector.AdvancedApp._instance();}};;WebInspector.FrontendWebSocketAPI=function()
{InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.DispatchFrontendAPIMessage,this._onFrontendAPIMessage,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.FrontendAPIAttached,this._onAttach,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.FrontendAPIDetached,this._onDetach,this);}
WebInspector.FrontendWebSocketAPI.prototype={_onAttach:function()
{WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.WorkingCopyCommittedByUser,this._workingCopyCommitted,this);WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.WorkingCopyChanged,this._workingCopyChanged,this);WebInspector.Linkifier.setLinkHandler(this);},_onDetach:function()
{WebInspector.workspace.removeEventListener(WebInspector.Workspace.Events.WorkingCopyCommittedByUser,this._workingCopyCommitted,this);WebInspector.workspace.removeEventListener(WebInspector.Workspace.Events.WorkingCopyChanged,this._workingCopyChanged,this);WebInspector.Linkifier.setLinkHandler(null);},handleLink:function(url,lineNumber)
{var uiSourceCode=WebInspector.networkMapping.uiSourceCodeForURLForAnyTarget(url);if(uiSourceCode)
url=uiSourceCode.url();if(url.startsWith("file://")){var file=url.substring(7);this._issueFrontendAPINotification("Frontend.revealLocation",{file:file,line:lineNumber});return true;}
return false;},_onFrontendAPIMessage:function(event)
{var message=JSON.parse((event.data));this._dispatchFrontendAPIMessage(message["id"],message["method"],message["params"]||null);},_dispatchFrontendAPIMessage:function(id,method,params)
{this._dispatchingFrontendMessage=true;switch(method){case"Frontend.updateBuffer":var file=params["file"];var buffer=params["buffer"];var saved=params["saved"];var uiSourceCode=WebInspector.workspace.uiSourceCodeForURL("file://"+file);if(uiSourceCode){if(buffer!==uiSourceCode.workingCopy())
uiSourceCode.setWorkingCopy(buffer);if(saved)
uiSourceCode.checkContentUpdated(true);}
break;default:WebInspector.console.log("Unhandled API message: "+method);}
this._issueResponse(id);this._dispatchingFrontendMessage=false;},_workingCopyChanged:function(event,saved)
{if(this._dispatchingFrontendMessage)
return;var uiSourceCode=(event.data["uiSourceCode"]);var url=uiSourceCode.url();if(url.startsWith("file://"))
url=url.substring(7);var params={file:url,buffer:uiSourceCode.workingCopy()};if(saved)
params.saved=true;this._issueFrontendAPINotification("Frontend.bufferUpdated",params);},_workingCopyCommitted:function(event)
{this._workingCopyChanged(event,true);},_issueResponse:function(id,params)
{var object={id:id};if(params)
object.params=params;InspectorFrontendHost.sendFrontendAPINotification(JSON.stringify(object));},_issueFrontendAPINotification:function(method,params)
{InspectorFrontendHost.sendFrontendAPINotification(JSON.stringify({method:method,params:params}));}};WebInspector.RenderingOptionsView=function()
{WebInspector.VBox.call(this,true);this.registerRequiredCSS("main/renderingOptions.css");this._settings=new Map();this._appendCheckbox(WebInspector.UIString("Enable paint flashing"),"setShowPaintRects");this._appendCheckbox(WebInspector.UIString("Show layer borders"),"setShowDebugBorders");this._appendCheckbox(WebInspector.UIString("Show FPS meter"),"setShowFPSCounter");var scrollingTitle=WebInspector.UIString("Shows areas of the page that slow down scrolling:\nTouch and mousewheel event listeners can delay scrolling.\nSome areas need to repaint their content when scrolled.");this._appendCheckbox(WebInspector.UIString("Show scrolling perf issues"),"setShowScrollBottleneckRects",scrollingTitle);var checkboxLabel=createCheckboxLabel(WebInspector.UIString("Emulate print media"),false);this._printCheckbox=checkboxLabel.checkboxElement;this._printCheckbox.addEventListener("click",this._printToggled.bind(this));this.contentElement.appendChild(checkboxLabel);WebInspector.targetManager.observeTargets(this,WebInspector.Target.Type.Page);}
WebInspector.RenderingOptionsView.prototype={_appendCheckbox:function(label,setterName,title)
{var checkboxLabel=createCheckboxLabel(label,false);this._settings.set(setterName,checkboxLabel.checkboxElement);checkboxLabel.checkboxElement.addEventListener("click",this._settingToggled.bind(this,setterName));if(title)
checkboxLabel.title=title;this.contentElement.appendChild(checkboxLabel);},_settingToggled:function(setterName)
{var enabled=this._settings.get(setterName).checked;var targets=WebInspector.targetManager.targets(WebInspector.Target.Type.Page);for(var i=0;i<targets.length;++i)
targets[i].renderingAgent()[setterName](enabled);},targetAdded:function(target)
{for(var setterName of this._settings.keysArray()){if(this._settings.get(setterName).checked)
target.renderingAgent()[setterName](true);}
if(this._printCheckbox.checked)
this._applyPrintMediaOverride(target);},_printToggled:function()
{var targets=WebInspector.targetManager.targets(WebInspector.Target.Type.Page);for(var target of targets)
this._applyPrintMediaOverride(target);},_applyPrintMediaOverride:function(target)
{var enabled=this._printCheckbox.checked;target.emulationAgent().setEmulatedMedia(enabled?"print":"");var cssModel=WebInspector.CSSStyleModel.fromTarget(target);if(cssModel)
cssModel.mediaQueryResultChanged();},targetRemoved:function(target)
{},__proto__:WebInspector.VBox.prototype}
WebInspector.RenderingOptionsView.instance=function()
{if(!WebInspector.RenderingOptionsView._instanceObject)
WebInspector.RenderingOptionsView._instanceObject=new WebInspector.RenderingOptionsView();return WebInspector.RenderingOptionsView._instanceObject;}
WebInspector.RenderingOptionsView.ShowActionDelegate=function()
{}
WebInspector.RenderingOptionsView.ShowActionDelegate.prototype={handleAction:function(context,actionId)
{WebInspector.inspectorView.showViewInDrawer("rendering");return true;}};WebInspector.SimpleApp=function()
{};WebInspector.SimpleApp.prototype={presentUI:function(document,callback)
{var rootView=new WebInspector.RootView();WebInspector.inspectorView.show(rootView.element);WebInspector.inspectorView.showInitialPanel();rootView.attachToDocument(document);callback();}};WebInspector.SimpleAppProvider=function()
{};WebInspector.SimpleAppProvider.prototype={createApp:function()
{return new WebInspector.SimpleApp();}};;function createTestSuite(domAutomationController)
{function TestSuite()
{WebInspector.TestBase.call(this,domAutomationController);};TestSuite.prototype={__proto__:WebInspector.TestBase.prototype};TestSuite.prototype.showPanel=function(panelName)
{return WebInspector.inspectorView.showPanel(panelName);};TestSuite.prototype.testShowScriptsTab=function()
{var test=this;this.showPanel("sources").then(function(){this._waitUntilScriptsAreParsed(["debugger_test_page.html"],function(){test.releaseControl();});}.bind(this));this.takeControl();};TestSuite.prototype.testScriptsTabIsPopulatedOnInspectedPageRefresh=function()
{var test=this;var debuggerModel=WebInspector.DebuggerModel.fromTarget(WebInspector.targetManager.mainTarget());debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,waitUntilScriptIsParsed);this.showPanel("elements").then(function(){test.evaluateInConsole_("window.location.reload(true);",function(resultText){});});function waitUntilScriptIsParsed()
{debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,waitUntilScriptIsParsed);test.showPanel("sources").then(function(){test._waitUntilScriptsAreParsed(["debugger_test_page.html"],function(){test.releaseControl();});});}
this.takeControl();};TestSuite.prototype.testContentScriptIsPresent=function()
{var test=this;this.showPanel("sources").then(function(){test._waitUntilScriptsAreParsed(["page_with_content_script.html","simple_content_script.js"],function(){test.releaseControl();});});this.takeControl();};TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch=function()
{var test=this;var expectedScriptsCount=2;var parsedScripts=[];function switchToElementsTab(){test.showPanel("elements").then(function(){setTimeout(switchToScriptsTab,0);});}
function switchToScriptsTab(){test.showPanel("sources").then(function(){setTimeout(checkScriptsPanel,0);});}
function checkScriptsPanel(){test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html"]),"Some scripts are missing.");checkNoDuplicates();test.releaseControl();}
function checkNoDuplicates(){var uiSourceCodes=test.nonAnonymousUISourceCodes_();for(var i=0;i<uiSourceCodes.length;i++){var scriptName=WebInspector.networkMapping.networkURL(uiSourceCodes[i]);for(var j=i+1;j<uiSourceCodes.length;j++)
test.assertTrue(scriptName!==WebInspector.networkMapping.networkURL(uiSourceCodes[j]),"Found script duplicates: "+test.uiSourceCodesToString_(uiSourceCodes));}}
this.showPanel("sources").then(function(){test._waitUntilScriptsAreParsed(["debugger_test_page.html"],function(){checkNoDuplicates();setTimeout(switchToElementsTab,0);});});this.takeControl();};TestSuite.prototype.testPauseWhenLoadingDevTools=function()
{var debuggerModel=WebInspector.DebuggerModel.fromTarget(WebInspector.targetManager.mainTarget());if(debuggerModel.debuggerPausedDetails)
return;this.showPanel("sources").then(function(){this._waitForScriptPause(this.releaseControl.bind(this));}.bind(this));this.takeControl();};TestSuite.prototype.testPauseWhenScriptIsRunning=function()
{this.showPanel("sources").then(function(){this.evaluateInConsole_('setTimeout("handleClick()", 0)',didEvaluateInConsole.bind(this));}.bind(this));function didEvaluateInConsole(resultText){this.assertTrue(!isNaN(resultText),"Failed to get timer id: "+resultText);setTimeout(testScriptPause.bind(this),300);}
function testScriptPause(){WebInspector.panels.sources._togglePause();this._waitForScriptPause(this.releaseControl.bind(this));}
this.takeControl();};TestSuite.prototype.testNetworkSize=function()
{var test=this;function finishResource(resource,finishTime)
{test.assertEquals(25,resource.resourceSize,"Incorrect total data length");test.releaseControl();}
this.addSniffer(WebInspector.NetworkDispatcher.prototype,"_finishNetworkRequest",finishResource);test.evaluateInConsole_("window.location.reload(true);",function(resultText){});this.takeControl();};TestSuite.prototype.testNetworkSyncSize=function()
{var test=this;function finishResource(resource,finishTime)
{test.assertEquals(25,resource.resourceSize,"Incorrect total data length");test.releaseControl();}
this.addSniffer(WebInspector.NetworkDispatcher.prototype,"_finishNetworkRequest",finishResource);test.evaluateInConsole_("var xhr = new XMLHttpRequest(); xhr.open(\"GET\", \"chunked\", false); xhr.send(null);",function(){});this.takeControl();};TestSuite.prototype.testNetworkRawHeadersText=function()
{var test=this;function finishResource(resource,finishTime)
{if(!resource.responseHeadersText)
test.fail("Failure: resource does not have response headers text");var index=resource.responseHeadersText.indexOf("Date:")
test.assertEquals(112,resource.responseHeadersText.substring(index).length,"Incorrect response headers text length");test.releaseControl();}
this.addSniffer(WebInspector.NetworkDispatcher.prototype,"_finishNetworkRequest",finishResource);test.evaluateInConsole_("window.location.reload(true);",function(resultText){});this.takeControl();};TestSuite.prototype.testNetworkTiming=function()
{var test=this;function finishResource(resource,finishTime)
{test.assertTrue(resource.timing.receiveHeadersEnd-resource.timing.connectStart>=70,"Time between receiveHeadersEnd and connectStart should be >=70ms, but was "+"receiveHeadersEnd="+resource.timing.receiveHeadersEnd+", connectStart="+resource.timing.connectStart+".");test.assertTrue(resource.responseReceivedTime-resource.startTime>=0.07,"Time between responseReceivedTime and startTime should be >=0.07s, but was "+"responseReceivedTime="+resource.responseReceivedTime+", startTime="+resource.startTime+".");test.assertTrue(resource.endTime-resource.startTime>=0.14,"Time between endTime and startTime should be >=0.14s, but was "+"endtime="+resource.endTime+", startTime="+resource.startTime+".");test.releaseControl();}
this.addSniffer(WebInspector.NetworkDispatcher.prototype,"_finishNetworkRequest",finishResource);test.evaluateInConsole_("window.location.reload(true);",function(resultText){});this.takeControl();};TestSuite.prototype.testConsoleOnNavigateBack=function()
{if(WebInspector.multitargetConsoleModel.messages().length===1)
firstConsoleMessageReceived.call(this);else
WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded,firstConsoleMessageReceived,this);function firstConsoleMessageReceived(){WebInspector.multitargetConsoleModel.removeEventListener(WebInspector.ConsoleModel.Events.MessageAdded,firstConsoleMessageReceived,this);this.evaluateInConsole_("clickLink();",didClickLink.bind(this));}
function didClickLink(){this.assertEquals(3,WebInspector.multitargetConsoleModel.messages().length);this.evaluateInConsole_("history.back();",didNavigateBack.bind(this));}
function didNavigateBack()
{this.evaluateInConsole_("void 0;",didCompleteNavigation.bind(this));}
function didCompleteNavigation(){this.assertEquals(7,WebInspector.multitargetConsoleModel.messages().length);this.releaseControl();}
this.takeControl();};TestSuite.prototype.testSharedWorker=function()
{function didEvaluateInConsole(resultText){this.assertEquals("2011",resultText);this.releaseControl();}
this.evaluateInConsole_("globalVar",didEvaluateInConsole.bind(this));this.takeControl();};TestSuite.prototype.testPauseInSharedWorkerInitialization1=function()
{this.takeControl();this._waitForTargets(2,callback.bind(this));function callback()
{var target=WebInspector.targetManager.targetsWithJSContext()[0];target._connection.runAfterPendingDispatches(this.releaseControl.bind(this));}};TestSuite.prototype.testPauseInSharedWorkerInitialization2=function()
{this.takeControl();this._waitForTargets(2,callback.bind(this));function callback()
{var target=WebInspector.targetManager.targetsWithJSContext()[0];var debuggerModel=WebInspector.DebuggerModel.fromTarget(target);if(debuggerModel.isPaused()){this.releaseControl();return;}
this._waitForScriptPause(this.releaseControl.bind(this));}};TestSuite.prototype.enableTouchEmulation=function()
{WebInspector.overridesSupport._emulateTouchEventsInTarget(WebInspector.targetManager.mainTarget(),true,"mobile");};TestSuite.prototype.switchToPanel=function(panelName)
{this.showPanel(panelName).then(this.releaseControl.bind(this));this.takeControl();}
TestSuite.prototype.testDeviceMetricsOverrides=function()
{const dumpPageMetrics=function()
{return JSON.stringify({width:window.innerWidth,height:window.innerHeight,deviceScaleFactor:window.devicePixelRatio});};var test=this;function testOverrides(params,metrics,callback)
{WebInspector.targetManager.mainTarget().emulationAgent().invoke_setDeviceMetricsOverride(params,getMetrics);function getMetrics()
{test.evaluateInConsole_("("+dumpPageMetrics.toString()+")()",checkMetrics);}
function checkMetrics(consoleResult)
{test.assertEquals('"'+JSON.stringify(metrics)+'"',consoleResult,"Wrong metrics for params: "+JSON.stringify(params));callback();}}
function step1()
{testOverrides({width:1200,height:1000,deviceScaleFactor:1,mobile:false,fitWindow:true},{width:1200,height:1000,deviceScaleFactor:1},step2);}
function step2()
{testOverrides({width:1200,height:1000,deviceScaleFactor:1,mobile:false,fitWindow:false},{width:1200,height:1000,deviceScaleFactor:1},step3);}
function step3()
{testOverrides({width:1200,height:1000,deviceScaleFactor:3,mobile:false,fitWindow:true},{width:1200,height:1000,deviceScaleFactor:3},step4);}
function step4()
{testOverrides({width:1200,height:1000,deviceScaleFactor:3,mobile:false,fitWindow:false},{width:1200,height:1000,deviceScaleFactor:3},finish);}
function finish()
{test.releaseControl();}
WebInspector.overridesSupport._deviceMetricsChangedListenerMuted=true;test.takeControl();this.waitForThrottler(WebInspector.overridesSupport._deviceMetricsThrottler,step1);};TestSuite.prototype.testScreenshotRecording=function()
{var test=this;function performActionsInPage(callback)
{var count=0;var div=document.createElement("div");div.setAttribute("style","left: 0px; top: 0px; width: 100px; height: 100px; position: absolute;");document.body.appendChild(div);requestAnimationFrame(frame);function frame()
{var color=[0,0,0];color[count%3]=255;div.style.backgroundColor="rgb("+color.join(",")+")";if(++count>10)
requestAnimationFrame(callback);else
requestAnimationFrame(frame);}}
var captureFilmStripSetting=WebInspector.settings.createSetting("timelineCaptureFilmStrip",false);captureFilmStripSetting.set(true);test.evaluateInConsole_(performActionsInPage.toString(),function(){});test.invokeAsyncWithTimeline_("performActionsInPage",onTimelineDone);function onTimelineDone()
{captureFilmStripSetting.set(false);var filmStripModel=new WebInspector.FilmStripModel(WebInspector.panels.timeline._tracingModel);var frames=filmStripModel.frames();test.assertTrue(frames.length>4&&typeof frames.length==="number");loadFrameImages(frames);}
function loadFrameImages(frames)
{var readyImages=[];for(var frame of frames)
frame.imageDataPromise().then(onGotImageData)
function onGotImageData(data)
{var image=new Image();test.assertTrue(!!data,"No image data for frame");image.addEventListener("load",onLoad);image.src="data:image/jpg;base64,"+data;}
function onLoad(event)
{readyImages.push(event.target);if(readyImages.length===frames.length)
validateImagesAndCompleteTest(readyImages);}}
function validateImagesAndCompleteTest(images)
{var redCount=0;var greenCount=0;var blueCount=0;var canvas=document.createElement("canvas");var ctx=canvas.getContext("2d");for(var image of images){test.assertTrue(image.naturalWidth>10);test.assertTrue(image.naturalHeight>10);canvas.width=image.naturalWidth;canvas.height=image.naturalHeight;ctx.drawImage(image,0,0);var data=ctx.getImageData(0,0,1,1);var color=Array.prototype.join.call(data.data,",");if(data.data[0]>200)
redCount++;else if(data.data[1]>200)
greenCount++;else if(data.data[2]>200)
blueCount++;else
test.fail("Unexpected color: "+color);}
test.assertTrue(redCount&&greenCount&&blueCount,"Color sanity check failed");test.releaseControl();}
test.takeControl();}
TestSuite.prototype.testSettings=function()
{var test=this;createSettings();test.takeControl();setTimeout(reset,0);function createSettings()
{var localSetting=WebInspector.settings.createSetting("local",undefined,true);localSetting.set({s:"local",n:1});var globalSetting=WebInspector.settings.createSetting("global",undefined,false);globalSetting.set({s:"global",n:2});}
function reset()
{Runtime.experiments.clearForTest();InspectorFrontendHost.getPreferences(gotPreferences);}
function gotPreferences(prefs)
{WebInspector.Main._instanceForTest._createSettings(prefs);var localSetting=WebInspector.settings.createSetting("local",undefined,true);test.assertEquals("object",typeof localSetting.get());test.assertEquals("local",localSetting.get().s);test.assertEquals(1,localSetting.get().n);var globalSetting=WebInspector.settings.createSetting("global",undefined,false);test.assertEquals("object",typeof globalSetting.get());test.assertEquals("global",globalSetting.get().s);test.assertEquals(2,globalSetting.get().n);test.releaseControl();}}
TestSuite.prototype.waitForTestResultsInConsole=function()
{var messages=WebInspector.multitargetConsoleModel.messages();for(var i=0;i<messages.length;++i){var text=messages[i].messageText;if(text==="PASS")
return;else if(/^FAIL/.test(text))
this.fail(text);}
function onConsoleMessage(event)
{var text=event.data.messageText;if(text==="PASS")
this.releaseControl();else if(/^FAIL/.test(text))
this.fail(text);}
WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded,onConsoleMessage,this);this.takeControl();};TestSuite.prototype.invokeAsyncWithTimeline_=function(functionName,callback)
{var test=this;test.showPanel("timeline").then(function(){WebInspector.panels.timeline._model.addEventListener(WebInspector.TimelineModel.Events.RecordingStarted,onRecordingStarted);WebInspector.panels.timeline._toggleRecording();});function onRecordingStarted()
{WebInspector.panels.timeline._model.removeEventListener(WebInspector.TimelineModel.Events.RecordingStarted,onRecordingStarted);test.evaluateInConsole_(functionName+"(function() { console.log('DONE'); });",function(){});WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded,onConsoleMessage);}
function onConsoleMessage(event)
{var text=event.data.messageText;if(text==="DONE"){WebInspector.multitargetConsoleModel.removeEventListener(WebInspector.ConsoleModel.Events.MessageAdded,onConsoleMessage);pageActionsDone();}}
function pageActionsDone()
{WebInspector.panels.timeline._model.addEventListener(WebInspector.TimelineModel.Events.RecordingStopped,onRecordingStopped);WebInspector.panels.timeline._toggleRecording();}
function onRecordingStopped()
{WebInspector.panels.timeline._model.removeEventListener(WebInspector.TimelineModel.Events.RecordingStopped,onRecordingStopped);callback();}};TestSuite.prototype.uiSourceCodesToString_=function(uiSourceCodes)
{var names=[];for(var i=0;i<uiSourceCodes.length;i++)
names.push('"'+WebInspector.networkMapping.networkURL(uiSourceCodes[i])+'"');return names.join(",");};TestSuite.prototype.nonAnonymousUISourceCodes_=function()
{function filterOutAnonymous(uiSourceCode)
{return!!WebInspector.networkMapping.networkURL(uiSourceCode);}
function filterOutService(uiSourceCode)
{return!uiSourceCode.isFromServiceProject();}
var uiSourceCodes=WebInspector.workspace.uiSourceCodes();uiSourceCodes=uiSourceCodes.filter(filterOutService);return uiSourceCodes.filter(filterOutAnonymous);};TestSuite.prototype.evaluateInConsole_=function(code,callback)
{function innerEvaluate()
{WebInspector.context.removeFlavorChangeListener(WebInspector.ExecutionContext,showConsoleAndEvaluate,this);var consoleView=WebInspector.ConsolePanel._view();consoleView._prompt.setText(code);consoleView._promptElement.dispatchEvent(TestSuite.createKeyEvent("Enter"));this.addSniffer(WebInspector.ConsoleView.prototype,"_consoleMessageAddedForTest",function(viewMessage){callback(viewMessage.toMessageElement().deepTextContent());}.bind(this));}
function showConsoleAndEvaluate()
{WebInspector.console.showPromise().then(innerEvaluate.bind(this));}
if(!WebInspector.context.flavor(WebInspector.ExecutionContext)){WebInspector.context.addFlavorChangeListener(WebInspector.ExecutionContext,showConsoleAndEvaluate,this);return;}
showConsoleAndEvaluate.call(this);};TestSuite.prototype._scriptsAreParsed=function(expected)
{var uiSourceCodes=this.nonAnonymousUISourceCodes_();var missing=expected.slice(0);for(var i=0;i<uiSourceCodes.length;++i){for(var j=0;j<missing.length;++j){if(uiSourceCodes[i].name().search(missing[j])!==-1){missing.splice(j,1);break;}}}
return missing.length===0;};TestSuite.prototype._waitForScriptPause=function(callback)
{this.addSniffer(WebInspector.DebuggerModel.prototype,"_pausedScript",callback);};TestSuite.prototype._waitUntilScriptsAreParsed=function(expectedScripts,callback)
{var test=this;function waitForAllScripts(){if(test._scriptsAreParsed(expectedScripts))
callback();else
test.addSniffer(WebInspector.panels.sources.sourcesView(),"_addUISourceCode",waitForAllScripts);}
waitForAllScripts();};TestSuite.prototype._waitForTargets=function(n,callback)
{checkTargets.call(this);function checkTargets()
{if(WebInspector.targetManager.targets().length>=n)
callback.call(null);else
this.addSniffer(WebInspector.TargetManager.prototype,"addTarget",checkTargets.bind(this));}}
TestSuite.createKeyEvent=function(keyIdentifier)
{var evt=document.createEvent("KeyboardEvent");evt.initKeyboardEvent("keydown",true,true,null,keyIdentifier,"");return evt;};return new TestSuite();}
if(window.uiTests){WebInspector.notifications.addEventListener(WebInspector.NotificationService.Events.InspectorAgentEnabledForTests,window.uiTests.testSuiteReady.bind(null,createTestSuite));};WebInspector.OverlayController=function()
{WebInspector.moduleSetting("disablePausedStateOverlay").addChangeListener(this._updateOverlayMessage,this);WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel,WebInspector.DebuggerModel.Events.DebuggerPaused,this._updateOverlayMessage,this);WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel,WebInspector.DebuggerModel.Events.DebuggerResumed,this._updateOverlayMessage,this);WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel,WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._updateOverlayMessage,this);}
WebInspector.OverlayController.prototype={_updateOverlayMessage:function(event)
{var debuggerModel=(event.target);var message=debuggerModel.isPaused()&&!WebInspector.moduleSetting("disablePausedStateOverlay").get()?WebInspector.UIString("Paused in debugger"):undefined;debuggerModel.target().pageAgent().setOverlayMessage(message);}};WebInspector.MainConnection=function()
{InspectorBackendClass.Connection.call(this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.DispatchMessage,this._dispatchMessage,this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.DispatchMessageChunk,this._dispatchMessageChunk,this);}
WebInspector.MainConnection.prototype={sendMessage:function(messageObject)
{var message=JSON.stringify(messageObject);InspectorFrontendHost.sendMessageToBackend(message);},_dispatchMessage:function(event)
{this.dispatch((event.data));},_dispatchMessageChunk:function(event)
{var messageChunk=(event.data["messageChunk"]);var messageSize=(event.data["messageSize"]);if(messageSize){this._messageBuffer="";this._messageSize=messageSize;}
this._messageBuffer+=messageChunk;if(this._messageBuffer.length===this._messageSize){this.dispatch(this._messageBuffer);this._messageBuffer="";this._messageSize=0;}},__proto__:InspectorBackendClass.Connection.prototype}
WebInspector.WebSocketConnection=function(url,onConnectionReady)
{InspectorBackendClass.Connection.call(this);this._socket=new WebSocket(url);this._socket.onmessage=this._onMessage.bind(this);this._socket.onerror=this._onError.bind(this);this._socket.onopen=onConnectionReady.bind(null,this);this._socket.onclose=this.connectionClosed.bind(this,"websocket_closed");}
WebInspector.WebSocketConnection.Create=function(url,onConnectionReady)
{new WebInspector.WebSocketConnection(url,onConnectionReady);}
WebInspector.WebSocketConnection.prototype={_onMessage:function(message)
{var data=(message.data);this.dispatch(data);},_onError:function(error)
{console.error(error);},sendMessage:function(messageObject)
{var message=JSON.stringify(messageObject);this._socket.send(message);},__proto__:InspectorBackendClass.Connection.prototype}
WebInspector.StubConnection=function()
{InspectorBackendClass.Connection.call(this);}
WebInspector.StubConnection.prototype={sendMessage:function(messageObject)
{setTimeout(this._respondWithError.bind(this,messageObject),0);},_respondWithError:function(messageObject)
{var error={message:"This is a stub connection, can't dispatch message.",code:InspectorBackendClass.DevToolsStubErrorCode,data:messageObject};this.dispatch({id:messageObject.id,error:error});},__proto__:InspectorBackendClass.Connection.prototype};WebInspector.Main=function()
{WebInspector.console.setUIDelegate(this);WebInspector.Main._instanceForTest=this;runOnWindowLoad(this._loaded.bind(this));}
WebInspector.Main.prototype={showConsole:function()
{return WebInspector.Revealer.revealPromise(WebInspector.console);},_loaded:function()
{console.timeStamp("Main._loaded");if(InspectorFrontendHost.isUnderTest())
self.runtime.useTestBase();InspectorFrontendHost.getPreferences(this._gotPreferences.bind(this));new WebInspector.FrontendWebSocketAPI();},_gotPreferences:function(prefs)
{console.timeStamp("Main._gotPreferences");this._createSettings(prefs);this._createAppUI();},_createSettings:function(prefs)
{var settingsParam=Runtime.queryParam("settings");if(settingsParam){try{var settings=JSON.parse(window.decodeURI(settingsParam));for(var key in settings)
prefs[key]=settings[key];}catch(e){}}
this._initializeExperiments(prefs);WebInspector.settings=new WebInspector.Settings(new WebInspector.SettingsStorage(prefs,InspectorFrontendHost.setPreference,InspectorFrontendHost.removePreference,InspectorFrontendHost.clearPreferences));if(!InspectorFrontendHost.isUnderTest())
new WebInspector.VersionController().updateVersion();},_initializeExperiments:function(prefs)
{Runtime.experiments.register("accessibilityInspection","Accessibility Inspection");Runtime.experiments.register("applyCustomStylesheet","Allow custom UI themes");Runtime.experiments.register("blackboxJSFramesOnTimeline","Blackbox JavaScript frames on Timeline",true);Runtime.experiments.register("colorContrastRatio","Contrast ratio line in color picker",true);Runtime.experiments.register("cpuThrottling","CPU throttling",true);Runtime.experiments.register("deviceMode","Device mode",true);Runtime.experiments.register("emptySourceMapAutoStepping","Empty sourcemap auto-stepping");Runtime.experiments.register("fileSystemInspection","FileSystem inspection");Runtime.experiments.register("gpuTimeline","GPU data on timeline",true);Runtime.experiments.register("inputEventsOnTimelineOverview","Input events on Timeline overview",true);Runtime.experiments.register("layersPanel","Layers panel");Runtime.experiments.register("layoutEditor","Layout editor",true);Runtime.experiments.register("materialDesign","Material design");Runtime.experiments.register("multipleTimelineViews","Multiple main views on Timeline",true);Runtime.experiments.register("networkRequestHeadersFilterInDetailsView","Network request headers filter in details view",true);Runtime.experiments.register("networkRequestsOnTimeline","Network requests on Timeline",true);Runtime.experiments.register("privateScriptInspection","Private script inspection");Runtime.experiments.register("promiseTracker","Promise inspector");Runtime.experiments.register("requestBlocking","Request blocking",true);Runtime.experiments.register("timelineShowAllEvents","Show all events on Timeline",true);Runtime.experiments.register("timelineLatencyInfo","Show input latency events on the Timeline",true);Runtime.experiments.register("securityPanel","Security panel");Runtime.experiments.register("showPrimaryLoadWaterfallInNetworkTimeline","Show primary load waterfall in Network timeline",true);Runtime.experiments.register("stepIntoAsync","Step into async");Runtime.experiments.register("timelineFlowEvents","Timeline flow events",true);Runtime.experiments.register("timelineInvalidationTracking","Timeline invalidation tracking",true);Runtime.experiments.register("timelineRecordingPerspectives","Timeline recording perspectives UI");Runtime.experiments.register("timelineTracingJSProfile","Timeline tracing based JS profiler",true);Runtime.experiments.cleanUpStaleExperiments();if(InspectorFrontendHost.isUnderTest()){var testPath=JSON.parse(prefs["testPath"]||"\"\"");if(testPath.indexOf("debugger/promise")!==-1)
Runtime.experiments.enableForTest("promiseTracker");if(testPath.indexOf("layers/")!==-1)
Runtime.experiments.enableForTest("layersPanel");if(testPath.indexOf("timeline/")!==-1||testPath.indexOf("layers/")!==-1)
Runtime.experiments.enableForTest("layersPanel");if(testPath.indexOf("security/")!==-1)
Runtime.experiments.enableForTest("securityPanel");}
Runtime.experiments.setDefaultExperiments(["deviceMode","securityPanel"]);},_createAppUI:function()
{console.timeStamp("Main._createApp");WebInspector.isolatedFileSystemManager=new WebInspector.IsolatedFileSystemManager();WebInspector.isolatedFileSystemManager.initialize(this._didInitializeFileSystemManager.bind(this));var themeSetting=WebInspector.settings.createSetting("uiTheme","default");WebInspector.initializeUIUtils(document,themeSetting);themeSetting.addChangeListener(WebInspector.reload.bind(WebInspector));WebInspector.installComponentRootStyles((document.body));this._addMainEventListeners(document);var canDock=!!Runtime.queryParam("can_dock");WebInspector.zoomManager=new WebInspector.ZoomManager(window,InspectorFrontendHost);WebInspector.inspectorView=new WebInspector.InspectorView();WebInspector.ContextMenu.initialize();WebInspector.ContextMenu.installHandler(document);WebInspector.Tooltip.installHandler(document);WebInspector.dockController=new WebInspector.DockController(canDock);WebInspector.overridesSupport=new WebInspector.OverridesSupport();WebInspector.emulatedDevicesList=new WebInspector.EmulatedDevicesList();WebInspector.multitargetConsoleModel=new WebInspector.MultitargetConsoleModel();WebInspector.multitargetNetworkManager=new WebInspector.MultitargetNetworkManager();WebInspector.shortcutsScreen=new WebInspector.ShortcutsScreen();WebInspector.shortcutsScreen.section(WebInspector.UIString("Elements Panel"));WebInspector.shortcutsScreen.section(WebInspector.UIString("Styles Pane"));WebInspector.shortcutsScreen.section(WebInspector.UIString("Debugger"));WebInspector.shortcutsScreen.section(WebInspector.UIString("Console"));WebInspector.fileManager=new WebInspector.FileManager();WebInspector.workspace=new WebInspector.Workspace();WebInspector.fileSystemMapping=new WebInspector.FileSystemMapping();var fileSystemWorkspaceBinding=new WebInspector.FileSystemWorkspaceBinding(WebInspector.isolatedFileSystemManager,WebInspector.workspace);WebInspector.networkMapping=new WebInspector.NetworkMapping(WebInspector.targetManager,WebInspector.workspace,fileSystemWorkspaceBinding,WebInspector.fileSystemMapping);WebInspector.networkProjectManager=new WebInspector.NetworkProjectManager(WebInspector.targetManager,WebInspector.workspace,WebInspector.networkMapping);WebInspector.presentationConsoleMessageHelper=new WebInspector.PresentationConsoleMessageHelper(WebInspector.workspace);WebInspector.cssWorkspaceBinding=new WebInspector.CSSWorkspaceBinding(WebInspector.targetManager,WebInspector.workspace,WebInspector.networkMapping);WebInspector.debuggerWorkspaceBinding=new WebInspector.DebuggerWorkspaceBinding(WebInspector.targetManager,WebInspector.workspace,WebInspector.networkMapping);WebInspector.breakpointManager=new WebInspector.BreakpointManager(null,WebInspector.workspace,WebInspector.networkMapping,WebInspector.targetManager,WebInspector.debuggerWorkspaceBinding);WebInspector.extensionServer=new WebInspector.ExtensionServer();new WebInspector.OverlayController();new WebInspector.ExecutionContextSelector(WebInspector.targetManager,WebInspector.context);var autoselectPanel=WebInspector.UIString("auto");var openAnchorLocationSetting=WebInspector.settings.createSetting("openLinkHandler",autoselectPanel);WebInspector.openAnchorLocationRegistry=new WebInspector.HandlerRegistry(openAnchorLocationSetting);WebInspector.openAnchorLocationRegistry.registerHandler(autoselectPanel,function(){return false;});WebInspector.Linkifier.setLinkHandler(new WebInspector.HandlerRegistry.LinkHandler());new WebInspector.Main.PauseListener();new WebInspector.Main.InspectedNodeRevealer();new WebInspector.NetworkPanelIndicator();new WebInspector.SourcesPanelIndicator();WebInspector.domBreakpointsSidebarPane=new WebInspector.DOMBreakpointsSidebarPane();WebInspector.actionRegistry=new WebInspector.ActionRegistry();WebInspector.shortcutRegistry=new WebInspector.ShortcutRegistry(WebInspector.actionRegistry,document);WebInspector.ShortcutsScreen.registerShortcuts();this._registerForwardedShortcuts();this._registerMessageSinkListener();var appExtension=self.runtime.extensions(WebInspector.AppProvider)[0];appExtension.instancePromise().then(this._showAppUI.bind(this));},_showAppUI:function(appProvider)
{var app=(appProvider).createApp();WebInspector.dockController.initialize();console.timeStamp("Main._presentUI");app.presentUI(document,this._didPresentAppUI.bind(this));var toggleSearchNodeAction=WebInspector.actionRegistry.action("elements.toggle-element-search");InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.EnterInspectElementMode,toggleSearchNodeAction.execute.bind(toggleSearchNodeAction),this);WebInspector.inspectorView.createToolbars();InspectorFrontendHost.loadCompleted();var extensions=self.runtime.extensions(WebInspector.QueryParamHandler);for(var extension of extensions){var value=Runtime.queryParam(extension.descriptor()["name"]);if(value!==null)
extension.instancePromise().then(handleQueryParam.bind(null,value));}
function handleQueryParam(value,handler)
{handler.handleQueryParam(value);}
this._appUIShown=true;if(this._fileSystemManagerInitialized){setTimeout(this._createConnection.bind(this),0);}},_didInitializeFileSystemManager:function()
{this._fileSystemManagerInitialized=true;if(this._appUIShown)
this._createConnection();},_createConnection:function()
{console.timeStamp("Main._createConnection");if(Runtime.queryParam("ws")){var ws="ws://"+Runtime.queryParam("ws");WebInspector.WebSocketConnection.Create(ws,this._connectionEstablished.bind(this));return;}
if(!InspectorFrontendHost.isHostedMode()){this._connectionEstablished(new WebInspector.MainConnection());return;}
this._connectionEstablished(new WebInspector.StubConnection());},_connectionEstablished:function(connection)
{console.timeStamp("Main._connectionEstablished");this._mainConnection=connection;connection.addEventListener(InspectorBackendClass.Connection.Events.Disconnected,onDisconnected);function onDisconnected(event)
{if(WebInspector._disconnectedScreenWithReasonWasShown)
return;WebInspector.RemoteDebuggingTerminatedScreen.show(event.data.reason);}
var targetType=Runtime.queryParam("isSharedWorker")?WebInspector.Target.Type.ServiceWorker:WebInspector.Target.Type.Page;this._mainTarget=WebInspector.targetManager.createTarget(WebInspector.UIString("Main"),targetType,connection,null);console.timeStamp("Main._mainTargetCreated");this._registerShortcuts();var main=this;this._mainTarget.registerInspectorDispatcher(this);InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.ReloadInspectedPage,this._reloadInspectedPage,this);if(this._mainTarget.isServiceWorker())
this._mainTarget.runtimeAgent().run();if(this._appUIPresented)
this._initOverrides();},_didPresentAppUI:function()
{this._appUIPresented=true;if(this._mainTarget)
this._initOverrides();},_initOverrides:function()
{WebInspector.overridesSupport.init(this._mainTarget,this._overridesReady.bind(this));},_overridesReady:function()
{if(!WebInspector.dockController.canDock()&&WebInspector.overridesSupport.emulationEnabled())
WebInspector.inspectorView.showViewInDrawer("emulation",true);this._mainTarget.inspectorAgent().enable(inspectorAgentEnableCallback);function inspectorAgentEnableCallback()
{console.timeStamp("Main.inspectorAgentEnableCallback");WebInspector.notifications.dispatchEventToListeners(WebInspector.NotificationService.Events.InspectorAgentEnabledForTests);setTimeout(lateInitialization,0);}
function lateInitialization()
{WebInspector.extensionServer.initializeExtensions();}},_registerForwardedShortcuts:function()
{var forwardedActions=["main.toggle-dock","debugger.toggle-breakpoints-active","debugger.toggle-pause"];var actionKeys=WebInspector.shortcutRegistry.keysForActions(forwardedActions).map(WebInspector.KeyboardShortcut.keyCodeAndModifiersFromKey);InspectorFrontendHost.setWhitelistedShortcuts(JSON.stringify(actionKeys));},_registerMessageSinkListener:function()
{WebInspector.console.addEventListener(WebInspector.Console.Events.MessageAdded,messageAdded);function messageAdded(event)
{var message=(event.data);if(message.show)
WebInspector.console.show();}},_documentClick:function(event)
{var target=event.target;if(target.shadowRoot)
target=event.deepElementFromPoint();if(!target)
return;var anchor=target.enclosingNodeOrSelfWithNodeName("a");if(!anchor||!anchor.href)
return;event.consume(true);if(anchor.preventFollow)
return;function followLink()
{if(WebInspector.isBeingEdited(target))
return;if(WebInspector.openAnchorLocationRegistry.dispatch({url:anchor.href,lineNumber:anchor.lineNumber}))
return;var uiSourceCode=WebInspector.networkMapping.uiSourceCodeForURLForAnyTarget(anchor.href);if(uiSourceCode){WebInspector.Revealer.reveal(uiSourceCode.uiLocation(anchor.lineNumber||0,anchor.columnNumber||0));return;}
var resource=WebInspector.resourceForURL(anchor.href);if(resource){WebInspector.Revealer.reveal(resource);return;}
var request=WebInspector.NetworkLog.requestForURL(anchor.href);if(request){WebInspector.Revealer.reveal(request);return;}
InspectorFrontendHost.openInNewTab(anchor.href);}
if(WebInspector.followLinkTimeout)
clearTimeout(WebInspector.followLinkTimeout);if(anchor.preventFollowOnDoubleClick){if(event.detail===1)
WebInspector.followLinkTimeout=setTimeout(followLink,333);return;}
if(!anchor.classList.contains("webkit-html-external-link"))
followLink();else
InspectorFrontendHost.openInNewTab(anchor.href);},_registerShortcuts:function()
{var shortcut=WebInspector.KeyboardShortcut;var section=WebInspector.shortcutsScreen.section(WebInspector.UIString("All Panels"));var keys=[shortcut.makeDescriptor("[",shortcut.Modifiers.CtrlOrMeta),shortcut.makeDescriptor("]",shortcut.Modifiers.CtrlOrMeta)];section.addRelatedKeys(keys,WebInspector.UIString("Go to the panel to the left/right"));keys=[shortcut.makeDescriptor("[",shortcut.Modifiers.CtrlOrMeta|shortcut.Modifiers.Alt),shortcut.makeDescriptor("]",shortcut.Modifiers.CtrlOrMeta|shortcut.Modifiers.Alt)];section.addRelatedKeys(keys,WebInspector.UIString("Go back/forward in panel history"));var toggleConsoleLabel=WebInspector.UIString("Show console");section.addKey(shortcut.makeDescriptor(shortcut.Keys.Tilde,shortcut.Modifiers.Ctrl),toggleConsoleLabel);section.addKey(shortcut.makeDescriptor(shortcut.Keys.Esc),WebInspector.UIString("Toggle drawer"));if(WebInspector.dockController.canDock()){section.addKey(shortcut.makeDescriptor("M",shortcut.Modifiers.CtrlOrMeta|shortcut.Modifiers.Shift),WebInspector.UIString("Toggle device mode"));section.addKey(shortcut.makeDescriptor("D",shortcut.Modifiers.CtrlOrMeta|shortcut.Modifiers.Shift),WebInspector.UIString("Toggle dock side"));}
section.addKey(shortcut.makeDescriptor("f",shortcut.Modifiers.CtrlOrMeta),WebInspector.UIString("Search"));var advancedSearchShortcutModifier=WebInspector.isMac()?WebInspector.KeyboardShortcut.Modifiers.Meta|WebInspector.KeyboardShortcut.Modifiers.Alt:WebInspector.KeyboardShortcut.Modifiers.Ctrl|WebInspector.KeyboardShortcut.Modifiers.Shift;var advancedSearchShortcut=shortcut.makeDescriptor("f",advancedSearchShortcutModifier);section.addKey(advancedSearchShortcut,WebInspector.UIString("Search across all sources"));var inspectElementModeShortcuts=WebInspector.shortcutRegistry.shortcutDescriptorsForAction("elements.toggle-element-search");section.addKey(inspectElementModeShortcuts[0],WebInspector.UIString("Select node to inspect"));var openResourceShortcut=WebInspector.KeyboardShortcut.makeDescriptor("p",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta);section.addKey(openResourceShortcut,WebInspector.UIString("Go to source"));if(WebInspector.isMac()){keys=[shortcut.makeDescriptor("g",shortcut.Modifiers.Meta),shortcut.makeDescriptor("g",shortcut.Modifiers.Meta|shortcut.Modifiers.Shift)];section.addRelatedKeys(keys,WebInspector.UIString("Find next/previous"));}},_postDocumentKeyDown:function(event)
{if(event.handled)
return;var target=event.deepActiveElement();if(target){var anchor=target.enclosingNodeOrSelfWithNodeName("a");if(anchor&&anchor.preventFollow)
event.preventDefault();}
if(!WebInspector.Dialog.hasInstance()&&WebInspector.inspectorView.currentPanel()){WebInspector.inspectorView.currentPanel().handleShortcut(event);if(event.handled){event.consume(true);return;}}
WebInspector.shortcutRegistry.handleShortcut(event);},_documentCanCopy:function(event)
{var panel=WebInspector.inspectorView.currentPanel();if(panel&&panel["handleCopyEvent"])
event.preventDefault();},_documentCopy:function(event)
{var panel=WebInspector.inspectorView.currentPanel();if(panel&&panel["handleCopyEvent"])
panel["handleCopyEvent"](event);},_documentCut:function(event)
{var panel=WebInspector.inspectorView.currentPanel();if(panel&&panel["handleCutEvent"])
panel["handleCutEvent"](event);},_documentPaste:function(event)
{var panel=WebInspector.inspectorView.currentPanel();if(panel&&panel["handlePasteEvent"])
panel["handlePasteEvent"](event);},_contextMenuEventFired:function(event)
{if(event.handled||event.target.classList.contains("popup-glasspane"))
event.preventDefault();},_addMainEventListeners:function(document)
{document.addEventListener("keydown",this._postDocumentKeyDown.bind(this),false);document.addEventListener("beforecopy",this._documentCanCopy.bind(this),true);document.addEventListener("copy",this._documentCopy.bind(this),false);document.addEventListener("cut",this._documentCut.bind(this),false);document.addEventListener("paste",this._documentPaste.bind(this),false);document.addEventListener("contextmenu",this._contextMenuEventFired.bind(this),true);document.addEventListener("click",this._documentClick.bind(this),false);},_reloadInspectedPage:function(event)
{var hard=(event.data);WebInspector.Main._reloadPage(hard);},inspect:function(payload,hints)
{var object=this._mainTarget.runtimeModel.createRemoteObject(payload);if(object.isNode()){WebInspector.Revealer.revealPromise(object).then(object.release.bind(object));return;}
if(object.type==="function"){WebInspector.RemoteFunction.objectAsFunction(object).targetFunctionDetails().then(didGetDetails);return;}
function didGetDetails(response)
{object.release();if(!response||!response.location)
return;WebInspector.Revealer.reveal(WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation(response.location));}
if(hints.copyToClipboard)
InspectorFrontendHost.copyText(object.value);object.release();},detached:function(reason)
{WebInspector._disconnectedScreenWithReasonWasShown=true;WebInspector.RemoteDebuggingTerminatedScreen.show(reason);},targetCrashed:function()
{var debuggerModel=WebInspector.DebuggerModel.fromTarget(this._mainTarget);if(debuggerModel)
WebInspector.TargetCrashedScreen.show(debuggerModel);},evaluateForTestInFrontend:function(callId,script)
{if(!InspectorFrontendHost.isUnderTest())
return;function invokeMethod()
{try{script=script+"//# sourceURL=evaluateInWebInspector"+callId+".js";window.eval(script);}catch(e){console.error(e.stack);}}
this._mainConnection.runAfterPendingDispatches(invokeMethod);}}
WebInspector.Main.ReloadActionDelegate=function()
{}
WebInspector.Main.ReloadActionDelegate.prototype={handleAction:function(context,actionId)
{switch(actionId){case"main.reload":WebInspector.Main._reloadPage(false);return true;case"main.hard-reload":WebInspector.Main._reloadPage(true);return true;case"main.debug-reload":WebInspector.reload();return true;}
return false;}}
WebInspector.Main.ZoomActionDelegate=function()
{}
WebInspector.Main.ZoomActionDelegate.prototype={handleAction:function(context,actionId)
{if(InspectorFrontendHost.isHostedMode())
return false;switch(actionId){case"main.zoom-in":InspectorFrontendHost.zoomIn();return true;case"main.zoom-out":InspectorFrontendHost.zoomOut();return true;case"main.zoom-reset":InspectorFrontendHost.resetZoom();return true;}
return false;}}
WebInspector.Main.SearchActionDelegate=function()
{}
WebInspector.Main.SearchActionDelegate.prototype={handleAction:function(context,actionId)
{var searchableView=WebInspector.SearchableView.fromElement(WebInspector.currentFocusElement())||WebInspector.inspectorView.currentPanel().searchableView();if(!searchableView)
return false;switch(actionId){case"main.search-in-panel.find":return searchableView.handleFindShortcut();case"main.search-in-panel.cancel":return searchableView.handleCancelSearchShortcut();case"main.search-in-panel.find-next":return searchableView.handleFindNextShortcut();case"main.search-in-panel.find-previous":return searchableView.handleFindPreviousShortcut();}
return false;}}
WebInspector.Main._reloadPage=function(hard)
{if(!WebInspector.targetManager.hasTargets())
return;if(WebInspector.targetManager.mainTarget().isServiceWorker())
return;WebInspector.targetManager.reloadPage(hard);}
WebInspector.Main._addWebSocketTarget=function(ws)
{function callback(connection)
{WebInspector.targetManager.createTarget(ws,WebInspector.Target.Type.Page,connection,null);}
new WebInspector.WebSocketConnection(ws,callback);}
WebInspector.Main.WarningErrorCounter=function()
{WebInspector.Main.WarningErrorCounter._instanceForTest=this;this._counter=createElement("div");this._counter.addEventListener("click",WebInspector.console.show.bind(WebInspector.console),false);this._toolbarItem=new WebInspector.ToolbarItem(this._counter);var shadowRoot=WebInspector.createShadowRootWithCoreStyles(this._counter,"main/errorWarningCounter.css");this._errors=this._createItem(shadowRoot,"error-icon");this._revokedErrors=this._createItem(shadowRoot,"revokedError-icon");this._warnings=this._createItem(shadowRoot,"warning-icon");this._titles=[];WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared,this._update,this);WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded,this._update,this);WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageUpdated,this._update,this);this._update();}
WebInspector.Main.WarningErrorCounter.prototype={_createItem:function(shadowRoot,iconType)
{var item=createElementWithClass("span","counter-item");var icon=item.createChild("label","","dt-icon-label");icon.type=iconType;var text=icon.createChild("span");shadowRoot.appendChild(item);return{item:item,text:text};},_updateItem:function(item,count,first,title)
{item.item.classList.toggle("hidden",!count);item.item.classList.toggle("counter-item-first",first);item.text.textContent=count;if(count)
this._titles.push(title);},_update:function()
{var errors=0;var revokedErrors=0;var warnings=0;var targets=WebInspector.targetManager.targets();for(var i=0;i<targets.length;++i){errors+=targets[i].consoleModel.errors();revokedErrors+=targets[i].consoleModel.revokedErrors();warnings+=targets[i].consoleModel.warnings();}
this._titles=[];this._toolbarItem.setVisible(!!(errors||revokedErrors||warnings));this._updateItem(this._errors,errors,false,WebInspector.UIString(errors===1?"%d error":"%d errors",errors));this._updateItem(this._revokedErrors,revokedErrors,!errors,WebInspector.UIString(revokedErrors===1?"%d handled promise rejection":"%d handled promise rejections",revokedErrors));this._updateItem(this._warnings,warnings,!errors&&!revokedErrors,WebInspector.UIString(warnings===1?"%d warning":"%d warnings",warnings));this._counter.title=this._titles.join(", ");WebInspector.inspectorView.toolbarItemResized();},item:function()
{return this._toolbarItem;}}
WebInspector.Main.MainMenuItem=function()
{this._item=new WebInspector.ToolbarButton(WebInspector.UIString("Customize and control DevTools"),"menu-toolbar-item");this._item.addEventListener("mousedown",this._mouseDown,this);}
WebInspector.Main.MainMenuItem.prototype={item:function()
{return this._item;},_mouseDown:function(event)
{var contextMenu=new WebInspector.ContextMenu((event.data),true,this._item.element.totalOffsetLeft(),this._item.element.totalOffsetTop()+this._item.element.offsetHeight);if(WebInspector.dockController.canDock()){var dockItemElement=createElementWithClass("div","flex-centered flex-auto");var titleElement=dockItemElement.createChild("span","flex-auto");titleElement.textContent=WebInspector.UIString("Dock side");var toggleDockSideShorcuts=WebInspector.shortcutRegistry.shortcutDescriptorsForAction("main.toggle-dock");titleElement.title=WebInspector.UIString("Placement of DevTools relative to the page. (%s to restore last position)",toggleDockSideShorcuts[0].name);dockItemElement.appendChild(titleElement);var dockItemToolbar=new WebInspector.Toolbar("",dockItemElement);dockItemToolbar.makeBlueOnHover();var undock=new WebInspector.ToolbarToggle(WebInspector.UIString("Undock into separate window"),"dock-toolbar-item-undock");var bottom=new WebInspector.ToolbarToggle(WebInspector.UIString("Dock to bottom"),"dock-toolbar-item-bottom");var right=new WebInspector.ToolbarToggle(WebInspector.UIString("Dock to right"),"dock-toolbar-item-right");undock.addEventListener("mouseup",setDockSide.bind(null,WebInspector.DockController.State.Undocked));bottom.addEventListener("mouseup",setDockSide.bind(null,WebInspector.DockController.State.DockedToBottom));right.addEventListener("mouseup",setDockSide.bind(null,WebInspector.DockController.State.DockedToRight));undock.setToggled(WebInspector.dockController.dockSide()===WebInspector.DockController.State.Undocked);bottom.setToggled(WebInspector.dockController.dockSide()===WebInspector.DockController.State.DockedToBottom);right.setToggled(WebInspector.dockController.dockSide()===WebInspector.DockController.State.DockedToRight);dockItemToolbar.appendToolbarItem(undock);dockItemToolbar.appendToolbarItem(bottom);dockItemToolbar.appendToolbarItem(right);contextMenu.appendCustomItem(dockItemElement);contextMenu.appendSeparator();}
function setDockSide(side)
{WebInspector.dockController.setDockSide(side);contextMenu.discard();}
contextMenu.appendAction("main.toggle-drawer",WebInspector.inspectorView.drawerVisible()?WebInspector.UIString("Hide console"):WebInspector.UIString("Show console"));contextMenu.appendItemsAtLocation("mainMenu");contextMenu.show();}}
WebInspector.NetworkPanelIndicator=function()
{var manager=WebInspector.multitargetNetworkManager;manager.addEventListener(WebInspector.MultitargetNetworkManager.Events.ConditionsChanged,updateVisibility);var blockedURLsSetting=WebInspector.moduleSetting("blockedURLs");blockedURLsSetting.addChangeListener(updateVisibility);updateVisibility();function updateVisibility()
{if(manager.isThrottling()){WebInspector.inspectorView.setPanelIcon("network","warning-icon",WebInspector.UIString("Network throttling is enabled"));}else if(blockedURLsSetting.get().length){WebInspector.inspectorView.setPanelIcon("network","warning-icon",WebInspector.UIString("Requests may be blocked"));}else{WebInspector.inspectorView.setPanelIcon("network","","");}}}
WebInspector.SourcesPanelIndicator=function()
{WebInspector.moduleSetting("javaScriptDisabled").addChangeListener(javaScriptDisabledChanged);javaScriptDisabledChanged();function javaScriptDisabledChanged()
{var javaScriptDisabled=WebInspector.moduleSetting("javaScriptDisabled").get();if(javaScriptDisabled){WebInspector.inspectorView.setPanelIcon("sources","warning-icon",WebInspector.UIString("JavaScript is disabled"));}else{WebInspector.inspectorView.setPanelIcon("sources","","");}}}
WebInspector.Main.PauseListener=function()
{WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel,WebInspector.DebuggerModel.Events.DebuggerPaused,this._debuggerPaused,this);}
WebInspector.Main.PauseListener.prototype={_debuggerPaused:function(event)
{WebInspector.targetManager.removeModelListener(WebInspector.DebuggerModel,WebInspector.DebuggerModel.Events.DebuggerPaused,this._debuggerPaused,this);var debuggerPausedDetails=(event.data);var debuggerModel=(event.target);WebInspector.context.setFlavor(WebInspector.Target,debuggerModel.target());WebInspector.Revealer.reveal(debuggerPausedDetails);}}
WebInspector.Main.InspectedNodeRevealer=function()
{WebInspector.targetManager.addModelListener(WebInspector.DOMModel,WebInspector.DOMModel.Events.NodeInspected,this._inspectNode,this);}
WebInspector.Main.InspectedNodeRevealer.prototype={_inspectNode:function(event)
{var deferredNode=(event.data);WebInspector.Revealer.reveal(deferredNode);}}
WebInspector.RemoteDebuggingTerminatedScreen=function(reason)
{WebInspector.VBox.call(this,true);this.registerRequiredCSS("main/remoteDebuggingTerminatedScreen.css");var message=this.contentElement.createChild("div","message");message.createChild("span").textContent=WebInspector.UIString("Debugging connection was closed. Reason: ");message.createChild("span","reason").textContent=reason;this.contentElement.createChild("div","message").textContent=WebInspector.UIString("Reconnect when ready by reopening DevTools.");}
WebInspector.RemoteDebuggingTerminatedScreen.show=function(reason)
{var dialog=new WebInspector.Dialog();dialog.setWrapsContent(true);dialog.addCloseButton();dialog.setDimmed(true);new WebInspector.RemoteDebuggingTerminatedScreen(reason).show(dialog.element);dialog.show();}
WebInspector.RemoteDebuggingTerminatedScreen.prototype={__proto__:WebInspector.VBox.prototype}
WebInspector.TargetCrashedScreen=function(hideCallback)
{WebInspector.VBox.call(this,true);this.registerRequiredCSS("main/targetCrashedScreen.css");this.contentElement.createChild("div","message").textContent=WebInspector.UIString("DevTools was disconnected from the page.");this.contentElement.createChild("div","message").textContent=WebInspector.UIString("Once page is reloaded, DevTools will automatically reconnect.");this._hideCallback=hideCallback;}
WebInspector.TargetCrashedScreen.show=function(debuggerModel)
{var dialog=new WebInspector.Dialog();dialog.setWrapsContent(true);dialog.addCloseButton();dialog.setDimmed(true);var hideBound=dialog.detach.bind(dialog,false);debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,hideBound);new WebInspector.TargetCrashedScreen(onHide).show(dialog.element);dialog.show();function onHide()
{debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,hideBound);}}
WebInspector.TargetCrashedScreen.prototype={willHide:function()
{this._hideCallback.call(null);},__proto__:WebInspector.VBox.prototype}
new WebInspector.Main();;applicationDescriptor=[{"name":"ui_lazy"},{"name":"promises"},{"name":"accessibility"},{"name":"sources"},{"name":"devices"},{"name":"diff"},{"name":"audits"},{"type":"autostart","name":"bindings"},{"name":"snippets"},{"name":"layers"},{"name":"console"},{"name":"network"},{"type":"remote","name":"cm_modes"},{"type":"autostart","name":"platform"},{"name":"animation"},{"name":"source_frame"},{"type":"autostart","name":"main"},{"name":"resources"},{"type":"worker","name":"script_formatter_worker"},{"name":"elements"},{"type":"autostart","name":"workspace"},{"name":"timeline"},{"type":"worker","name":"heap_snapshot_worker"},{"type":"autostart","name":"host"},{"type":"autostart","name":"emulation"},{"type":"autostart","name":"ui"},{"type":"autostart","name":"sdk"},{"type":"worker","name":"temp_storage_shared_worker"},{"name":"sass"},{"name":"settings"},{"name":"components_lazy"},{"name":"profiler"},{"type":"remote","name":"screencast","condition":"remoteFrontend"},{"type":"autostart","name":"extensions"},{"type":"autostart","name":"common"},{"type":"autostart","name":"components"},{"name":"security"},{"type":"remote","name":"emulated_devices"}];Runtime.cachedResources["ui/checkboxTextLabel.css"]="/*\n * Copyright (c) 2014 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n:host {\n    padding: 0;\n    margin: 0;\n    display: inline-flex;\n    flex-shrink: 0;\n    align-items: center !important;\n}\n\ninput {\n    height: 12px;\n    width: 12px;\n    flex-shrink: 0;\n}\n\ninput.dt-checkbox-themed {\n    -webkit-appearance: none;\n    margin: 0 5px auto 2px;\n    border: 1px solid rgb(45, 45, 45);\n    border-radius: 3px;\n    background-color: rgb(102, 102, 102);\n    position: relative;\n    top: 1px;\n}\n\ninput.dt-checkbox-themed:after {\n    content: '';\n    line-height: 10px;\n    position: absolute;\n    cursor: pointer;\n    width: 12px;\n    height: 12px;\n    background: none;\n}\n\ninput.dt-checkbox-themed:checked:after {\n    background-color: #333;\n}\n\ninput.dt-checkbox-themed:after {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-size: 352px 168px;\n    -webkit-mask-position: -128px -110px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\ninput.dt-checkbox-themed:after {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n\n} /* media */\n\n/*# sourceURL=ui/checkboxTextLabel.css */";Runtime.cachedResources["ui/closeButton.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\ndiv {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 168px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\ndiv {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.close-button {\n    width: 14px;\n    height: 14px;\n    background-position: -128px -96px;\n    cursor: default;\n}\n\n.close-button:hover {\n    background-position: -96px -96px;\n}\n\n.close-button:active {\n    background-position: -111px -96px;\n}\n\n.close-button-gray {\n    width: 13px;\n    height: 13px;\n    background-position: -175px -96px;\n}\n\n.close-button-gray:hover {\n    background-position: -143px -96px;\n}\n\n.close-button-gray:active {\n    background-position: -160px -96px;\n}\n\n/*# sourceURL=ui/closeButton.css */";Runtime.cachedResources["ui/colorSwatch.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n:host {\n  white-space: nowrap;\n}\n\n.color-swatch {\n    position: relative;\n    margin-left: 1px;\n    margin-right: 2px;\n    width: 10px;\n    height: 10px;\n    top: 1px;\n    display: inline-block;\n    -webkit-user-select: none;\n    background-image: url(Images/checker.png);\n    line-height: 10px;\n}\n\n.color-swatch-inner {\n    width: 100%;\n    height: 100%;\n    display: inline-block;\n    border: 1px solid rgba(128, 128, 128, 0.6);\n}\n\n.color-swatch-inner:hover {\n    border: 1px solid rgba(64, 64, 64, 0.8);\n}\n\n\n/*# sourceURL=ui/colorSwatch.css */";Runtime.cachedResources["ui/dialog.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n:host {\n    position: absolute;\n    border: 1px solid rgb(204, 204, 204);\n    box-shadow: rgb(140, 140, 140) 0 3px 14px;\n    background: white;\n    justify-content: flex-start;\n    align-items: stretch;\n}\n\n.widget {\n    display: flex;\n    flex: auto;\n    justify-content: flex-start;\n    align-items: stretch;\n}\n\n:host-context(.wraps-content) {\n    justify-content: center;\n    align-items: flex-start;\n    overflow: hidden;\n}\n\n:host-context(.wraps-content) .widget {\n    flex: none !important;\n    justify-content: center;\n    align-items: center;\n}\n\n.dialog-close-button {\n    position: absolute;\n    right: 9px;\n    top: 9px;\n}\n/*# sourceURL=ui/dialog.css */";Runtime.cachedResources["ui/dropTarget.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n:host {\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    display: flex;\n    background-color: rgba(255,255,255,0.8);\n    z-index: 1000;\n}\n\n.drop-target-message {\n    flex: auto;\n    font-size: 30px;\n    color: #999;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    margin: 20px;\n    border: 4px dashed #ddd;\n    pointer-events: none;\n}\n\n/*# sourceURL=ui/dropTarget.css */";Runtime.cachedResources["ui/emptyWidget.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.empty-view {\n    font-size: 24px;\n    color: rgb(75%, 75%, 75%);\n    font-weight: bold;\n    padding: 10px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n\n/*# sourceURL=ui/emptyWidget.css */";Runtime.cachedResources["ui/filter.css"]="/*\n * Copyright (C) 2013 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n.filter-bar {\n    background-color: #f3f3f3;\n    padding: 4px 0 4px 0;\n    flex: none;\n    flex-wrap: wrap;\n    align-items: center;\n    border-bottom: 1px solid #dadada;\n}\n\n.filter-text-filter {\n    display: inline-flex;\n    margin-left: 1px;\n    margin-right: 2px;\n    min-width: 40px;\n    max-width: 200px;\n    height: 24px;\n    align-items: center;\n}\n\n.filter-text-filter label {\n    margin: auto 0;\n}\n\n.filter-bitset-filter {\n    padding: 2px;\n    display: inline-flex;\n    overflow: hidden;\n    height: 24px;\n    position: relative;\n}\n\n.filter-bitset-filter li {\n    display: inline-block;\n    flex: none;\n    margin: auto 2px;\n    padding: 3px 6px 3px 3px;\n    background: transparent;\n    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;\n    border-radius: 8px;\n    overflow: hidden;\n}\n\n.filter-bitset-filter-divider {\n    background-color: #ccc;\n    height: 16px;\n    width: 1px;\n    margin: auto 2px;\n    display: inline-block;\n}\n\n.filter-bitset-filter li.selected,\n.filter-bitset-filter li:hover,\n.filter-bitset-filter li:active {\n    color: white;\n    text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;\n}\n\n.filter-bitset-filter li:hover {\n    background: rgba(0, 0, 0, 0.2);\n}\n\n.filter-bitset-filter li.selected {\n    background: rgba(0, 0, 0, 0.3);\n}\n\n.filter-bitset-filter li:active {\n    background: rgba(0, 0, 0, 0.5);\n}\n\n.filter-combobox-filter {\n    margin-left: 5px;\n    margin-right: 2px;\n    flex: 0 0 auto;\n    display: inline-block;\n}\n\n.filter-checkbox-filter {\n    padding-left: 4px;\n    padding-right: 2px;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    display: inline-flex;\n    vertical-align: middle;\n    height: 24px;\n    position: relative;\n}\n\n.filter-checkbox-filter > label {\n    display: flex;\n    margin: auto 0;\n}\n\n.filter-text-invalid {\n    background-color: rgb(255, 200, 200);\n}\n\n.filter-checkbox-filter .checkbox-filter-checkbox {\n    width: 10px;\n    height: 10px;\n    margin: auto 3px;\n    padding: 0;\n    border-radius: 2px;\n    border: solid 1px;\n    display: inline-block;\n    overflow: visible;\n    opacity: 0.8;\n    flex-shrink: 0;\n}\n\n.filter-input-field {\n    -webkit-appearance: none;\n    border: 1px solid rgb(163, 163, 163);\n    border-radius: 2px;\n    padding: 1px 3px 0;\n    margin: 0 0 0 1px;\n    width: 253px;\n    height: 20px;\n    line-height: 17px;\n    flex: 1;\n}\n\n/*# sourceURL=ui/filter.css */";Runtime.cachedResources["ui/infobar.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.infobar {\n    color: rgb(34, 34, 34);\n    display: flex;\n    flex: auto;\n    border-bottom: 1px solid rgb(171, 171, 171);\n    flex-direction: column;\n    align-items: stretch;\n}\n\n.infobar-warning {\n    background-color: rgb(253, 242, 192);\n}\n\n.infobar-info {\n    background-color: rgb(255, 255, 255);\n}\n\n.infobar-main-row {\n    display: flex;\n    flex-direction: row;\n    flex: auto;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    justify-content: space-between;\n    margin-right: 20px;\n    min-height: 25px;\n    align-items: center;\n    padding-left: 4px;\n}\n\n.infobar-main-row > * {\n    flex: none;\n    padding: 0 3px;\n}\n\n.infobar-main-title {\n    flex: auto;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n\n.infobar-details-rows {\n    padding-top: 5px;\n}\n\n.infobar-details-row {\n    display: flex;\n    flex-direction: column;\n    line-height: 18px;\n    padding: 5px 6px 6px 6px;\n}\n\n.close-button {\n    position: absolute;\n    top: 5px;\n    right: 6px;\n}\n\n.infobar-toggle {\n    color: hsl(214, 92%, 50%);\n    cursor: pointer;\n}\n\n.infobar-toggle:hover {\n    color: hsl(214, 92%, 30%);\n}\n\n.info-icon {\n    -webkit-mask-image: url(Images/ic_info_black_18dp.svg);\n    background-color: hsl(214, 92%, 50%);\n}\n\n.warning-icon {\n    -webkit-mask-image: url(Images/ic_warning_black_18dp.svg);\n    background-color: hsl(44, 92%, 50%);\n}\n\n.icon {\n    -webkit-mask-size: 18px 18px;\n    width: 18px;\n    height: 18px;\n}\n\n/*# sourceURL=ui/infobar.css */";Runtime.cachedResources["ui/inspectorCommon.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n* {\n    /* This is required for correct sizing of flex items because we rely\n     * on an old version of the flexbox spec.\n     * Longer-term we should remove this, see crbug.com/473625 */\n    min-width: 0;\n    min-height: 0;\n}\n\n:host-context(.platform-mac) .monospace,\n:host-context(.platform-mac) .source-code,\n.platform-mac .monospace,\n.platform-mac .source-code {\n    font-size: 11px !important;\n    font-family: Menlo, monospace;\n}\n\n:host-context(.platform-windows) .monospace,\n:host-context(.platform-windows) .source-code,\n.platform-windows .monospace,\n.platform-windows .source-code {\n    font-size: 12px !important;\n    font-family: Consolas, Lucida Console, monospace;\n}\n\n:host-context(.platform-linux) .monospace,\n:host-context(.platform-linux) .source-code,\n.platform-linux .monospace,\n.platform-linux .source-code {\n    font-size: 11px !important;\n    font-family: dejavu sans mono, monospace;\n}\n\n.source-code {\n    font-family: monospace;\n    font-size: 11px !important;\n    white-space: pre-wrap;\n}\n\n* {\n    box-sizing: border-box;\n}\n\n:focus {\n    outline: none;\n}\n\nimg {\n    -webkit-user-drag: none;\n}\n\niframe,\na img {\n    border: none;\n}\n\n.fill {\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n}\n\niframe.fill {\n    width: 100%;\n    height: 100%;\n}\n\n.widget {\n    position: relative;\n    flex: auto;\n}\n\n.hbox {\n    display: flex;\n    flex-direction: row !important;\n    position: relative;\n}\n\n.vbox {\n    display: flex;\n    flex-direction: column !important;\n    position: relative;\n}\n\n.flex-auto {\n    flex: auto;\n}\n\n.flex-auto-important {\n    flex: auto !important;\n}\n\n.flex-none {\n    flex: none;\n}\n\n.flex-centered {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n\niframe.widget {\n    position: absolute;\n    width: 100%;\n    height: 100%;\n    left: 0;\n    right: 0;\n    top: 0;\n    bottom: 0;\n}\n\n.hidden {\n    display: none !important;\n}\n\n.monospace {\n    font-size: 10px !important;\n    font-family: monospace;\n}\n\n.highlighted-search-result {\n    border-radius: 1px;\n    padding: 1px;\n    margin: -1px;\n    background-color: rgba(255, 255, 0, 0.8);\n}\n\n.-theme-with-dark-background .highlighted-search-result,\n:host-context(.-theme-with-dark-background) .highlighted-search-result {\n    background-color: hsl(133, 100%, 30%);\n    color: #333;\n}\n\n.link {\n    cursor: pointer;\n    text-decoration: underline;\n    color: rgb(17, 85, 204);\n}\n\nbutton,\ninput,\nselect {\n    font-family: inherit;\n    font-size: inherit;\n    color: inherit;\n}\n\ninput {\n    background-color: white;\n}\n\n:host-context(.-theme-with-dark-background) input[type=\"checkbox\"] {\n    -webkit-filter: invert(80%);\n}\n\ninput[type=\"search\"]:focus,\ninput[type=\"text\"]:focus {\n    outline: auto 5px -webkit-focus-ring-color;\n}\n\n\n.highlighted-search-result.current-search-result {\n    border-radius: 1px;\n    padding: 1px;\n    margin: -1px;\n    background-color: rgba(255, 127, 0, 0.8);\n}\n\n.dimmed {\n    opacity: 0.6;\n}\n\n.editing {\n    -webkit-user-select: text;\n    box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;\n    outline: 1px solid rgb(66%, 66%, 66%) !important;\n    background-color: white;\n    -webkit-user-modify: read-write-plaintext-only;\n    text-overflow: clip !important;\n    padding-left: 2px;\n    margin-left: -2px;\n    padding-right: 2px;\n    margin-right: -2px;\n    margin-bottom: -1px;\n    padding-bottom: 1px;\n    opacity: 1.0 !important;\n}\n\n.editing,\n.editing * {\n    color: #222 !important;\n    text-decoration: none !important;\n}\n\n.chrome-select {\n    -webkit-appearance: none;\n    -webkit-user-select: none;\n    border: 1px solid rgb(160, 160, 160);\n    border-radius: 2px;\n    box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08),\n    inset 0 1px 2px rgba(255, 255, 255, 0.75);\n    color: #444;\n    font: inherit;\n    margin: 0 1px 0 0;\n    outline: none;\n    text-shadow: 0 1px 0 rgb(240, 240, 240);\n    padding-right: 20px;\n    padding-left: 6px;\n    background-image: -webkit-image-set(url(Images/chromeSelect.png) 1x, url(Images/chromeSelect_2x.png) 2x), linear-gradient(#ededed, #ededed 38%, #dedede);\n    background-position: right center;\n    background-repeat: no-repeat;\n    min-height: 24px;\n}\n\n.chrome-select:enabled:hover {\n    background-image: -webkit-image-set(url(Images/chromeSelect.png) 1x, url(Images/chromeSelect_2x.png) 2x), linear-gradient(#f0f0f0, #f0f0f0 38%, #e0e0e0);\n    border-color: rgba(0, 0, 0, 0.3);\n    box-shadow: 0 1px 0 rgba(0, 0, 0, 0.12),\n    inset 0 1px 2px rgba(255, 255, 255, 0.95);\n    color: black;\n}\n\n.chrome-select:enabled:active {\n    background-image: -webkit-image-set(url(Images/chromeSelect.png) 1x, url(Images/chromeSelect_2x.png) 2x), linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7);\n    box-shadow: none;\n    text-shadow: none;\n}\n\n.chrome-select:enabled:focus {\n    /* OVERRIDE */\n    -webkit-transition: border-color 200ms;\n    /* We use border color because it follows the border radius (unlike outline).\n     * This is particularly noticeable on mac. */\n    border-color: rgb(77, 144, 254);\n    outline: none;\n}\n\nbody.inactive select.chrome-select,\n.chrome-select:disabled {\n    background-image: -webkit-image-set(url(Images/chromeDisabledSelect.png) 1x, url(Images/chromeDisabledSelect_2x.png) 2x), linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6);\n    border-color: rgba(80, 80, 80, 0.2);\n    box-shadow: 0 1px 0 rgba(80, 80, 80, 0.08),\n    inset 0 1px 2px rgba(255, 255, 255, 0.75);\n    color: #aaa;\n}\n\n:not(.platform-mac).-theme-with-dark-background ::-webkit-scrollbar,\n:host-context(:not(.platform-mac).-theme-with-dark-background) ::-webkit-scrollbar {\n    width: 14px;\n}\n\n:not(.platform-mac).-theme-with-dark-background ::-webkit-scrollbar-track,\n:host-context(:not(.platform-mac).-theme-with-dark-background) ::-webkit-scrollbar-track {\n    -webkit-box-shadow: inset 0 0 1px rgba(255,255,255,0.3);\n}\n\n:not(.platform-mac).-theme-with-dark-background ::-webkit-scrollbar-thumb,\n:host-context(:not(.platform-mac).-theme-with-dark-background) .-theme-with-dark-background ::-webkit-scrollbar-thumb {\n    border-radius: 2px;\n    background-color: #333;\n    -webkit-box-shadow: inset 0 0 1px rgba(255,255,255,0.5);\n}\n\n/*# sourceURL=ui/inspectorCommon.css */";Runtime.cachedResources["ui/inspectorSyntaxHighlight.css"]="/*\n * Copyright (C) 2009 Apple Inc.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1.  Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n * 3.  Neither the name of Apple Computer, Inc. (\"Apple\") nor the names of\n *     its contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n.cm-js-keyword {color: rgb(170, 13, 145);}\n.cm-js-number {color: rgb(28, 0, 207);}\n.cm-js-comment {color: rgb(0, 116, 0);}\n.cm-js-string {color: rgb(196, 26, 22);}\n.cm-js-string-2 {color: rgb(196, 26, 22);}\n\n.cm-css-keyword { color: rgb(7, 144, 154);}\n.cm-css-number {color: rgb(50, 0, 255);}\n.cm-css-comment {color: rgb(0, 116, 0);}\n.cm-css-def {color: rgb(200, 0, 0);}\n.cm-css-meta {color: rgb(200, 0, 0);}\n.cm-css-atom {color: rgb(7, 144, 154);}\n.cm-css-string {color: rgb(7, 144, 154);}\n.cm-css-string-2 {color: rgb(7, 144, 154);}\n.cm-css-link {color: rgb(7, 144, 154);}\n.cm-css-variable {color: rgb(200, 0, 0);}\n.cm-css-variable-2 {color: rgb(0, 0, 128);}\n.cm-css-property, .webkit-css-property {color: rgb(200, 0, 0);}\n\n.cm-xml-meta {color: rgb(192, 192, 192);}\n.cm-xml-comment {color: rgb(35, 110, 37);}\n.cm-xml-string {color: rgb(26, 26, 166);}\n.cm-xml-tag {color: rgb(136, 18, 128);}\n.cm-xml-attribute {color: rgb(153, 69, 0);}\n.cm-xml-link {color: #00e;}\n\n.webkit-html-comment {\n    /* Keep this in sync with view-source.css (.webkit-html-comment) */\n    color: rgb(35, 110, 37);\n}\n\n.webkit-html-tag {\n    color: rgb(168, 148, 166);\n}\n\n.webkit-html-tag-name, .webkit-html-close-tag-name {\n    /* Keep this in sync with view-source.css (.webkit-html-tag) */\n    color: rgb(136, 18, 128);\n}\n\n.webkit-html-pseudo-element {\n    /* This one is non-standard. */\n    color: brown;\n}\n\n.webkit-html-js-node,\n.webkit-html-css-node {\n    white-space: pre-wrap;\n}\n\n.webkit-html-text-node {\n    unicode-bidi: -webkit-isolate;\n}\n\n.webkit-html-entity-value {\n    /* This one is non-standard. */\n    background-color: rgba(0, 0, 0, 0.15);\n    unicode-bidi: -webkit-isolate;\n}\n\n.webkit-html-doctype {\n    /* Keep this in sync with view-source.css (.webkit-html-doctype) */\n    color: rgb(192, 192, 192);\n}\n\n.webkit-html-attribute-name {\n    /* Keep this in sync with view-source.css (.webkit-html-attribute-name) */\n    color: rgb(153, 69, 0);\n    unicode-bidi: -webkit-isolate;\n}\n\n.webkit-html-attribute-value {\n    /* Keep this in sync with view-source.css (.webkit-html-attribute-value) */\n    color: rgb(26, 26, 166);\n    unicode-bidi: -webkit-isolate;\n}\n\n.webkit-html-external-link,\n.webkit-html-resource-link {\n    /* Keep this in sync with view-source.css (.webkit-html-external-link, .webkit-html-resource-link) */\n    color: #00e;\n}\n\n.-theme-with-dark-background .webkit-html-external-link,\n.-theme-with-dark-background .webkit-html-resource-link,\n:host-context(.-theme-with-dark-background) .webkit-html-external-link,\n:host-context(.-theme-with-dark-background) .webkit-html-resource-link {\n    color: hsl(0, 0%, 67%);\n}\n\n.webkit-html-resource-link {\n    /* Required for consistency with view-source.css, since anchors may not have href attributes */\n    text-decoration: underline;\n    cursor: pointer;\n}\n\n.webkit-html-external-link {\n    /* Keep this in sync with view-source.css (.webkit-html-external-link) */\n    text-decoration: none;\n}\n\n.webkit-html-external-link:hover {\n    /* Keep this in sync with view-source.css (.webkit-html-external-link:hover) */\n    text-decoration: underline;\n}\n\n.webkit-html-end-of-file {\n    /* Keep this in sync with view-source.css (.webkit-html-end-of-file) */\n    color: rgb(255, 0, 0);\n    font-weight: bold;\n}\n\n/*# sourceURL=ui/inspectorSyntaxHighlight.css */";Runtime.cachedResources["ui/inspectorSyntaxHighlightDark.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.cm-js-atom{color:rgb(161, 247, 181);}\n.cm-js-attribute{color:rgb(97, 148, 198);}\n.cm-js-builtin{color:rgb(159, 180, 214);}\n.cm-js-comment{color:rgb(116, 116, 116);}\n.cm-js-def{color:rgb(93, 176, 215);}\n.cm-js-keyword{color:rgb(154, 127, 213);}\n.cm-js-link{color:rgb(159, 180, 214);}\n.cm-js-meta{color:rgb(221, 251, 85);}\n.cm-js-number{color:rgb(161, 247, 181);}\n.cm-js-operator{color:rgb(210, 192, 87);}\n.cm-js-property{color:rgb(210, 192, 87);}\n.cm-js-string{color:rgb(242, 139, 84);}\n.cm-js-string-2{color:rgb(242, 139, 84);}\n.cm-js-tag{color:rgb(93, 176, 215);}\n.cm-js-variable{color:rgb(217, 217, 217);}\n.cm-js-variable-2{color:rgb(217, 217, 217);}\n.cm-atom{color:rgb(161, 247, 181);}\n.cm-comment{color:rgb(116, 116, 116);}\n.cm-variable{color:rgb(217, 217, 217);}\n.cm-string{color:rgb(242, 139, 84);}\n.cm-keyword{color:rgb(154, 127, 213);}\n.cm-number{color:rgb(161, 247, 181);}\n.cm-operator{color:rgb(210, 192, 87);}\n.cm-css-atom{color:rgb(217, 217, 217);}\n.cm-css-builtin{color:rgb(255, 163, 79);}\n.cm-css-def{color:rgb(255, 163, 79);}\n.cm-css-comment{color:rgb(116, 116, 116);}\n.cm-css-meta{color:rgb(132, 240, 255);}\n.cm-css-number{color:rgb(217, 217, 217);}\n.cm-css-operator{color:rgb(217, 217, 217);}\n.cm-css-property{color:rgb(132, 240, 255);}\n.cm-css-qualifier{color:rgb(255, 163, 79);}\n.cm-css-string{color:rgb(231, 194, 111);}\n.cm-css-string-2{color:rgb(217, 217, 217);}\n.cm-css-tag{color:rgb(255, 163, 79);}\n.cm-css-variable{color:rgb(255, 163, 79);}\n.cm-css-variable-2{color:rgb(255, 163, 79);}\n.cm-xml-comment{color:rgb(137, 137, 137);}\n.cm-xml-error{color:rgb(198, 95, 95);}\n.cm-xml-string{color:rgb(242, 151, 102);}\n.cm-xml-tag{color:rgb(93, 176, 215);}\n.cm-xml-attribute{color:rgb(155, 187, 220);}\n.cm-xml-link{color:rgb(231, 194, 111);}\n\n.webkit-html-attribute-name{color:rgb(155, 187, 220);}\n.webkit-html-attribute-value{color:rgb(242, 151, 102);}\n.webkit-html-comment{color:rgb(137, 137, 137);}\n.webkit-html-resource-link{color:rgb(231, 194, 111);}\n.webkit-html-external-link{color:rgb(231, 194, 111);}\n.webkit-html-tag{color:rgb(93, 176, 215);}\n.webkit-html-tag-name{color:rgb(93, 176, 215);}\n.webkit-html-close-tag-name{color:rgb(93, 176, 215);}\n.webkit-html-text-node{color:rgb(207, 208, 208);}\n.webkit-html-css-node{color:rgb(207, 208, 208);}\n.webkit-html-js-node{color:rgb(207, 208, 208);}\n.webkit-html-pseudo-element{color:rgb(93, 175, 215);}\n.webkit-css-selector{color:rgb(255, 163, 79);}\n.webkit-css-at-rule{color:rgb(188, 164, 197);}\n.webkit-css-color{color:rgb(255, 163, 79);}\n.webkit-css-comment{color:rgb(116, 116, 116);}\n.webkit-css-important{color:rgb(255, 26, 26);}\n.webkit-css-keyword{color:rgb(255, 163, 79);}\n.webkit-css-number{color:rgb(217, 217, 217);}\n.webkit-css-property{color: rgb(53, 212, 199);}\n.webkit-css-string{color:rgb(231, 194, 111);}\n.webkit-css-url{color:rgb(231, 194, 111);}\n\n/*# sourceURL=ui/inspectorSyntaxHighlightDark.css */";Runtime.cachedResources["ui/listWidget.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.list {\n    flex: auto 0 1;\n    overflow-y: auto;\n    border: 1px solid rgb(231, 231, 231);\n    flex-direction: column;\n}\n\n.list-separator {\n    background: rgb(231, 231, 231);\n    height: 1px;\n}\n\n.list-item {\n    flex: none;\n    min-height: 30px;\n    display: flex;\n    align-items: center;\n    position: relative;\n}\n\n.list-item:hover {\n    background: hsl(0, 0%, 96%);\n}\n\n.controls-container {\n    display: flex;\n    flex-direction: row;\n    justify-content: flex-end;\n    align-items: stretch;\n    pointer-events: none;\n}\n\n.controls-gradient {\n    flex: 0 1 50px;\n}\n\n.list-item:hover .controls-gradient {\n    background-image: linear-gradient(90deg, transparent, hsl(0, 0%, 96%));\n}\n\n.controls-buttons {\n    flex: none;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    pointer-events: auto;\n}\n\n.list-item:hover .controls-buttons {\n    background-color: hsl(0, 0%, 96%);\n}\n\n.remove-button,\n.edit-button {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 168px;\n    width: 32px;\n    height: 24px;\n    opacity: 0.5;\n    cursor: pointer;\n    flex: none;\n    visibility: hidden;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.remove-button,\n.edit-button {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.list-item:hover .remove-button,\n.list-item:hover .edit-button {\n    visibility: visible;\n}\n\n.remove-button:hover,\n.edit-button:hover {\n    opacity: 0.7;\n}\n\n.remove-button {\n    background-position: -128px -24px;\n}\n\n.edit-button {\n    background-position: -160px 0px;\n}\n\n.editor-container {\n    display: flex;\n    flex-direction: column;\n    align-items: stretch;\n    flex: none;\n    background: hsl(0, 0%, 96%);\n    overflow: hidden;\n}\n\n.editor-content {\n    flex: auto;\n    display: flex;\n    flex-direction: column;\n    align-items: stretch;\n}\n\n.editor-buttons {\n    flex: none;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: flex-start;\n    padding: 5px;\n}\n\n.editor-buttons > button {\n    flex: none;\n    margin-right: 10px;\n}\n\n.editor-content input {\n    margin-right: 10px;\n}\n\n.editor-content input.error-input {\n    outline: auto 2px red;\n    background-color: white;\n}\n\n/*# sourceURL=ui/listWidget.css */";Runtime.cachedResources["ui/panelEnablerView.css"]="/*\n * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.\n * Copyright (C) 2009 Anthony Ricaud <rik@webkit.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1.  Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n * 3.  Neither the name of Apple Computer, Inc. (\"Apple\") nor the names of\n *     its contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n.panel-enabler-view {\n    background-color: white;\n    font-size: 13px;\n    text-align: center;\n    overflow-x: hidden;\n    overflow-y: overlay;\n    flex: auto;\n    display: flex;\n}\n\n.panel-enabler-view h1 {\n    color: rgb(110, 116, 128);\n    font-size: 16px;\n    line-height: 20px;\n    font-weight: normal;\n    margin-top: 0;\n}\n\n.panel-enabler-view img {\n    height: 100%;\n    min-height: 200px;\n    max-width: 100%;\n    top: 0;\n    bottom: 0;\n    padding: 20px 0 20px 20px;\n    margin: auto;\n    vertical-align: middle;\n}\n\n.panel-enabler-view img.hidden {\n    display: initial !important;\n    width: 0;\n}\n\n.panel-enabler-view .flexible-space {\n    -webkit-flex: 1;\n}\n\n.panel-enabler-view form {\n    display: inline-block;\n    vertical-align: middle;\n    width: 330px;\n    margin: 0;\n    padding: 15px;\n    white-space: normal;\n}\n\n.panel-enabler-view label {\n    position: relative;\n    display: block;\n    text-align: left;\n    word-break: break-word;\n    margin: 0 0 5px 20px;\n}\n\n/*# sourceURL=ui/panelEnablerView.css */";Runtime.cachedResources["ui/progressIndicator.css"]="/*\n * Copyright (c) 2014 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.progress-indicator-shadow-stop-button {\n    background-color: rgb(216, 0, 0) !important;\n    border: 0;\n    width: 10px;\n    height: 12px;\n    border-radius: 2px;\n}\n\n.progress-indicator-shadow-container {\n    display: flex;\n    flex: 1 0 auto;\n    align-items: center;\n}\n\n.progress-indicator-shadow-container .title {\n    text-overflow: ellipsis;\n    overflow: hidden;\n    max-width: 150px;\n    margin-right: 2px;\n    color: #777;\n}\n\n.progress-indicator-shadow-container progress {\n    flex: auto;\n    margin: 0 2px;\n    width: 100px\n}\n\n/*# sourceURL=ui/progressIndicator.css */";Runtime.cachedResources["ui/propertiesSection.css"]="/*\n * Copyright (c) 2014 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.properties-tree {\n    margin: 0;\n    padding: 0 6px 2px;\n    list-style: none;\n    min-height: 18px;\n}\n\n.properties-tree ol {\n    display: none;\n    margin: 0;\n    -webkit-padding-start: 12px;\n    list-style: none;\n}\n\n.properties-tree ol.expanded {\n    display: block;\n}\n\n.properties-tree li {\n    margin-left: 12px;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    -webkit-user-select: text;\n    cursor: default;\n    padding-top: 2px;\n    line-height: 12px;\n}\n\n.properties-tree li.parent {\n    margin-left: 1px;\n}\n\n.properties-tree li.parent::before {\n    -webkit-user-select: none;\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 168px;\n    opacity: 0.5;\n    content: \"a\";\n    width: 8px;\n    float: left;\n    margin-right: 4px;\n    color: transparent;\n    text-shadow: none;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.properties-tree li.parent::before {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.properties-tree li.parent::before {\n    background-position: -4px -96px;\n}\n\n.properties-tree li.parent.expanded::before {\n    background-position: -20px -96px;\n}\n\n.properties-tree li .info {\n    padding-top: 4px;\n    padding-bottom: 3px;\n}\n\n.properties-tree li.editing {\n    margin-left: 10px;\n    text-overflow: clip;\n}\n\n.properties-tree li.editing-sub-part {\n    padding: 3px 6px 8px 18px;\n    margin: -1px -6px -8px -6px;\n    text-overflow: clip;\n}\n\n.properties-tree .name {\n    color: rgb(136, 19, 145);\n    flex-shrink: 0;\n}\n\n.properties-tree .separator {\n    flex-shrink: 0;\n}\n\n.properties-tree .dimmed {\n    opacity: 0.6;\n}\n\n.properties-tree .value.error {\n    color: red;\n}\n\n.properties-tree .number {\n    color: blue;\n}\n\n.properties-tree .keyword {\n    color: rgb(136, 19, 79);\n}\n\n.properties-tree .color {\n    color: rgb(118, 15, 21);\n}\n\n/*# sourceURL=ui/propertiesSection.css */";Runtime.cachedResources["ui/radioButton.css"]="/*\n * Copyright (c) 2014 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n::content .dt-radio-button {\n    height: 17px;\n    width: 17px;\n    min-width: 17px;\n    border: 1px solid rgb(165, 165, 165);\n    background-image: linear-gradient(to bottom, rgb(252, 252, 252), rgb(223, 223, 223));\n    border-radius: 8px;\n    -webkit-appearance: none;\n    vertical-align: middle;\n    margin: 0 5px 5px 0;\n}\n\n::content .dt-radio-button:active:not(:disabled) {\n    background-image: linear-gradient(to bottom, rgb(194, 194, 194), rgb(239, 239, 239));\n}\n\n::content .dt-radio-button:checked {\n    background: url(Images/radioDot.png) center no-repeat,\n                linear-gradient(to bottom, rgb(252, 252, 252), rgb(223, 223, 223));\n}\n\n::content .dt-radio-button:checked:active {\n    background: url(Images/radioDot.png) center no-repeat,\n                linear-gradient(to bottom, rgb(194, 194, 194), rgb(239, 239, 239));\n}\n\n/*# sourceURL=ui/radioButton.css */";Runtime.cachedResources["ui/searchableView.css"]="/*\n * Copyright (c) 2014 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.search-bar {\n    flex: 0 0 23px;\n    background-color: #eee;\n    border-top: 1px solid #ccc;\n    display: flex;\n    overflow: hidden;\n}\n\n.search-bar.replaceable {\n    flex: 0 0 44px;\n}\n\n.search-toolbar {\n    margin-top: -2px;\n}\n\n.search-replace {\n    -webkit-appearance: none;\n    border: 0;\n    padding: 0 3px;\n    margin: 0;\n    flex: 1;\n}\n\n.search-replace:focus {\n    outline: none;\n}\n\n.toolbar-search {\n    border-spacing: 1px;\n}\n\n.toolbar-search td {\n    padding: 0 5px 0 0;\n}\n\n.toolbar-search td > span {\n    display: flex;\n    align-items: baseline;\n    line-height: 17px;\n}\n\n.toolbar-search-navigation-controls {\n    align-self: stretch;\n    background-image: linear-gradient(rgb(228, 228, 228), rgb(206, 206, 206));\n}\n\n.toolbar-search-navigation {\n    display: inline-block;\n    width: 18px;\n    height: 18px;\n    background-repeat: no-repeat;\n    background-position: 4px 7px;\n    border-left: 1px solid rgb(170, 170, 170);\n    opacity: 0.3;\n}\n\n.toolbar-search-navigation.enabled {\n    opacity: 1.0;\n}\n\n.toolbar-search button.search-action-button {\n    border: 1px solid rgb(163, 163, 163);\n    border-radius: 8px;\n    margin: 0;\n    background-image: linear-gradient(rgb(241, 241, 241), rgb(220, 220, 220));\n    width: 100%;\n    height: 20px;\n}\n\n.toolbar-search button.search-action-button:active {\n    background-image: linear-gradient(rgb(185, 185, 185), rgb(156, 156, 156));\n}\n\n.toolbar-search-control {\n    display: -webkit-flex;\n    position: relative;\n    background-color: white;\n}\n\n.toolbar-replace-control,\n#search-input-field {\n    padding-top: 1px;\n    line-height: 17px;\n}\n\n.toolbar-search-control, .toolbar-replace-control {\n    border: 1px solid rgb(163, 163, 163);\n    height: 20px;\n    border-radius: 2px;\n    width: 253px;\n    margin-left: 1px;\n}\n\n.toolbar-search-navigation.enabled:active {\n    background-position: 4px 7px, 0 0;\n}\n\n.toolbar-search-navigation.toolbar-search-navigation-prev {\n    background-image: url(Images/searchPrev.png);\n    border-left: 1px solid rgb(163, 163, 163);\n}\n\n:host-context(.-theme-with-dark-background) .toolbar-search-navigation {\n    -webkit-filter: invert(90%);\n}\n\n.toolbar-search-navigation.toolbar-search-navigation-prev.enabled:active {\n    background-image: url(Images/searchPrev.png), linear-gradient(rgb(168, 168, 168), rgb(116, 116, 116));\n}\n\n.toolbar-search-navigation.toolbar-search-navigation-next {\n    background-image: url(Images/searchNext.png);\n    border-left: 1px solid rgb(230, 230, 230);\n}\n\n.toolbar-search-navigation.toolbar-search-navigation-next.enabled:active {\n    background-image: url(Images/searchNext.png), linear-gradient(rgb(168, 168, 168), rgb(116, 116, 116));\n}\n\n.search-results-matches {\n    display: inline-block;\n    text-align: right;\n    font-size: 11px;\n    padding: 0 4px;\n    color: rgb(165, 165, 165);\n}\n\n/*# sourceURL=ui/searchableView.css */";Runtime.cachedResources["ui/section.css"]="/*\n * Copyright (c) 2014 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.section {\n    position: relative;\n    margin-top: 1px;\n}\n\n.section > .header {\n    padding: 0 8px 0 5px;\n    min-height: 18px;\n    white-space: nowrap;\n    background-origin: padding-box;\n    background-clip: padding-box;\n}\n\n.section > .header::before {\n    -webkit-user-select: none;\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 168px;\n    opacity: 0.5;\n    content: \"a\";\n    color: transparent;\n    text-shadow: none;\n    float: left;\n    width: 8px;\n    margin-right: 4px;\n    margin-top: 2px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.section > .header::before {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.section > .header::before {\n    background-position: -4px -96px;\n}\n\n.section.expanded > .header::before {\n    background-position: -20px -96px;\n}\n\n.section > .header .title {\n    font-weight: normal;\n    word-wrap: break-word;\n    white-space: normal;\n    line-height: 18px;\n}\n\n.section > .header label {\n    display: none;\n}\n\n.section.expanded .header label {\n    display: inline;\n}\n\n.section > .header .subtitle {\n    float: right;\n    margin-left: 5px;\n    max-width: 55%;\n    text-overflow: ellipsis;\n    overflow: hidden;\n}\n\n.section > .header .subtitle a {\n    color: inherit;\n}\n\n.section > .properties {\n    display: none;\n}\n\n.section.expanded > .properties {\n    display: block;\n}\n\n/*# sourceURL=ui/section.css */";Runtime.cachedResources["ui/smallIcon.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\ndiv {\n    width: 10px;\n    height: 10px;\n    margin-right: 2px;\n    display: inline-block;\n}\n\ndiv.error-icon,\ndiv.revokedError-icon,\ndiv.warning-icon,\ndiv.info-icon,\ndiv.device-icon,\ndiv.red-ball,\ndiv.green-ball,\ndiv.orange-ball {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 168px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\ndiv.error-icon,\ndiv.revokedError-icon,\ndiv.warning-icon,\ndiv.info-icon,\ndiv.device-icon,\ndiv.red-ball,\ndiv.green-ball,\ndiv.orange-ball {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\ndiv.error-icon {\n    background-position: -213px -96px;\n}\n\ndiv.revokedError-icon {\n    background-position: -245px -107px;\n}\n\ndiv.warning-icon {\n    background-position: -202px -107px;\n}\n\ndiv.info-icon {\n    background-position: -213px -107px;\n}\n\ndiv.device-icon {\n    background-position: -224px -107px;\n}\n\ndiv.red-ball {\n    background-position: -224px -96px;\n}\n\ndiv.green-ball {\n    background-position: -235px -96px;\n}\n\ndiv.orange-ball {\n    background-position: -246px -96px;\n}\n\n/*# sourceURL=ui/smallIcon.css */";Runtime.cachedResources["ui/softContextMenu.css"]="/*\n * Copyright (c) 2014 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n:host {\n    position: absolute;\n    border: 1px solid rgba(196, 196, 196, 0.9);\n    border-top: 1px solid rgba(196, 196, 196, 0.5);\n    /* NOTE: Keep padding top in sync with topPadding in SoftContextMenu.js */\n    padding: 4px 0 4px 0;\n    border-radius: 4px;\n    background-color: rgb(240, 240, 240);\n    box-shadow: 0 5px 10px rgba(0, 0, 0, 0.25);\n    overflow-y: auto;\n    min-width: 160px !important;\n}\n\n.soft-context-menu-item {\n    display: flex;\n    width: 100%;\n    line-height: 14px;\n    font-size: 12px;\n    border-top: 1px solid transparent;\n    border-bottom: 1px solid transparent;\n    padding: 2px 7px 2px 8px;\n    margin: 0 13px 0 0;\n    white-space: nowrap;\n}\n\n.soft-context-menu-disabled {\n    color: #999;\n    pointer-events: none;\n}\n\n.soft-context-menu-separator {\n    height: 10px;\n    margin: 0 1px;\n}\n\n.soft-context-menu-separator > .separator-line {\n    margin: 0;\n    height: 5px;\n    border-bottom: 1px solid rgb(222, 222, 222);\n    pointer-events: none;\n}\n\n.soft-context-menu-item-mouse-over,\n.-theme-selection-color {\n    border-top: 1px solid rgb(56, 121, 217);\n    border-bottom: 1px solid rgb(56, 121, 217);\n    background-color: rgb(56, 121, 217);\n    color: white;\n}\n\n:host-context(.platform-mac) .soft-context-menu-item-mouse-over,\n.-theme-selection-color {\n    border-top: 1px solid transparent;\n    border-bottom: 1px solid transparent;\n    background-image: linear-gradient(to right, hsl(214, 81%, 60%), hsl(214, 100%, 56%));\n}\n\n:host-context(.platform-mac) .separator-line {\n    border-width: 2px;\n}\n\n.soft-context-menu-item-submenu-arrow {\n    color: #222;\n    pointer-events: none;\n    font-size: 11px;\n    flex: 1 1 auto;\n    text-align: right;\n}\n\n.soft-context-menu-item-mouse-over .soft-context-menu-item-checkmark {\n    color: white;\n}\n\n.soft-context-menu-custom-item {\n    display: inline-flex;\n    justify-content: center;\n    align-items: center;\n    flex: auto;\n}\n\n.soft-context-menu-shortcut {\n    color: gray;\n    pointer-events: none;\n    flex: 1 1 auto;\n    text-align: right;\n    padding-left: 10px;\n}\n\n.soft-context-menu-item-mouse-over .soft-context-menu-shortcut {\n    color: inherit;\n}\n\n.checkmark {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 168px;\n    opacity: 0.7;\n    width: 10px;\n    height: 10px;\n    background-position: -128px -109px;\n    display: inline-block;\n    pointer-events: none;\n    margin: auto 5px auto 0px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.checkmark {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n}\n\n/*# sourceURL=ui/softContextMenu.css */";Runtime.cachedResources["ui/splitWidget.css"]="/*\n * Copyright (C) 2011 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC.\n * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n:host {\n    overflow: hidden;\n}\n\n.shadow-split-widget {\n    display: flex;\n    overflow: hidden;\n}\n\n.shadow-split-widget-contents {\n    display: flex;\n    position: relative;\n    flex-direction: column;\n}\n\n.shadow-split-widget-sidebar {\n    flex: none;\n}\n\n.shadow-split-widget-main, .shadow-split-widget-sidebar.maximized {\n    flex: auto;\n}\n\n.shadow-split-widget.hbox > .shadow-split-widget-resizer {\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    width: 6px;\n    z-index: 500;\n}\n\n.shadow-split-widget.vbox > .shadow-split-widget-resizer {\n    position: absolute;\n    left: 0;\n    right: 0;\n    height: 6px;\n    z-index: 500;\n}\n\n.shadow-split-widget.hbox.shadow-split-widget-first-is-sidebar {\n    flex-direction: row-reverse !important;\n}\n\n.shadow-split-widget.vbox.shadow-split-widget-first-is-sidebar {\n    flex-direction: column-reverse !important;\n}\n\n.shadow-split-widget-resizer-border {\n    pointer-events: none;\n}\n\n.shadow-split-widget.vbox > .shadow-split-widget-sidebar:not(.maximized) {\n    border: 0;\n    border-top: 1px solid rgb(64%, 64%, 64%);\n}\n\n.shadow-split-widget.vbox.shadow-split-widget-first-is-sidebar > .shadow-split-widget-sidebar:not(.maximized) {\n    border: 0;\n    border-bottom: 1px solid rgb(64%, 64%, 64%);\n}\n\n.shadow-split-widget.hbox > .shadow-split-widget-sidebar:not(.maximized) {\n    border: 0;\n    border-left: 1px solid rgb(64%, 64%, 64%);\n}\n\n.shadow-split-widget.hbox.shadow-split-widget-first-is-sidebar > .shadow-split-widget-sidebar:not(.maximized) {\n    border: 0;\n    border-right: 1px solid rgb(64%, 64%, 64%);\n}\n\n.shadow-split-widget button.sidebar-show-hide-button {\n    position: absolute;\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-size: 352px 168px;\n    height: 16px;\n    width: 16px;\n    border: none;\n    z-index: 20;\n    background-color: #5a5a5a;\n}\n\n.shadow-split-widget button.sidebar-show-hide-button:hover {\n    background-color: #333;\n}\n\n.shadow-split-widget button.sidebar-show-hide-button:active {\n    background-color: #5a5a5a;\n}\n\n.shadow-split-widget button.sidebar-show-hide-button:disabled {\n    background-color: rgba(0, 0, 0, 0.35);\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.shadow-split-widget button.sidebar-show-hide-button {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.shadow-split-widget button.left-sidebar-show-hide-button,\n.shadow-split-widget button.top-sidebar-show-hide-button {\n    top: 5px;\n    left: 5px;\n}\n\n:host-context(.material) .shadow-split-widget button.left-sidebar-show-hide-button,\n:host-context(.material) .shadow-split-widget button.top-sidebar-show-hide-button {\n    top: 5px;\n}\n\n.shadow-split-widget button.right-sidebar-show-hide-button {\n    top: 5px;\n    right:4px;\n}\n\n:host-context(.material) .shadow-split-widget button.right-sidebar-show-hide-button {\n    top: 5px;\n    right: 5px;\n}\n\n.shadow-split-widget button.bottom-sidebar-show-hide-button {\n    bottom: 5px;\n    right: 3px;\n}\n\n.shadow-split-widget button.left-sidebar-show-hide-button.toggled-show {\n    -webkit-mask-position: -168px -76px; /* |> */\n}\n\n.shadow-split-widget button.left-sidebar-show-hide-button.toggled-hide {\n    -webkit-mask-position: -199px -76px; /* |< */\n}\n\n.shadow-split-widget button.right-sidebar-show-hide-button.toggled-show {\n    -webkit-mask-position: -296px -76px; /* <| */\n}\n\n.shadow-split-widget button.right-sidebar-show-hide-button.toggled-hide {\n    -webkit-mask-position: -264px -76px; /* >| */\n}\n\n.shadow-split-widget button.top-sidebar-show-hide-button.toggled-show {\n    -webkit-mask-position: -168px -76px; /* |> */\n    transform: rotate(90deg);\n}\n\n.shadow-split-widget button.top-sidebar-show-hide-button.toggled-hide {\n    -webkit-mask-position: -199px -76px; /* |< */\n    transform: rotate(90deg);\n}\n\n.shadow-split-widget button.bottom-sidebar-show-hide-button.toggled-show {\n    -webkit-mask-position: -296px -76px; /* <| */\n    transform: rotate(90deg);\n}\n\n.shadow-split-widget button.bottom-sidebar-show-hide-button.toggled-hide {\n    -webkit-mask-position: -264px -76px; /* >| */\n    transform: rotate(90deg);\n}\n\n/*# sourceURL=ui/splitWidget.css */";Runtime.cachedResources["ui/toolbar.css"]="/*\n * Copyright (c) 2014 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n:host {\n    flex: none;\n    padding: 0 2px;\n}\n\n.toolbar-shadow {\n    position: relative;\n    white-space: nowrap;\n    height: 26px;\n    overflow: hidden;\n    z-index: 12;\n    display: flex;\n    flex: none;\n    align-items: center;\n}\n\n.toolbar-shadow.wrappable {\n    flex-wrap: wrap;\n}\n\n.toolbar-shadow.wrappable-reverse {\n    flex-direction: row-reverse;\n}\n\n.toolbar-shadow.vertical {\n    flex-direction: column;\n    height: auto;\n    width: 26px;\n}\n\n.toolbar-item {\n    position: relative;\n    display: flex;\n    background-color: transparent;\n    flex: none;\n    align-items: center;\n    justify-content: center;\n    padding: 0;\n    height: 26px;\n    border: none;\n    color: #5a5a5a;\n}\n\n.toolbar-dropdown-arrow {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-size: 352px 168px;\n    -webkit-mask-position: -18px -96px;\n    background-color: #444;\n    width: 12px;\n    height: 12px;\n    display: inline-block;\n    pointer-events: none;\n    margin: auto 0;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n    .toolbar-dropdown-arrow {\n        -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);\n    }\n} /* media */\n\n/* Text-glyph item */\n\n.toolbar-text-glyph {\n    white-space: nowrap;\n    overflow: hidden;\n    min-width: 28px;\n    background: transparent;\n}\n\n.toolbar-text {\n    margin: 0 5px;\n    flex: none;\n    color: #5a5a5a;\n}\n\n.toolbar-has-dropdown .toolbar-text {\n    margin-right: 1px;\n}\n\n.toolbar-has-glyph .toolbar-text {\n    margin-left: 0;\n}\n\n.toolbar-bold .toolbar-text {\n    font-weight: bold;\n}\n\n.toolbar-dimmed .toolbar-text {\n    color: #999;\n}\n\n.toolbar-glyph {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-size: 352px 168px;\n    background-color: #5a5a5a;\n    width: 28px;\n    height: 24px;\n    flex: none;\n    transform: translateX(-2px);\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.toolbar-glyph {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n/* Button */\n\n.toolbar-button:disabled .toolbar-glyph {\n    opacity: 0.5;\n}\n\n.toolbar-button:enabled.hover:not(:active) .toolbar-glyph {\n    background-color: #333;\n}\n\n.toolbar-button:enabled.hover:not(:active) .toolbar-text {\n    color: #333;\n}\n\n.toolbar-button.toolbar-state-on .toolbar-glyph,\n.toolbar-blue-on-hover .toolbar-button:not(.toolbar-state-on):enabled.hover:not(:active),\n.-theme-selection-color {\n    background-color: hsl(218, 81%, 59%);\n}\n\n.toolbar-button.toolbar-state-on .toolbar-text,\n.-theme-selection-color {\n    color: hsl(218, 81%, 59%);\n}\n\n.toolbar-blue-on-hover .toolbar-button:not(.toolbar-state-on):enabled.hover .toolbar-glyph {\n    background-color: white;\n}\n\n.toolbar-blue-on-hover .toolbar-button:not(.toolbar-state-on):enabled.hover .toolbar-text {\n    color: white;\n}\n\n.toolbar-button.toolbar-state-on:enabled.hover:not(:active) .toolbar-glyph,\n.toolbar-blue-on-hover .toolbar-button:not(.toolbar-state-on):enabled:active.hover,\n.-theme-selection-color {\n    background-color: hsl(218, 96%, 54%);\n}\n\n.toolbar-button.toolbar-state-on:enabled.hover:not(:active) .toolbar-text,\n.-theme-selection-color {\n    color: hsl(218, 96%, 54%);\n}\n\n.toolbar-toggled-gray .toolbar-button.toolbar-state-on {\n    background-color: #f3f3f3 !important;\n}\n\n/* Checkbox */\n\n.toolbar-item.checkbox {\n    padding: 0 5px 0 2px;\n}\n\n.toolbar-item.checkbox.hover {\n    color: #333;\n}\n\n/* Select */\n\n.toolbar-select-container {\n    display: inline-flex;\n    flex-shrink: 0;\n    margin-right: 6px;\n}\n\nselect.toolbar-item {\n    min-width: 48px;\n    -webkit-appearance: none;\n    border: 0;\n    border-radius: 0;\n    padding: 0 15px 0 5px;\n    margin-right: -10px;\n    position: relative;\n}\n\n/* Input */\n\ninput.toolbar-item {\n    width: 200px;\n    height: 20px;\n    padding: 3px;\n    margin: 1px 3px;\n    background-color: white;\n    border: solid 1px #d8d8d8;\n}\n\ninput.toolbar-item:focus,\ninput.toolbar-item.hover {\n    border: solid 1px rgb(202, 202, 202);\n}\n\n/* Separator */\n\n.toolbar-divider {\n    background-color: #ccc;\n    width: 1px;\n    margin: 5px 4px;\n    height: 16px;\n}\n\n/* Long click */\n\n.long-click-glyph {\n    position: absolute;\n    background-color: #5a5a5a;\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-position: -290px -46px;\n    -webkit-mask-size: 352px 168px;\n    width: 28px;\n    height: 24px;\n    top: 0;\n    left:  0;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.long-click-glyph {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.toolbar-button.emulate-active {\n    background-color: rgb(163, 163, 163);\n}\n\n.toolbar-shadow.floating {\n    flex-direction: column;\n    height: auto;\n    background-color: white;\n    border: 1px solid #ccc;\n    margin-top: -1px;\n    width: 28px;\n    left: -2px;\n}\n\n/* Predefined items */\n\n.dock-toolbar-item-undock.toolbar-glyph {\n    -webkit-mask-position: 0 -48px;\n}\n\n.dock-toolbar-item-bottom.toolbar-glyph {\n    -webkit-mask-position: -32px -24px;\n}\n\n.dock-toolbar-item-right.toolbar-glyph {\n    -webkit-mask-position: -256px -48px;\n}\n\n.settings-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -160px -24px;\n}\n\n.menu-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -192px -24px;\n}\n\n.node-search-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -320px -120px;\n}\n\n.delete-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -128px 0;\n}\n\n.clear-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -64px 0;\n}\n\n.refresh-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: 0 0;\n}\n\n.visibility-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -96px 0;\n}\n\n.visibility-off-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -192px 0;\n}\n\n.large-list-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -224px 0;\n}\n\n.record-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -288px 0;\n}\n\n.toolbar-state-on .record-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -288px -24px;\n}\n\n.camera-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -96px -24px;\n}\n\n.last-step-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: 0 -72px;\n}\n\n.first-step-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: 0 -72px;\n    transform: rotate(180deg);\n    top: 0;\n    bottom: 0;\n}\n\n.step-in-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -64px -72px;\n}\n\n.step-out-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -96px -72px;\n}\n\n.step-over-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -128px -72px;\n}\n\n.step-backwards-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -128px -72px;\n    transform: scaleX(-1);\n}\n\n.play-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -64px -48px;\n}\n\n.play-backwards-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -64px -48px;\n    transform: scaleX(-1);\n}\n\n.pause-on-exceptions-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -256px 0;\n}\n\n.pause-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -32px -72px;\n}\n\n.toolbar-state-on .pause-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: 0 -72px;\n}\n\n.toolbar-state-on .breakpoint-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -32px 0;\n}\n\n.add-breakpoint-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -64px -24px;\n}\n\n.breakpoint-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: 0 -24px;\n}\n\n.format-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -256px -24px;\n}\n\n.garbage-collect-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -128px -24px;\n}\n\n.histogram-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -160px -48px;\n}\n\n.flame-chart-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -192px -48px;\n}\n\n.filter-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -32px -48px;\n}\n\n.waterfall-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -128px -48px;\n}\n\n.pan-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -98px -120px;\n}\n\n.center-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -128px -120px;\n}\n\n.rotate-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -160px -120px;\n}\n\n.pin-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -256px -120px;\n}\n\n.animation-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -192px -120px;\n}\n\n.eyedropper-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -288px -120px;\n}\n\n.add-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -224px -120px;\n}\n\n.toolbar-state-pause-outline .animation-control-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -320px 0px;\n}\n\n.toolbar-state-replay-outline .animation-control-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -320px -24px;\n    background-color: rgb(66, 129, 235) !important;\n}\n\n.toolbar-state-play-outline .animation-control-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -320px -48px;\n    background-color: rgb(66, 129, 235) !important;\n}\n\n.timer-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -320px -72px;\n}\n\n.view-quilt-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -320px -96px;\n}\n\n.background-color-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -96px -144px;\n}\n\n.foreground-color-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -128px -144px;\n}\n\n.layout-editor-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: 0 -144px;\n}\n\n.block-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -32px -144px;\n}\n\n.phone-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -288px -144px;\n}\n\n.rotate-screen-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -192px -144px;\n}\n\n.enter-fullscreen-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -256px -96px;\n}\n\n.responsive-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -288px -96px;\n}\n\n.frame-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -256px -144px;\n}\n\n.domain-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -160px -144px;\n}\n\n.folder-toolbar-item.toolbar-glyph {\n    -webkit-mask-position: -224px -144px;\n}\n\n.toolbar-state-on .record-toolbar-item.toolbar-glyph,\n.toolbar-state-active .filter-toolbar-item.toolbar-glyph,\n.toolbar-state-active .block-toolbar-item.toolbar-glyph {\n    background-color: rgb(216, 0, 0) !important;\n}\n\n:host-context(.-theme-with-dark-background) .toolbar-state-active .filter-toolbar-item.toolbar-glyph,\n:host-context(.-theme-with-dark-background) .toolbar-state-active .block-toolbar-item.toolbar-glyph,\n:host-context(.-theme-with-dark-background) .toolbar-state-on .record-toolbar-item.toolbar-glyph {\n    background-color: hsl(0, 100%, 65%) !important;\n}\n\n/*# sourceURL=ui/toolbar.css */";Runtime.cachedResources["ui/suggestBox.css"]="/*\n * Copyright (C) 2011 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n:host {\n    position: absolute;\n    background-color: transparent;\n    z-index: 1000;\n    pointer-events: none;\n    overflow: hidden;\n    display: flex;\n    flex-direction: row;\n}\n\n.suggest-box-left-spacer {\n    flex: 0 1 auto;\n}\n\n.suggest-box-horizontal {\n    display: flex;\n    flex-direction: column;\n    flex: 0 0 auto;\n    max-width: 300px;\n}\n\n.suggest-box-top-spacer {\n    flex: auto;\n}\n\n:host(.under-anchor) .suggest-box-top-spacer,\n:host(:not(.under-anchor)) .suggest-box-bottom-spacer {\n    flex: 0 0 auto;\n}\n\n.suggest-box-container {\n    display: flex;\n    flex-direction: row;\n}\n\n.suggest-box {\n    background-color: #FFFFFF;\n    border: 1px solid rgb(66%, 66%, 66%);\n    pointer-events: auto;\n    margin-left: -3px;\n    overflow-x: hidden;\n    overflow-y: auto;\n    display: flex;\n    flex-direction: column;\n    flex: 0 0 auto;\n    border-radius: 5px 5px 5px 0;\n}\n\n:host(.under-anchor) .suggest-box {\n    border-radius: 0 5px 5px 5px;\n}\n\n.suggest-box .suggest-box-content-item {\n    padding: 1px;\n    margin: 0;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    border: 1px solid transparent;\n    flex: 0 0 auto;\n    padding-right: 0;\n    white-space: nowrap;\n}\n\n.suggest-box .suggest-box-content-item .prefix {\n    font-weight: bold;\n}\n\n.suggest-box .suggest-box-content-item .spacer {\n    display: inline-block;\n    width: 20px;\n}\n\n.suggest-box .suggest-box-content-item.selected {\n    background-color: rgba(56, 121, 217, 0.1);\n}\n\n.suggest-box .suggest-box-content-item:hover:not(.selected) {\n    border: 1px solid rgb(204, 204, 204);\n}\n\n.suggest-box .details-popup {\n    padding: 17px;\n    pointer-events: auto;\n    margin-left: 3px;\n    max-width: 750px;\n    word-wrap: normal;\n}\n\n.suggest-box .details-popup .description {\n    margin-top: 22px;\n    color: #808080;\n}\n\n/*# sourceURL=ui/suggestBox.css */";Runtime.cachedResources["ui/tabbedPane.css"]="/*\n * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.\n * Copyright (C) 2009 Anthony Ricaud <rik@webkit.org>\n * Copyright (C) 2011 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC.\n * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n.tabbed-pane {\n    flex: auto;\n    overflow: hidden;\n}\n\n.tabbed-pane-content {\n    position: relative;\n    overflow: auto;\n    flex: auto;\n    display: flex;\n    flex-direction: column;\n}\n\n.tabbed-pane-content.has-no-tabs {\n    background-color: lightgray;\n}\n\n.tabbed-pane-placeholder {\n    font-size: 14px;\n    text-align: center;\n    margin-top: 20px;\n    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;\n}\n\n.tabbed-pane-header {\n    display: flex;\n    flex: 0 0 27px;\n    border-bottom: 1px solid #ccc;\n    overflow: visible;\n    width: 100%;\n    background-color: #f3f3f3;\n}\n\n.tabbed-pane-header-contents {\n    flex: auto;\n    pointer-events: none;\n    margin-left: 5px;\n    position: relative;\n}\n\n.tabbed-pane-header-contents > * {\n    pointer-events: initial;\n}\n\n.tabbed-pane-header-tab-icon {\n    margin-right: 2px;\n}\n\n.tabbed-pane-header-tab {\n    float: left;\n    margin-top: 2px;\n    padding: 2px 4px 2px 4px;\n    height: 24px;\n    border: 1px solid transparent;\n    border-bottom: none;\n    line-height: 15px;\n    white-space: nowrap;\n    cursor: default;\n    display: flex;\n    align-items: center;\n    color: #5a5a5a;\n}\n\n.tabbed-pane-header-tab:hover,\n.tabbed-pane-header-tab.selected:hover {\n    color: #333;\n    background-color: #e5e5e5;\n}\n\n.tabbed-pane-header-tab-title {\n    text-overflow: ellipsis;\n    overflow: hidden;\n}\n\n.tabbed-pane-header-tab.measuring {\n    visibility: hidden;\n}\n\n.tabbed-pane-header-tab.selected {\n    border: 1px solid #ccc;\n    border-bottom: none;\n    color: #333;\n}\n\n.tabbed-pane-header-tab.selected {\n    background-color: white;\n    border-top-color: #ccc;\n}\n\n.tabbed-pane-header-tab.dragging {\n    position: relative;\n    box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37);\n    background-color: #e5e5e5;\n}\n\n.tabbed-pane-header-tab .tabbed-pane-close-button {\n    display: inline-block;\n    position: relative;\n    top: 2px;\n    left: 1px;\n    margin-left: 2px;\n    margin-top: -3px;\n    visibility: hidden;\n}\n\n.tabbed-pane-header-tab:hover .tabbed-pane-close-button,\n.tabbed-pane-header-tab.selected .tabbed-pane-close-button {\n    visibility: visible;\n}\n\n.tabbed-pane-header-tabs-drop-down-container {\n    float: left;\n    position: relative;\n    vertical-align: bottom;\n    line-height: 24px;\n    opacity: 0.8;\n    color: inherit;\n    font-size: 133%;\n    cursor: pointer;\n}\n\n.tabbed-pane-header-tabs-drop-down-container > .glyph {\n    height: 26px;\n    background-color: hsla(0,0%,20%,1);\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-position: -68px -143px;\n    -webkit-mask-size: 352px 168px;\n    width: 24px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.tabbed-pane-header-tabs-drop-down-container > .glyph {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.tabbed-pane-header-tabs-drop-down-container:hover {\n    background-color: rgb(229, 229, 229);\n}\n\n.tabbed-pane-header-tabs-drop-down-container.measuring {\n    visibility: hidden;\n}\n\n.tabbed-pane-header-tabs-drop-down-container:hover {\n    opacity: 1.0;\n}\n\n.tabbed-pane-header-tabs-drop-down-container:active {\n    opacity: 0.8;\n}\n\n/* Web page style */\n\n.tabbed-pane-shadow.vertical-tab-layout {\n    flex-direction: row !important;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-header {\n    background-color: transparent;\n    border: none transparent !important;\n    width: auto;\n    flex: 0 0 auto;\n    flex-direction: column;\n    padding-top: 10px;\n    overflow: hidden;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-content {\n    padding: 10px 10px 10px 0;\n    overflow-x: hidden;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-header-contents {\n    margin: 0;\n    flex: none;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-header-tabs {\n    display: flex;\n    flex-direction: column;\n    width: 120px;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-header-tab {\n    background-color: transparent;\n    border: none transparent;\n    font-weight: normal;\n    text-shadow: none;\n    color: #777;\n    height: 26px;\n    padding-left: 10px;\n    border-left: 6px solid transparent;\n    margin: 0;\n    display: flex;\n    align-items: center;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-header-tab:not(.selected) {\n    cursor: pointer !important;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-header-tab.selected {\n    color: inherit;\n    border: none transparent;\n    border-left: 6px solid #666;\n}\n\n.tabbed-pane-tab-slider,\n.-theme-selection-color {\n    height: 2px;\n    position: absolute;\n    bottom: -1px;\n    background-color: #3E82F7;\n    left: 0;\n    z-index: 50;\n    transform-origin: 0 100%;\n    transition: transform 150ms cubic-bezier(0, 0, 0.2, 1);\n    visibility: hidden;\n    border-top: 1px solid hsl(218, 82%, 78%);\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n    .tabbed-pane-tab-slider {\n        border-top: none;\n    }\n}\n\n.tabbed-pane-tab-slider.enabled {\n    visibility: visible;\n}\n\n.tabbed-pane-header.tabbed-pane-no-header-background {\n    background-color: transparent;\n}\n\n/*# sourceURL=ui/tabbedPane.css */";Runtime.cachedResources["ui/textButton.css"]="/*\n * Copyright (c) 2014 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n:host {\n    background-image: linear-gradient(hsl(0, 0%, 93%), hsl(0, 0%, 93%) 38%, hsl(0, 0%, 87%));\n    border: 1px solid hsla(0, 0%, 0%, 0.25);\n    border-radius: 2px;\n    box-shadow: 0 1px 0 hsla(0, 0%, 0%, 0.08), inset 0 1px 2px hsla(0, 100%, 100%, 0.75);\n    color: hsl(0, 0%, 27%);\n    font-size: 12px;\n    margin: 0 1px 0 0;\n    text-shadow: 0 1px 0 hsl(0, 0%, 94%);\n    min-height: 2em !important;\n    padding-left: 10px;\n    padding-right: 10px;\n    -webkit-user-select: none;\n    flex: none;\n}\n\n:host-context(body.inactive),\n:host(:disabled) {\n    background-image: linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6);\n    border-color: rgba(80, 80, 80, 0.2);\n    box-shadow: 0 1px 0 rgba(80, 80, 80, 0.08), inset 0 1px 2px rgba(255, 255, 255, 0.75);\n    color: #aaa;\n}\n\n:host(:not(:disabled):hover) {\n    background-image: linear-gradient(hsl(0, 0%, 94%), hsl(0, 0%, 94%) 38%, hsl(0, 0%, 88%));\n    border-color: hsla(0, 0%, 0%, 0.3);\n    box-shadow: 0 1px 0 hsla(0, 0%, 0%, 0.12), inset 0 1px 2px hsla(0, 100%, 100%, 0.95);\n    color: hsl(0, 0%, 0%);\n}\n\n:host(:not(:disabled):active) {\n    background-image: linear-gradient(hsl(0, 0%, 91%), hsl(0, 0%, 91%) 38%, hsl(0, 0%, 84%));\n    box-shadow: none;\n    text-shadow: none;\n}\n\n:host(:not(:disabled):focus) {\n    -webkit-transition: border-color 200ms;\n    border-color: rgb(77, 144, 254);\n    outline: none;\n}\n\n/*# sourceURL=ui/textButton.css */";Runtime.cachedResources["ui/textPrompt.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.text-prompt-editing {\n    -webkit-user-select: text;\n    box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;\n    outline: 1px solid rgb(66%, 66%, 66%) !important;\n    background-color: white;\n    -webkit-user-modify: read-write-plaintext-only;\n    text-overflow: clip !important;\n    padding-left: 2px;\n    margin-left: -2px;\n    padding-right: 2px;\n    margin-right: -2px;\n    margin-bottom: -1px;\n    padding-bottom: 1px;\n    opacity: 1.0 !important;\n}\n\n.text-prompt-editing,\n.text-prompt-editing ::content * {\n    color: #222 !important;\n    text-decoration: none !important;\n    -webkit-user-modify: read-write-plaintext-only;\n}\n\n::content .auto-complete-text,\n.text-prompt-editing ::content .auto-complete-text {\n    color: rgb(128, 128, 128) !important;\n    -webkit-user-select: none;\n    -webkit-user-modify: read-only;\n}\n\n.text-prompt-editing ::content br {\n    display: none;\n}\n\n/*# sourceURL=ui/textPrompt.css */";Runtime.cachedResources["ui/tooltip.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.tooltip {\n    background: hsl(0, 0%, 95%);\n    border-radius: 2px;\n    color: hsl(0, 0%, 20%);\n    padding: 5px 8px;\n    font-size: 11px;\n    line-height: 14px;\n    display: flex;\n    align-items: center;\n    -webkit-filter: drop-shadow(0 1px 2px hsla(0, 0%, 0%, 0.3));\n    border: 1px solid hsla(0, 0%, 0%, 0.1);\n    background-clip: padding-box;\n    box-sizing: border-box;\n    position: absolute;\n    visibility: hidden;\n    transition: visibility 0s 100ms, opacity 150ms cubic-bezier(0, 0, .2, 1);\n    z-index: 20001;\n    top: 0;\n    left: 0;\n    opacity: 0;\n    text-overflow: ellipsis;\n    overflow: hidden;\n}\n\n.tooltip.shown {\n    visibility: visible;\n    transition-delay: 600ms;\n    opacity: 1;\n}\n\n.tooltip.shown.instant {\n    transition-delay: 0s;\n}\n\n.tooltip-shortcut {\n    color: hsl(0, 0%, 45%);\n    display: inline-block;\n    margin-left: 8px;\n    flex: 0 0 auto;\n}\n\n/*# sourceURL=ui/tooltip.css */";Runtime.cachedResources["ui/treeoutline.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n:host {\n    flex: 1 1;\n    padding: 2px 0 0 0;\n}\n\n.tree-outline-disclosure {\n    min-width: 100%;\n    display: inline-block;\n}\n\n.tree-outline {\n    padding: 0 0 4px 4px;\n    margin: 0;\n    z-index: 0;\n    position: relative;\n}\n\n.tree-outline li.hovered:not(.selected) .selection {\n    display: block;\n    left: 3px;\n    right: 3px;\n    background-color: rgba(56, 121, 217, 0.1);\n    border-radius: 5px;\n}\n\n.tree-outline li .selection {\n    display: none;\n    z-index: -1;\n    margin-left: -10000px;\n}\n\n.tree-outline li.selected .selection {\n    display: block;\n    background-color: #ddd;\n}\n\n.tree-outline li.in-clipboard .highlight {\n    outline: 1px dotted darkgrey;\n}\n\n.tree-outline li.elements-drag-over .selection {\n    display: block;\n    margin-top: -2px;\n    border-top: 2px solid rgb(56, 121, 217);\n}\n\nol.tree-outline:focus li.selected .selection {\n    background-color: rgb(56, 121, 217);\n}\n\nol.tree-outline:focus li.parent.selected::before {\n    background-color: white;\n}\n\nol.tree-outline,\n.tree-outline ol {\n    list-style-type: none;\n}\n\n.tree-outline-no-padding {\n    padding: 0;\n}\n\n.tree-outline ol {\n    padding-left: 12px;\n}\n\n.tree-outline li {\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    position: relative;\n    display: flex;\n    align-items: center;\n}\n\nol.tree-outline:focus li.selected {\n    color: white;\n}\n\nol.tree-outline:focus li.selected * {\n    color: inherit;\n}\n\n.tree-outline li::before {\n    -webkit-user-select: none;\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-size: 352px 168px;\n    content: \"aa\";\n    color: transparent;\n    text-shadow: none;\n    margin-right: -2px;\n    height: 12px;\n}\n\n.tree-outline li:not(.parent)::before {\n    background-color: transparent;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.tree-outline li::before {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.tree-outline li::before {\n    -webkit-mask-position: -4px -96px;\n    background-color: rgb(110, 110, 110);\n}\n\n.tree-outline li.parent.expanded::before {\n    -webkit-mask-position: -20px -96px;\n}\n\n.tree-outline ol.children {\n    display: none;\n}\n\n.tree-outline ol.children.expanded {\n    display: block;\n}\n\n/*# sourceURL=ui/treeoutline.css */";Runtime.cachedResources["components/breakpointsList.css"]="/*\n * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.\n * Copyright (C) 2009 Anthony Ricaud <rik@webkit.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1.  Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n * 3.  Neither the name of Apple Computer, Inc. (\"Apple\") nor the names of\n *     its contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n.sidebar-pane .breakpoint-condition {\n    display: block;\n    margin-top: 4px;\n    margin-bottom: 4px;\n    margin-left: 23px;\n    margin-right: 8px;\n}\n\n.breakpoint-list .editing.being-edited {\n    overflow: hidden;\n    white-space: nowrap;\n}\n\n#breakpoint-condition-input {\n    display: block;\n    margin-left: 0;\n    margin-right: 0;\n    outline: none !important;\n    border: 1px solid rgb(66%, 66%, 66%);\n}\n\nol.breakpoint-list {\n    -webkit-padding-start: 0;\n    list-style: none;\n    margin: 0;\n    padding-bottom: 3px;\n}\n\n.breakpoints-list-deactivated {\n    background-color: #eee;\n    opacity: 0.3;\n}\n\n.breakpoint-list li {\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    padding: 2px 0;\n}\n\n.breakpoint-list li:hover {\n    background-color: #eee;\n}\n\n.breakpoint-list .source-text {\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    margin: 2px 0 0 20px;\n}\n\n.sidebar-pane .breakpoint-hit {\n    background-color: rgb(255, 255, 194);\n}\n\n.-theme-with-dark-background .sidebar-pane .breakpoint-hit {\n    background-color: hsl(46, 98%, 22%);\n    color: #ccc;\n}\n\nli.breakpoint-hit .breakpoint-hit-marker {\n    background-color: rgb(255, 255, 194);\n    height: 18px;\n    left: 0;\n    margin-top: -16px;\n    position: absolute;\n    right: 0;\n    z-index: -1;\n}\n\n.event-listener-breakpoints {\n    margin-top: 0;\n    padding: 2px 6px;\n    list-style: none;\n    min-height: 18px;\n}\n\n.event-listener-breakpoints ol {\n    display: none;\n    margin: 0;\n    -webkit-padding-start: 12px;\n    list-style: none;\n}\n\n.event-listener-breakpoints ol.expanded {\n    display: block;\n}\n\n.event-listener-breakpoints li {\n    margin-left: 12px;\n    text-overflow: ellipsis;\n    -webkit-user-select: text;\n    cursor: default;\n}\n\n.event-listener-breakpoints li.parent {\n    margin-left: 1px;\n}\n\n.event-listener-breakpoints li.parent::before {\n    -webkit-user-select: none;\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 168px;\n    opacity: 0.5;\n    content: \"a\";\n    width: 8px;\n    float: left;\n    margin: 2px 2px 0 -2px;\n    color: transparent;\n    text-shadow: none;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.event-listener-breakpoints li.parent::before {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.event-listener-breakpoints li.parent::before {\n    background-position: -4px -96px;\n}\n\n.event-listener-breakpoints li.parent.expanded::before {\n    background-position: -20px -96px;\n}\n\n.event-listener-breakpoints .children li {\n    margin-left: 12px;\n}\n\n.async-operations li > label {\n    float: left;\n}\n\n.async-operations li > div {\n    float: right;\n    margin: 2px 3px 0 2px;\n}\n\n.dom-breakpoints-list > li {\n    display: flex;\n}\n\n.dom-breakpoints-list .dom-breakpoint > div {\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n\n/*# sourceURL=components/breakpointsList.css */";Runtime.cachedResources["components/customPreviewSection.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.custom-expandable-section {\n    display: inline-flex;\n    flex-direction: column;\n}\n\n.custom-expandable-section-header::before {\n    -webkit-user-select: none;\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 168px;\n    opacity: 0.5;\n    content: \"a\";\n    width: 8px;\n    margin-right: 4px;\n    padding-right: 2px;\n    color: transparent;\n    text-shadow: none;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n    .custom-expandable-section-header::before {\n        background-image: url(Images/toolbarButtonGlyphs_2x.png);\n    }\n} /* media */\n\n\n.custom-expandable-section-header::before {\n    background-position: -4px -96px;\n}\n\n.custom-expandable-section-header.expanded::before {\n    background-position: -20px -96px;\n}\n\n.custom-expandable-section-standard-section {\n    display: inline-flex;\n}\n/*# sourceURL=components/customPreviewSection.css */";Runtime.cachedResources["components/eventListenersView.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.event-listener-tree li {\n    padding: 2px 0 0 5px;\n    overflow: hidden;\n    display: list-item;\n}\n\n.event-listener-tree > li {\n    border-top: 1px solid #f0f0f0;\n}\n\n.event-listener-tree > li:first-of-type {\n    border-top: none;\n}\n\n.event-listener-tree {\n    padding-left: 0 !important;\n    padding-right: 3px;\n}\n\n.event-listener-tree li.parent::before {\n    top: 0 !important;\n}\n\n.event-listener-tree .name {\n    color: rgb(136, 19, 145);\n}\n\n.event-listener-tree-subtitle {\n    float: right;\n    margin-left: 5px;\n}\n\n.event-listener-delete-button {\n    padding: 0 3px;\n    background-color: #f2f2f2;\n    border-radius: 3px;\n    border: 1px solid #c3c3c3;\n    margin-left: 10px;\n    display: none;\n}\n\n.event-listener-delete-button:hover {\n    background-color: #e0e0e0;\n}\n\n.event-listener-tree li:hover .event-listener-delete-button {\n    display: inline;\n}\n\n/*# sourceURL=components/eventListenersView.css */";Runtime.cachedResources["components/domUtils.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n:host {\n  display: inline;\n}\n\n.node-link {\n    cursor: pointer;\n    display: inline;\n    pointer-events: auto;\n}\n\n.stack-preview-async-description {\n    padding: 3px 0 1px;\n    font-style: italic;\n}\n\n.stack-preview-container .webkit-html-blackbox-link {\n    opacity: 0.6;\n}\n\n.stack-preview-container > tr {\n    height: 16px;\n    line-height: 16px;\n}\n\n.stack-preview-container td {\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n\n.stack-preview-container .function-name {\n    max-width: 80em;\n}\n\n.node-label-name {\n    color: rgb(136, 18, 128);\n}\n\n.node-label-id {\n    color: rgb(26, 26, 166);\n}\n\n.node-label-class, .node-label-pseudo {\n    color: rgb(153, 69, 0);\n}\n\n/*# sourceURL=components/domUtils.css */";Runtime.cachedResources["components/inspectorViewTabbedPane.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.tabbed-pane-header-tab,\n.tabbed-pane-header-tab.selected {\n    height: 26px;\n    margin: 0;\n    background: #f3f3f3;\n    border: none;\n    border-left: 2px solid transparent;\n    border-right: 2px solid transparent;\n    padding: 0 6px;\n}\n\n.tabbed-pane-header-tab.selected {\n    border-width: 0 2px 0 2px;\n}\n\n.tabbed-pane-header-contents {\n    margin-left: 0;\n}\n\n/*# sourceURL=components/inspectorViewTabbedPane.css */";Runtime.cachedResources["components/networkConditionsSettingsTab.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.network-conditions-settings-tab .settings-tab.help-content {\n    display: flex;\n    flex-direction: column;\n    align-items: stretch;\n    height: 100%;\n    margin: 0;\n    max-width: 500px;\n}\n\n.network-conditions-settings-tab .conditions-title {\n    font-size: 120%;\n    color: #222;\n    flex: none;\n}\n\n.network-conditions-settings-tab .button-row {\n    flex: none;\n    display: flex;\n    margin-bottom: 10px;\n}\n\n.network-conditions-settings-tab .button-row button {\n    margin-right: 10px;\n    min-width: 120px;\n    flex: none;\n}\n\n.conditions-list-item {\n    padding: 3px 5px 3px 5px;\n    height: 30px;\n    display: flex;\n    align-items: center;\n    position: relative;\n    flex: auto 1 1;\n}\n\n.conditions-list-text {\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    flex: 0 0 70px;\n    -webkit-user-select: none;\n    color: #222;\n    text-align: end;\n    position: relative;\n}\n\n.conditions-list-title {\n    text-align: start;\n    flex: auto;\n    display: flex;\n    align-items: flex-start;\n}\n\n.conditions-list-title-text {\n    overflow: hidden;\n    flex: auto;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n}\n\n.conditions-list-separator {\n    flex: 0 0 1px;\n    background-color: rgb(231, 231, 231);\n    height: 30px;\n    margin: 0 4px;\n}\n\n.conditions-list-separator-invisible {\n    visibility: hidden;\n    height: 100% !important;\n}\n\n.conditions-edit-row {\n    flex: none;\n    display: flex;\n    flex-direction: row;\n    margin: 6px 5px;\n}\n\n.conditions-edit-row input {\n    width: 100%;\n    text-align: inherit;\n}\n\n.conditions-edit-optional {\n    position: absolute;\n    bottom: -20px;\n    right: 0;\n    color: rgb(128, 128, 128);\n}\n\n/*# sourceURL=components/networkConditionsSettingsTab.css */";Runtime.cachedResources["components/objectPropertiesSection.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.object-properties-section .name {\n    color: rgb(136, 19, 145);\n    flex-shrink: 0;\n}\n\n.object-properties-section-separator {\n    flex-shrink: 0;\n    padding-right: 5px;\n}\n\n.object-properties-section-dimmed {\n    opacity: 0.6;\n}\n\n.object-properties-section {\n    padding: 0 0 0px 0px;\n    color: rgb(33,33,33) !important;\n    display: flex;\n    flex-direction: column;\n}\n\n.object-properties-section li {\n    min-height: inherit;\n    line-height: 15px;\n    -webkit-user-select: text;\n}\n\n.object-properties-section li::before {\n    top: -1px;\n}\n\n.object-properties-section li.editing-sub-part {\n    padding: 3px 6px 8px;\n    margin: -1px -6px -8px -6px;\n    text-overflow: clip;\n}\n\n.object-properties-section li.editing {\n    margin-left: 10px;\n    text-overflow: clip;\n}\n\n.tree-outline ol.title-less-mode {\n    padding-left: 0px;\n}\n\n.object-properties-section .synthetic-property {\n    font-style: italic;\n}\n\n.object-properties-section-root-element {\n    display: flex;\n    flex-direction: row;\n}\n\n.object-properties-section-root-element::before {\n    -webkit-mask-position: -4px -97px !important;\n}\n\n.object-properties-section-root-element.expanded::before {\n    -webkit-mask-position: -20px -97px !important;\n}\n\n/*# sourceURL=components/objectPropertiesSection.css */";Runtime.cachedResources["components/objectValue.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.object-value-scientific-notation-exponent {\n    flex-shrink: 0;\n}\n\n.object-value-scientific-notation-mantissa {\n    overflow: hidden;\n    text-overflow: ellipsis;\n    flex-shrink: 1;\n    min-width: 1ex;\n}\n\n.object-value-scientific-notation-number {\n    display: flex !important;\n}\n\n.object-value-node:hover {\n    background-color: rgba(56, 121, 217, 0.1);\n}\n\n.object-value-function::before {\n    content: \"function\";\n    color: rgb(170, 13, 145);\n    padding-right: 5px;\n}\n\n.object-value-function {\n    font-style: italic;\n}\n\n.object-value-function.linkified:hover {\n    background-color: rgba(0, 0, 0, 0.1);\n    cursor: pointer;\n}\n\n.object-value-object,\n.object-value-map,\n.object-value-set,\n.object-value-iterator,\n.object-value-generator,\n.object-value-node,\n.object-value-array {\n    position: relative;\n    vertical-align: top;\n    color: inherit;\n    display: inline-block;\n}\n\n.object-value-number,\n.object-value-boolean {\n    color: rgb(28, 0, 207);\n}\n\n.object-value-string,\n.object-value-regexp,\n.object-value-symbol {\n    color: rgb(196, 26, 22);\n    white-space: pre;\n    unicode-bidi: -webkit-isolate;\n}\n\n.object-value-node {\n    color: rgb(136, 18, 128);\n}\n\n.object-value-null,\n.object-value-undefined {\n    color: rgb(128, 128, 128);\n}\n\n.object-value {\n    text-overflow: ellipsis;\n    overflow: hidden;\n    -webkit-user-select: text;\n}\n\n.object-value-calculate-value-button:hover {\n    text-decoration: underline;\n}\n\n.object-value-object .section,\n.object-formatted-map .section,\n.object-value-set .section,\n.object-value-iterator .section,\n.object-value-generator .section,\n.object-value-node .section,\n.object-value-array .section {\n    position: static;\n}\n.object-value-object .section > .header::before {\n    margin-top: 0;\n}\n\n\n.object-value-object .properties-tree,\n.object-value-map .properties-tree,\n.object-value-set .properties-tree,\n.object-value-iterator .properties-tree,\n.object-value-generator .properties-tree,\n.object-value-node .properties-tree {\n    padding-left: 0 !important;\n}\n\n.object-value-preview-node,\n.section .object-value-node {\n    color: rgb(136, 18, 128);\n}\n\n.object-properties-section-custom-section {\n    display: inline-flex;\n    flex-direction: column;\n}\n\n.-theme-with-dark-background .object-value-number,\n:host-context(.-theme-with-dark-background) .object-value-number,\n.-theme-with-dark-background .object-value-boolean,\n:host-context(.-theme-with-dark-background) .object-value-boolean {\n    color: hsl(252, 100%, 75%);\n}\n\n/*# sourceURL=components/objectValue.css */";Runtime.cachedResources["emulation/devicesSettingsTab.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.devices-settings-tab .settings-tab.help-content {\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    height: 100%;\n    margin: 0;\n}\n\n.devices-settings-tab .devices-title {\n    font-size: 120%;\n    color: #222;\n    flex: none;\n}\n\n.devices-settings-tab .devices-button-row {\n    flex: none;\n    display: flex;\n}\n\n.devices-settings-tab .devices-button-row button {\n    margin-right: 10px;\n    min-width: 120px;\n    flex: none;\n}\n\n.devices-settings-tab .devices-list {\n    width: 350px;\n    margin-top: 10px;\n}\n\n.devices-list-item {\n    padding: 3px 5px 3px 5px;\n    height: 30px;\n    display: flex;\n    align-items: center;\n    flex: auto 1 1;\n    cursor: pointer;\n}\n\n.devices-list-checkbox {\n    height: 12px;\n    width: 12px;\n    margin: 3px 5px 2px 2px;\n    flex: none;\n    pointer-events: none;\n}\n\n.devices-list-title {\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    flex: auto;\n    -webkit-user-select: none;\n    color: #222;\n}\n\n.devices-edit-fields {\n    flex: auto;\n    display: flex;\n    flex-direction: column;\n    align-items: stretch;\n    margin-bottom: 5px;\n}\n\n.devices-edit-fields input {\n    flex: auto;\n    margin: 8px 5px 0 5px;\n    height: 22px;\n    border: 1px solid rgb(213, 213, 213);\n    border-radius: 2px;\n    color: #444444;\n    padding: 3px;\n}\n\n.devices-edit-fields input.device-edit-small {\n    flex: 0 0 80px;\n}\n\n/*# sourceURL=emulation/devicesSettingsTab.css */";Runtime.cachedResources["emulation/deviceModeToolbar.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.device-mode-size-input {\n    background: hsl(0, 0%, 100%);\n    border: none;\n    padding: 2px 0;\n    width: 39px !important;\n    margin: 0 3px;\n    text-align: center;\n}\n\n.device-mode-size-input.error-input {\n    outline: auto 2px red;\n}\n\n.device-mode-size-input:disabled {\n    background: transparent;\n    -webkit-user-select: none;\n}\n\n.device-mode-x {\n    margin: 0 1px;\n    font-size: 16px;\n}\n\n.device-mode-device-select {\n    background: none;\n    box-shadow: none;\n    border: none;\n    outline: none;\n    padding: 0 2px;\n    -webkit-appearance: menulist;\n    margin: 0;\n    width: 120px;\n}\n\n.device-mode-checkbox {\n    width: 120px;\n    display: flex;\n    flex-direction: row;\n    justify-content: center;\n}\n\n/*# sourceURL=emulation/deviceModeToolbar.css */";Runtime.cachedResources["emulation/deviceModeView.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n:host {\n    overflow: hidden;\n    align-items: stretch;\n    flex: auto;\n    background-color: #fcfcfc;\n}\n\n.device-mode-toolbar {\n    flex: none;\n    background-color: #f3f3f3;\n    border-bottom: 1px solid #ccc;\n    display: flex;\n    flex-direction: row;\n    align-items: stretch;\n    padding: 0 4px;\n}\n\n.device-mode-toolbar .toolbar {\n    padding: 0;\n    overflow: hidden;\n    flex: auto;\n}\n\n.device-mode-toolbar-left {\n    flex: 0 1000 115px;\n    min-width: 93px;\n}\n\n.device-mode-toolbar-right {\n    flex: 0 1000 115px;\n    min-width: 40px;\n    display: flex;\n}\n\n.device-mode-toolbar-middle-container {\n    flex: 1 1 160px;\n    position: relative;\n}\n\n.device-mode-toolbar-middle {\n    display: flex;\n    justify-content: flex-start;\n    overflow: hidden;\n}\n\n.device-mode-toolbar-middle .toolbar {\n    flex: 0 1 auto;\n}\n\n.device-mode-toolbar-spacer {\n    flex: auto;\n}\n\n.device-mode-content-clip {\n    overflow: hidden;\n    flex: auto;\n}\n\n.device-mode-media-container {\n    flex: none;\n    overflow: hidden;\n    box-shadow: inset 0 -1px #ccc;\n}\n\n.device-mode-content-area {\n    flex: auto;\n    position: relative;\n    margin: 0;\n}\n\n.device-mode-screen-area {\n    position: absolute;\n    left: 0;\n    right: 0;\n    width: 0;\n    height: 0;\n    background-color: #171717;\n    box-shadow: hsl(0, 0%, 88%) 1px 1px 0 1px, hsla(0, 0%, 80%, 0.6) 0 0 16px;\n}\n\n.device-mode-screen-image {\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n}\n\n.device-mode-resizer {\n    position: absolute;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    transition: background-color 0.1s ease;\n}\n\n.device-mode-resizer:hover {\n    background-color: hsla(0, 0%, 0%, 0.1);\n}\n\n.device-mode-resizer > div {\n    content: url(Images/toolbarResizerHorizontal.png);\n    pointer-events: none;\n    margin: 0 0 0 1px;\n}\n\n.device-mode-width-resizer {\n    top: 0;\n    bottom: 0;\n    right: -14px;\n    width: 14px;\n}\n\n.device-mode-height-resizer {\n    left: 0;\n    right: 0;\n    bottom: -14px;\n    height: 14px;\n}\n\n.device-mode-height-resizer > div {\n    transform: rotate(90deg);\n    margin: 1px 0 0 0;\n}\n\n.device-mode-corner-resizer {\n    left: 0;\n    top: 0;\n    right: -14px;\n    bottom: -14px;\n    background-color: hsla(0, 0%, 0%, 0.02);\n}\n\n.device-mode-corner-resizer > div {\n    position: absolute;\n    right: 2px;\n    bottom: 2px;\n    transform: rotate(45deg);\n}\n\n.device-mode-page-area {\n    position: absolute;\n    left: 0;\n    right: 0;\n    width: 0;\n    height: 0;\n    display: flex;\n    background-color: #fcfcfc;\n}\n\n.device-mode-ruler {\n    pointer-events: none;\n    position: relative;\n}\n\n.device-mode-ruler-top {\n    flex: 0 0 20px;\n}\n\n.device-mode-ruler-left {\n    position: absolute;\n    left: 0;\n    width: 20px;\n    top: 0;\n    bottom: 0;\n    transform: translateX(-20px);\n}\n\n.device-mode-ruler-marker {\n    position: absolute;\n}\n\n.device-mode-ruler-top .device-mode-ruler-marker {\n    width: 0;\n    height: 5px;\n    bottom: 0;\n    border-right: 1px solid hsl(0, 0%, 50%);\n    margin-right: -1px;\n}\n\n.device-mode-ruler-top .device-mode-ruler-marker.device-mode-ruler-marker-medium {\n    height: 10px;\n}\n\n.device-mode-ruler-top .device-mode-ruler-marker.device-mode-ruler-marker-large {\n    height: 15px;\n}\n\n.device-mode-ruler-left .device-mode-ruler-marker {\n    height: 0;\n    width: 5px;\n    right: 0;\n    border-bottom: 1px solid hsl(0, 0%, 50%);\n    margin-bottom: -1px;\n}\n\n.device-mode-ruler-left .device-mode-ruler-marker.device-mode-ruler-marker-medium {\n    width: 10px;\n}\n\n.device-mode-ruler-left .device-mode-ruler-marker.device-mode-ruler-marker-large {\n    width: 15px;\n}\n\n.device-mode-ruler-text {\n    font-size: 11px;\n    color: hsl(0, 0%, 50%);\n    position: relative;\n    pointer-events: auto;\n}\n\n.device-mode-ruler-text:hover {\n    color: hsl(0, 0%, 10%);\n}\n\n.device-mode-ruler-top .device-mode-ruler-text {\n    left: 2px;\n    top: -2px;\n}\n\n.device-mode-ruler-left .device-mode-ruler-text {\n    left: -4px;\n    top: -15px;\n    transform: rotate(270deg);\n}\n\n/*# sourceURL=emulation/deviceModeView.css */";Runtime.cachedResources["emulation/mediaQueryInspector.css"]="/*\n * Copyright 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n/* Media query bars */\n\n.media-inspector-view {\n    height: 50px;\n}\n\n.media-inspector-marker-container {\n    position: relative;\n    height: 14px;\n    margin: 2px 0;\n}\n\n.media-inspector-marker {\n    position: absolute;\n    top: 1px;\n    bottom: 1px;\n    white-space: nowrap;\n    z-index: auto;\n}\n\n.media-inspector-marker:hover {\n    top: -1px;\n    bottom: -1px;\n    opacity: 1;\n}\n\n.media-inspector-marker-max-width {\n    background-color: hsl(207, 90%, 77%);\n    border-right: 2px solid hsl(207, 90%, 61%);\n}\n\n.media-inspector-marker-max-width.media-inspector-marker-inactive:not(:hover) {\n    background-color: hsl(199, 94%, 94%);\n}\n\n.media-inspector-marker-min-max-width {\n    background-color: hsl(88, 50%, 76%);\n    border-left: 2px solid #689F38;\n    border-right: 2px solid hsl(92, 48%, 42%);\n}\n\n.media-inspector-marker-min-max-width.media-inspector-marker-inactive:not(:hover) {\n    background-color: hsl(125, 39%, 94%);\n}\n\n.media-inspector-marker-min-max-width:hover {\n    z-index: 1;\n}\n\n.media-inspector-marker-min-width {\n    background-color: hsl(36, 100%, 75%);\n    border-left: 2px solid hsl(30, 100%, 48%);\n}\n\n.media-inspector-marker-min-width.media-inspector-marker-inactive:not(:hover) {\n    background-color: hsl(37, 100%, 94%);\n}\n\n/* Media query labels */\n\n.media-inspector-marker:not(:hover) .media-inspector-marker-label-container {\n    display: none;\n}\n\n.media-inspector-marker-label-container {\n    position: absolute;\n    z-index: 1;\n}\n\n.media-inspector-marker-label-container-left {\n    left: -2px;\n}\n\n.media-inspector-marker-label-container-right {\n    right: -2px;\n}\n\n.media-inspector-marker-label {\n    color: #222;\n    position: absolute;\n    top: 1px;\n    bottom: 0;\n    font-size: 12px;\n    pointer-events: none;\n}\n\n.media-inspector-label-right {\n    right: 4px;\n}\n\n.media-inspector-label-left {\n    left: 4px;\n}\n\n/*# sourceURL=emulation/mediaQueryInspector.css */";Runtime.cachedResources["emulation/responsiveDesignView.css"]="/*\n * Copyright 2014 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.responsive-design {\n    position: relative;\n    background-color: rgb(0, 0, 0);\n    overflow: hidden;\n}\n\n.responsive-design-view {\n    overflow: hidden;\n}\n\n.responsive-design-canvas {\n    pointer-events: none;\n}\n\n.responsive-design-sliders-container {\n    position: absolute;\n    overflow: visible;\n}\n\n.responsive-design-generic-outline-container {\n    position: absolute;\n    overflow: hidden;\n    top: 0;\n    left: 0;\n    right: -19px;\n    bottom: -19px;\n}\n\n.responsive-design-generic-outline {\n    position: absolute;\n    top: -10px;\n    left: -10px;\n    right: 5px;\n    bottom: 5px;\n    border-radius: 8px;\n    background-color: rgb(51, 51, 51);\n    box-shadow: rgb(20, 20, 20) 3px 3px 4px;\n}\n\n.responsive-design-slider-width {\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    right: -14px;\n    width: 14px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n\n.responsive-design-slider-height {\n    position: absolute;\n    left: 0;\n    right: 0;\n    bottom: -14px;\n    height: 14px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n\n.responsive-design-slider-corner {\n    position: absolute;\n    right: -14px;\n    width: 14px;\n    bottom: -14px;\n    height: 14px;\n}\n\n.responsive-design-thumb-handle {\n    content: url(Images/toolbarResizerHorizontal.png);\n    pointer-events: none;\n}\n\n.responsive-design-slider-height .responsive-design-thumb-handle  {\n    transform: rotate(90deg);\n}\n\n.responsive-design-page-container {\n    background-color: #171717;\n}\n\n.responsive-design-page-container-image {\n    position: absolute;;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n}\n\n.responsive-design-page-scale-container {\n    position: absolute !important;\n    top: 0;\n    right: 0;\n    padding: 10px;\n    background-color: rgba(0, 0, 0, 0.3);\n    align-items: center;\n}\n\n.responsive-design-page-scale-label {\n    display: block;\n    height: 20px;\n    margin: 0 4px;\n    padding-top: 3px;\n    color: white;\n    cursor: default !important;\n}\n\n.responsive-design-page-scale-container .responsive-design-page-scale-button > .glyph {\n    display: block;\n    width: 18px;\n    height: 18px;\n    border: 1px solid transparent;\n    border-radius: 2px;\n}\n\n.responsive-design-page-scale-container .responsive-design-page-scale-button:not(:disabled):hover {\n    box-shadow: rgb(255, 255, 255) 0 0 3px;\n}\n\n.responsive-design-page-scale-container .responsive-design-page-scale-button {\n    border: none;\n    background-color: transparent;\n    padding: 2px 0 0 0;\n}\n\n.responsive-design-page-scale-container .responsive-design-page-scale-button > .glyph {\n    background-color: rgb(180, 180, 180);\n    -webkit-mask-image: url(Images/responsiveDesign.png);\n    -webkit-mask-size: 112px 16px;\n    opacity: 1;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.responsive-design-page-scale-container .responsive-design-page-scale-button > .glyph {\n    -webkit-mask-image: url(Images/responsiveDesign_2x.png);\n}\n} /* media */\n\n.responsive-design-page-scale-increase > .glyph {\n    -webkit-mask-position: -80px 0;\n}\n\n.responsive-design-page-scale-decrease > .glyph {\n    -webkit-mask-position: -96px 0;\n}\n\n/* Toolbar */\n\n.responsive-design-toolbar {\n    display: flex;\n    flex: none;\n    background: linear-gradient(to bottom, rgb(83, 81, 81), rgb(59, 59, 59));\n    color: rgb(255, 255, 255);\n    overflow: hidden;\n    border-bottom: 1px solid rgb(71, 71, 71);\n}\n\n.responsive-design-separator {\n    flex: none;\n    width: 3px;\n    background-color: rgb(46, 46, 46);\n    border-right: 1px solid rgb(75, 75, 75);\n}\n\n.responsive-design-section {\n    display: flex;\n    flex: none;\n    flex-direction: column;\n    white-space: nowrap;\n    align-items: stretch;\n    justify-content: flex-start;\n    padding-top: 1px;\n}\n\n.responsive-design-section-decorator {\n    height: 2px;\n    margin-left: -2px;\n    margin-right: -1px;\n    position: relative;\n}\n\n.responsive-design-suite {\n    display: flex;\n    flex-direction: row;\n    padding: 2px 11px;\n    color: rgb(180, 180, 180);\n}\n\n.responsive-design-suite.responsive-design-suite-top {\n    color: rgb(255, 255, 255);\n}\n\n.responsive-design-suite-separator {\n    flex: none;\n    width: 1px;\n    background-color: rgb(43, 43, 43);\n    margin: 0 6px;\n}\n\n.responsive-design-suite > div:not(.responsive-design-suite-separator) {\n    flex: none;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: space-between;\n    height: 23px;\n    overflow: hidden;\n}\n\n/* Toolbar controls */\n\n.responsive-design-toolbar fieldset,\n.responsive-design-toolbar p {\n    margin: 0;\n    border: 0;\n    padding: 0;\n    display: inline-block;\n}\n\n.responsive-design-toolbar .field-error-message {\n    display: none;\n}\n\n.responsive-design-toolbar label {\n    cursor: default !important;\n    margin: 0 2px;\n}\n\n.responsive-design-toolbar input[type='text'] {\n    text-align: left;\n    background-color: transparent;\n    border: none;\n    margin: 0 1px 1px 0;\n    padding: 3px 2px;\n}\n\n.responsive-design-toolbar input[type='text'].numeric {\n    text-align: center;\n}\n\n.responsive-design-toolbar input:focus::-webkit-input-placeholder {\n    color: transparent !important;\n}\n\n.responsive-design-toolbar fieldset:disabled input,\n.responsive-design-toolbar fieldset:disabled button {\n    opacity: 0.7;\n}\n\n.responsive-design-toolbar input.error-input {\n    color: red !important;\n    text-decoration: line-through;\n}\n\n.responsive-design-toolbar select {\n    height: 18px;\n    background-color: rgb(87, 87, 87);\n    border: 0;\n    margin-left: 10px;\n    line-height: 16px;\n}\n\n.responsive-design-toolbar input:focus {\n    background-color: rgb(81, 81, 81);\n}\n\n/* Toolbar icons */\n\n.responsive-design-icon {\n    background-color: rgb(180, 180, 180);\n    -webkit-mask-image: url(Images/responsiveDesign.png);\n    -webkit-mask-size: 112px 16px;\n}\n\n.responsive-design-icon {\n    display: inline-block;\n    width: 16px;\n    height: 16px;\n    position: relative;\n    top: 3px;\n}\n\ndiv.responsive-design-icon:disabled {\n    opacity: 1 !important;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.responsive-design-icon {\n    -webkit-mask-image: url(Images/responsiveDesign_2x.png);\n}\n} /* media */\n\n.responsive-design-icon-resolution {\n    -webkit-mask-position: 0 0;\n}\n\n.responsive-design-icon-dpr {\n    -webkit-mask-position: -16px 0;\n}\n\n.responsive-design-icon-swap {\n    background-color: rgb(255, 170, 0);\n    -webkit-mask-position: -32px 0;\n    -webkit-appearance: none;\n    padding: 0;\n    border: 0;\n}\n\n.responsive-design-icon-swap {\n    margin-left: 1px;\n    top: 4px;\n}\n\n.responsive-design-icon-swap:hover {\n    background-color: rgb(255, 180, 0);\n}\n\n.responsive-design-icon-swap:active {\n    opacity: 0.8;\n}\n\n/* Buttons section */\n\n.responsive-design-section-buttons {\n    padding: 4px 0 0 0;\n    background: rgb(17, 17, 17);\n}\n\n.responsive-design-more-button-container {\n    flex: auto;\n    display: flex;\n    justify-content: flex-end;\n    align-items: flex-end;\n    overflow: hidden;\n}\n\n.responsive-design-more-button {\n    -webkit-appearance: none;\n    border: 0;\n    background-color: transparent;\n    color: white;\n    opacity: 0.8;\n    font-size: 16px;\n    text-shadow: black 1px 1px;\n}\n\n.responsive-design-more-button:hover {\n    opacity: 1;\n}\n\n.responsive-design-more-button:active {\n    opacity: 0.8;\n}\n\n/* Device section */\n\n.responsive-design-section-device .responsive-design-section-decorator {\n    background: linear-gradient(to bottom, rgb(255, 186, 68), rgb(255, 119, 0));\n    margin-left: 0;\n}\n\n.responsive-design-section-device .device-select {\n    width: 140px;\n}\n\n.responsive-design-section-device .mode-container {\n    display: inline-block;\n    width: 116px;\n    padding: 0 10px;\n}\n\n.responsive-design-section-device .mode-select select {\n    width: 82px;\n}\n\n.responsive-design-section-device .mode-select label {\n    margin-left: 4px;\n    color: rgb(255, 156, 0);\n    position: relative;\n    top: 1px;\n}\n\n.responsive-design-section-device input[type='text'],\n.responsive-design-section-device input[type='text']::-webkit-input-placeholder,\n.responsive-design-section-device select {\n    color: rgb(255, 156, 0);\n}\n\n.responsive-design-section-device input[type='checkbox']:checked:after {\n    background: rgb(255, 156, 0);\n}\n\n/* Network section */\n\n.responsive-design-section-network .responsive-design-section-decorator {\n    background: linear-gradient(to bottom, rgb(77, 170, 243), rgb(0, 130, 255));\n}\n\n.responsive-design-section-network .responsive-design-suite a {\n    height: 20px;\n    background-color: transparent;\n    border: 0;\n    line-height: 16px;\n    color: rgb(66, 175, 255);\n    cursor: pointer;\n    border-radius: 2px;\n    text-decoration: underline;\n}\n\n/* Warning message */\n\n.responsive-design-warning {\n    position: absolute;\n    left: 0;\n    right: 0;\n    top: 0;\n    overflow: hidden;\n    border-bottom: 1px solid rgb(187, 187, 187);\n}\n\n/* Media query inspector */\n\n.responsive-design-media-container {\n    position: absolute;\n    right: 0;\n    top: 0;\n    padding-bottom: 5px;\n    overflow: hidden;\n}\n\n/*# sourceURL=emulation/responsiveDesignView.css */";Runtime.cachedResources["emulation/overrides.css"]="/*\n * Copyright (C) 2013 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n.overrides-view fieldset {\n    border: none;\n    flex: 0 0 auto;\n    padding: 0;\n    margin: 0;\n}\n\n.overrides-view fieldset p {\n    display: inline-block;\n    padding: 0;\n    margin: 0;\n    border: 0;\n}\n\n.overrides-device-model-settings p label {\n    display: inline-block;\n}\n\n.overrides-view .field-error-message {\n    display: none;\n}\n\n.overrides-view input[type='text']:focus::-webkit-input-placeholder {\n    color: transparent !important;\n}\n\n.overrides-view > .tabbed-pane {\n    overflow: hidden;\n}\n\n/* Device tab */\n\n.overrides-device {\n    flex: 1 1 auto;\n    overflow: auto;\n    padding: 12px;\n}\n\n.overrides-device input.numeric {\n    text-align: right;\n}\n\n.overrides-device input[type=range] {\n    width: 100%;\n}\n\n.overrides-device > label {\n    display: block;\n    margin-bottom: 7px;\n    white-space: nowrap;\n}\n\n.overrides-device label {\n    margin-bottom: 10px;\n}\n\n.overrides-device table {\n    margin-bottom: 5px;\n    white-space: nowrap !important;\n}\n\n.overrides-device > label {\n    margin-bottom: 4px;\n}\n\n.overrides-device .help-footnote {\n    border-top: 1px solid #EEEEEE;\n    margin: 0;\n    padding: 12px;\n}\n\n.overrides-view label {\n    display: flex;\n    height: auto;\n}\n\n.overrides-view fieldset[disabled] * {\n    cursor: default !important;\n}\n\n.overrides-device .overrides-device-model-section {\n    white-space: nowrap;\n}\n\n.overrides-device .overrides-device-model-section > span {\n    padding-right: 10px;\n}\n\n.overrides-device .overrides-device-model-section select {\n    height: 20px;\n}\n\n.overrides-device .overrides-device-model-section select.device-select {\n    width: 180px;\n    margin-right: 6px;\n}\n\n.overrides-device .overrides-device-model-section .mode-container {\n    display: inline-block;\n    width: 140px;\n}\n\n.overrides-device .overrides-device-model-section .mode-container label {\n    margin: 0;\n    display: inline-block;\n}\n\nfieldset.overrides-device-model-settings {\n    padding: 16px;\n}\n\n.overrides-device-model-settings > fieldset {\n    margin-left: 16px;\n}\n\n.overrides-view input[type=text]:enabled:focus,\n.overrides-view select:enabled:focus {\n    -webkit-transition: border-color 200ms;\n    border-color: rgb(77, 144, 254);\n    outline: none;\n}\n\n.overrides-view input[type=text],\n.overrides-view select {\n    border: 1px solid #bfbfbf;\n    border-radius: 2px;\n    box-sizing: border-box;\n    color: #444;\n    font: inherit;\n    border-width: 1px;\n}\n\n.overrides-view input[type=text] {\n    margin-left: 3px;\n    min-height: 2em;\n    padding: 3px;\n}\n\n.overrides-view input[readonly] {\n    background-color: rgb(235, 235, 228);\n}\n\n.overrides-view .overrides-footer {\n    flex: 0 0 auto;\n    padding: 5px 8px;\n    border-top: 1px solid rgb(203,203,203);\n    background-color: #eee;\n}\n\n.overrides-view .overrides-footer::before {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 168px;\n    width: 10px;\n    height: 10px;\n    content: \"\";\n    position: relative;\n    top: 2px;\n    background-position: -202px -107px;\n    float: left;\n    margin-right: 4px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.overrides-view .overrides-footer::before {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.overrides-view .overrides-footer label[is=dt-icon-label] {\n    margin-right: 3px;\n}\n\n.overrides-splash-screen {\n    flex: auto;\n    padding: 12px;\n}\n\n.overrides-splash-screen .toolbar {\n    display: inline-block;\n    margin-left: -4px;\n    position: relative;\n    top: 8px;\n}\n\n#overrides-disable-button {\n    margin-bottom: 12px;\n}\n\n/*# sourceURL=emulation/overrides.css */";Runtime.cachedResources["emulation/sensors.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.sensors-view {\n    padding: 12px;\n}\n\n.sensors-view label {\n    margin-bottom: 10px;\n}\n\n.sensors-view input {\n    text-align: right;\n}\n\n.sensors-view input[type=text]:enabled:focus,\n.sensors-view select:enabled:focus {\n    border-color: rgb(77, 144, 254);\n    outline: none;\n}\n\n.sensors-view input[type=text],\n.sensors-view select {\n    border: 1px solid #bfbfbf;\n    border-radius: 2px;\n    box-sizing: border-box;\n    color: #444;\n    font: inherit;\n    border-width: 1px;\n}\n\n.sensors-view input[type=text] {\n    margin-left: 3px;\n    min-height: 2em;\n    padding: 3px;\n}\n\n.sensors-view input[readonly] {\n    background-color: rgb(235, 235, 228);\n}\n\n.sensors-view fieldset {\n    border: none;\n    padding: 0 0 5px 15px;\n    flex: 0 0 auto;\n}\n\n.sensors-view fieldset[disabled] {\n    opacity: 0.5;\n}\n\n.sensors-view .field-error-message {\n    display: none;\n}\n\n.sensors-view input[type='text']:focus::-webkit-input-placeholder {\n    color: transparent !important;\n}\n\n/* Accelerometer */\n\n.accelerometer-stage {\n    -webkit-perspective: 700px;\n    -webkit-perspective-origin: 50% 50%;\n    width: 200px;\n    height: 130px;\n}\n\nfieldset.device-orientation-override-section[disabled] .accelerometer-stage {\n    cursor: default !important;\n}\n\n.accelerometer-box {\n    pointer-events:none;\n    margin-top: -54px;\n    margin-left: -40px;\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    width: 80px;\n    height: 108px;\n    -webkit-transform-style: preserve-3d;\n}\n\n.accelerometer-box section {\n    margin-top: -54px;\n    margin-left: -40px;\n    position: absolute;\n    display: block;\n    overflow: hidden;\n    top: 50%;\n    left: 50%;\n    -webkit-transform-style: flat;\n    -webkit-box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.7);\n}\n\n.accelerometer-box .front {\n    border:15px solid black;\n    width: 80px;\n    height: 107px;\n    background-color: gray;\n    transform: translate3d(0, 0, 10px);\n}\n\n.accelerometer-box .back {\n    width: 80px;\n    height: 107px;\n    background-color: black;\n    transform: rotateY(-180deg) translate3d(0, 0, 10px);\n}\n\n.accelerometer-box .top {\n    overflow: hidden;\n    width: 80px;\n    height: 20px;\n    background-color: #75CE89;\n    transform: rotateX(-90deg) translate3d(0, 0, -10px);\n}\n\n.accelerometer-box .bottom {\n    overflow: hidden;\n    width: 80px;\n    height: 20px;\n    background-color: #865C6C;\n    transform: rotateX(90deg) translate3d(0, 0, -97px);\n}\n\n.accelerometer-box .left {\n    width: 20px;\n    height: 107px;\n    background-color: #7992CB;\n    transform: rotateY(90deg) translate3d(0, 0, 70px);\n}\n\n.accelerometer-box .right {\n    width: 20px;\n    height: 107px;\n    background-color: #7992CB;\n    transform: rotateY(-90deg) translate3d(0, 0, 10px);\n}\n\n.accelerometer-axis-input-container {\n    margin-bottom: 10px;\n}\n\nfieldset.device-orientation-override-section {\n    display: flex;\n}\n/*# sourceURL=emulation/sensors.css */";Runtime.cachedResources["main/errorWarningCounter.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n:host {\n    cursor: pointer;\n    padding: 0 2px;\n    min-width: 26px;\n}\n\n:host:hover {\n    color: #333;\n}\n\n.counter-item {\n    margin-left: 6px;\n}\n\n.counter-item label {\n    cursor: inherit;\n}\n\n.counter-item.counter-item-first {\n    margin-left: 0;\n}\n\n/*# sourceURL=main/errorWarningCounter.css */";Runtime.cachedResources["main/remoteDebuggingTerminatedScreen.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.widget {\n    padding: 25px;\n}\n\n.message {\n    font-size: larger;\n    white-space: pre;\n    margin: 5px;\n}\n\n.reason {\n    color: #8b0000;\n}\n\n/*# sourceURL=main/remoteDebuggingTerminatedScreen.css */";Runtime.cachedResources["main/renderingOptions.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\nlabel {\n    margin: 12px 0 0 0;\n    padding: 0 4px 0 12px;\n}\n\n/*# sourceURL=main/renderingOptions.css */";Runtime.cachedResources["main/targetCrashedScreen.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.widget {\n    padding: 25px;\n}\n\n.message {\n    font-size: larger;\n    white-space: pre;\n    margin: 5px;\n}\n\n/*# sourceURL=main/targetCrashedScreen.css */";Runtime.startApplication("inspector");
