chrome的devtool源码inspectjs

var allDescriptors = [{
    "dependencies": ["platform", "common", "host", "ui"],
    "name": "ui_lazy",
    "scripts": []
}, {
    "experiment": "promiseTracker",
    "extensions": [{
        "className": "WebInspector.PromisePane",
        "order": "30",
        "type": "drawer-view",
        "name": "promises",
        "title": "Promises"
    }],
    "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": ["source_frame", "snippets", "extensions"],
    "extensions": [{
        "className": "WebInspector.SourcesPanelFactory",
        "order": 2,
        "type": "@WebInspector.PanelFactory",
        "name": "sources",
        "title": "Sources"
    }, {
        "className": "WebInspector.AdvancedSearchView",
        "order": "1",
        "type": "drawer-view",
        "name": "sources.search",
        "title": "Search"
    }, {
        "className": "WebInspector.SourcesPanel.ContextMenuProvider",
        "contextTypes": ["WebInspector.UISourceCode", "WebInspector.UILocation", "WebInspector.RemoteObject", "WebInspector.NetworkRequest"],
        "type": "@WebInspector.ContextMenu.Provider"
    }, {
        "className": "WebInspector.SourcesPanel.RevealingActionDelegate",
        "contextTypes": ["WebInspector.SourcesPanel", "WebInspector.ShortcutRegistry.ForwardedShortcut"],
        "bindings": [{
            "platform": "windows,linux",
            "shortcut": "F8 Ctrl+\\"
        }, {
            "platform": "mac",
            "shortcut": "F8 Meta+\\"
        }],
        "type": "@WebInspector.ActionDelegate",
        "actionId": "debugger.toggle-pause"
    }, {
        "className": "WebInspector.SourcesPanel.DebuggingActionDelegate",
        "contextTypes": ["WebInspector.SourcesPanel"],
        "bindings": [{
            "platform": "windows,linux",
            "shortcut": "F10 Ctrl+'"
        }, {
            "platform": "mac",
            "shortcut": "F10 Meta+'"
        }],
        "type": "@WebInspector.ActionDelegate",
        "actionId": "debugger.step-over"
    }, {
        "className": "WebInspector.SourcesPanel.DebuggingActionDelegate",
        "contextTypes": ["WebInspector.SourcesPanel"],
        "bindings": [{
            "platform": "windows,linux",
            "shortcut": "F11 Ctrl+;"
        }, {
            "platform": "mac",
            "shortcut": "F11 Meta+;"
        }],
        "type": "@WebInspector.ActionDelegate",
        "actionId": "debugger.step-into"
    }, {
        "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"
    }, {
        "className": "WebInspector.SourcesPanel.DebuggingActionDelegate",
        "contextTypes": ["WebInspector.SourcesPanel"],
        "bindings": [{
            "platform": "windows,linux",
            "shortcut": "Shift+F11 Shift+Ctrl+;"
        }, {
            "platform": "mac",
            "shortcut": "Shift+F11 Shift+Meta+;"
        }],
        "type": "@WebInspector.ActionDelegate",
        "actionId": "debugger.step-out"
    }, {
        "className": "WebInspector.SourcesPanel.DebuggingActionDelegate",
        "contextTypes": ["WebInspector.SourcesPanel"],
        "bindings": [{
            "platform": "windows,linux",
            "shortcut": "Ctrl+Enter"
        }, {
            "platform": "mac",
            "shortcut": "Meta+Enter"
        }],
        "type": "@WebInspector.ActionDelegate",
        "actionId": "debugger.run-snippet"
    }, {
        "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"
    }, {
        "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"
    }, {
        "className": "WebInspector.SourcesNavigatorView",
        "order": 1,
        "type": "navigator-view",
        "name": "sources",
        "title": "Sources"
    }, {
        "className": "WebInspector.ContentScriptsNavigatorView",
        "order": 2,
        "type": "navigator-view",
        "name": "contentScripts",
        "title": "Content scripts"
    }, {
        "className": "WebInspector.SnippetsNavigatorView",
        "order": 3,
        "type": "navigator-view",
        "name": "snippets",
        "title": "Snippets"
    }, {
        "className": "WebInspector.SourcesPanel.RevealingActionDelegate",
        "bindings": [{
            "platform": "mac",
            "shortcut": "Meta+O Meta+P"
        }, {
            "platform": "windows,linux",
            "shortcut": "Ctrl+O Ctrl+P"
        }],
        "type": "@WebInspector.ActionDelegate",
        "actionId": "sources.go-to-source"
    }, {
        "className": "WebInspector.SourcesView.SwitchFileActionDelegate",
        "contextTypes": ["WebInspector.SourcesView"],
        "bindings": [{
            "shortcut": "Alt+O"
        }],
        "type": "@WebInspector.ActionDelegate",
        "actionId": "sources.switch-file"
    }, {
        "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",
    "scripts": [],
    "skip_compilation": ["jsdifflib.js"]
}, {
    "remote": true,
    "name": "emulated_devices",
    "dependencies": ["emulation"],
    "extensions": [{
        "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": "Apple 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; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
            "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": "Apple 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 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53",
            "type": "phone"
        },
        "type": "emulated-device"
    }, {
        "device": {
            "show-by-default": true,
            "modes": [{
                "insets": {
                    "top": 40,
                    "right": 0,
                    "bottom": 0,
                    "left": 0
                },
                "orientation": "vertical",
                "title": "default"
            }, {
                "insets": {
                    "top": 64,
                    "right": 0,
                    "bottom": 45,
                    "left": 0
                },
                "orientation": "vertical",
                "title": "navigation bar"
            }, {
                "insets": {
                    "top": 40,
                    "right": 0,
                    "bottom": 260,
                    "left": 0
                },
                "orientation": "vertical",
                "title": "keyboard"
            }, {
                "insets": {
                    "top": 64,
                    "right": 0,
                    "bottom": 260,
                    "left": 0
                },
                "orientation": "vertical",
                "title": "navigation bar and keyboard"
            }, {
                "insets": {
                    "top": 0,
                    "right": 0,
                    "bottom": 0,
                    "left": 0
                },
                "orientation": "horizontal",
                "title": "default"
            }, {
                "insets": {
                    "top": 44,
                    "right": 0,
                    "bottom": 0,
                    "left": 0
                },
                "orientation": "horizontal",
                "title": "navigation bar"
            }, {
                "insets": {
                    "top": 0,
                    "right": 0,
                    "bottom": 206,
                    "left": 0
                },
                "orientation": "horizontal",
                "title": "keyboard"
            }, {
                "insets": {
                    "top": 44,
                    "right": 0,
                    "bottom": 206,
                    "left": 0
                },
                "orientation": "horizontal",
                "title": "navigation bar and keyboard"
            }],
            "title": "Apple 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 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4",
            "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": "Apple 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 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4",
            "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": "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": true,
            "modes": [{
                "insets": {
                    "top": 25,
                    "right": 0,
                    "bottom": 48,
                    "left": 0
                },
                "orientation": "vertical",
                "title": "default"
            }, {
                "insets": {
                    "top": 80,
                    "right": 0,
                    "bottom": 48,
                    "left": 0
                },
                "orientation": "vertical",
                "title": "navigation bar"
            }, {
                "insets": {
                    "top": 80,
                    "right": 0,
                    "bottom": 326,
                    "left": 0
                },
                "orientation": "vertical",
                "title": "keyboard"
            }, {
                "insets": {
                    "top": 25,
                    "right": 42,
                    "bottom": 0,
                    "left": 0
                },
                "orientation": "horizontal",
                "title": "default"
            }, {
                "insets": {
                    "top": 80,
                    "right": 42,
                    "bottom": 0,
                    "left": 0
                },
                "orientation": "horizontal",
                "title": "navigation bar"
            }, {
                "insets": {
                    "top": 80,
                    "right": 42,
                    "bottom": 214,
                    "left": 0
                },
                "orientation": "horizontal",
                "title": "keyboard"
            }],
            "title": "Google 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/35.0.1916.122 Mobile Safari/537.36",
            "type": "phone"
        },
        "type": "emulated-device"
    }, {
        "device": {
            "show-by-default": true,
            "modes": [{
                "insets": {
                    "top": 25,
                    "right": 0,
                    "bottom": 48,
                    "left": 0
                },
                "orientation": "vertical",
                "title": "default"
            }, {
                "insets": {
                    "top": 80,
                    "right": 0,
                    "bottom": 48,
                    "left": 0
                },
                "orientation": "vertical",
                "title": "navigation bar"
            }, {
                "insets": {
                    "top": 80,
                    "right": 0,
                    "bottom": 312,
                    "left": 0
                },
                "orientation": "vertical",
                "title": "keyboard"
            }, {
                "insets": {
                    "top": 25,
                    "right": 42,
                    "bottom": 0,
                    "left": 0
                },
                "orientation": "horizontal",
                "title": "default"
            }, {
                "insets": {
                    "top": 80,
                    "right": 42,
                    "bottom": 0,
                    "left": 0
                },
                "orientation": "horizontal",
                "title": "navigation bar"
            }, {
                "insets": {
                    "top": 80,
                    "right": 42,
                    "bottom": 202,
                    "left": 0
                },
                "orientation": "horizontal",
                "title": "keyboard"
            }],
            "title": "Google 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 4.4.4; Nexus 5 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.114 Mobile Safari/537.36",
            "type": "phone"
        },
        "type": "emulated-device"
    }, {
        "device": {
            "show-by-default": true,
            "modes": [{
                "insets": {
                    "top": 25,
                    "right": 0,
                    "bottom": 48,
                    "left": 0
                },
                "orientation": "vertical",
                "title": "default"
            }, {
                "insets": {
                    "top": 80,
                    "right": 0,
                    "bottom": 48,
                    "left": 0
                },
                "orientation": "vertical",
                "title": "navigation bar"
            }, {
                "insets": {
                    "top": 80,
                    "right": 0,
                    "bottom": 343,
                    "left": 0
                },
                "orientation": "vertical",
                "title": "keyboard"
            }, {
                "insets": {
                    "top": 25,
                    "right": 42,
                    "bottom": 0,
                    "left": 0
                },
                "orientation": "horizontal",
                "title": "default"
            }, {
                "insets": {
                    "top": 80,
                    "right": 42,
                    "bottom": 0,
                    "left": 0
                },
                "orientation": "horizontal",
                "title": "navigation bar"
            }, {
                "insets": {
                    "top": 80,
                    "right": 42,
                    "bottom": 222,
                    "left": 0
                },
                "orientation": "horizontal",
                "title": "keyboard"
            }],
            "title": "Google 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/44.0.2403.20 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": "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/30.0.1599.103 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": "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": 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": "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": 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": "Samsung 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": "Samsung Galaxy S4",
            "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 4.2.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 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": "Amazon 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": 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": "Apple 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 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53",
            "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": "Apple 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 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53",
            "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": "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": 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": "Google 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/42.0.2307.2 Safari/537.36",
            "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": "Google 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/42.0.2307.2 Safari/537.36",
            "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": "Samsung 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": 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": "Samsung 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": true,
            "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": true,
            "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": true,
            "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": []
}, {
    "dependencies": ["components", "extensions"],
    "extensions": [{
        "className": "WebInspector.AuditsPanelFactory",
        "order": 6,
        "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": 7,
        "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"
    }, {
        "className": "WebInspector.ConsolePanel.WrapperView",
        "order": "0",
        "type": "drawer-view",
        "name": "console",
        "title": "Console"
    }, {
        "className": "WebInspector.ConsolePanel.ConsoleRevealer",
        "contextTypes": ["WebInspector.Console"],
        "type": "@WebInspector.Revealer"
    }, {
        "className": "WebInspector.ConsoleView.ShowConsoleActionDelegate",
        "bindings": [{
            "shortcut": "Ctrl+`"
        }],
        "type": "@WebInspector.ActionDelegate",
        "actionId": "console.show"
    }, {
        "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_lazy", "ui_lazy"],
    "extensions": [{
        "className": "WebInspector.NetworkPanelFactory",
        "order": 1,
        "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"
    }],
    "name": "network",
    "scripts": []
}, {
    "dependencies": ["sdk", "ui", "ui_lazy"],
    "name": "components_lazy",
    "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"
    }],
    "scripts": []
}, {
    "dependencies": [],
    "name": "platform",
    "scripts": []
}, {
    "dependencies": ["elements"],
    "extensions": [{
        "className": "WebInspector.AnimationControlPane.ButtonProvider",
        "type": "@WebInspector.ToolbarItem.Provider",
        "order": 2,
        "location": "styles-sidebarpane-toolbar"
    }],
    "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/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"
    }, {
        "className": "WebInspector.Main.ReloadActionDelegate",
        "bindings": [{
            "shortcut": "Alt+R"
        }],
        "type": "@WebInspector.ActionDelegate",
        "actionId": "main.debug-reload"
    }, {
        "className": "WebInspector.InspectElementModeController.ToggleSearchActionDelegate",
        "contextTypes": ["WebInspector.InspectElementModeController"],
        "bindings": [{
            "platform": "windows,linux",
            "shortcut": "Ctrl+Shift+C"
        }, {
            "platform": "mac",
            "shortcut": "Meta+Shift+C"
        }],
        "type": "@WebInspector.ActionDelegate",
        "actionId": "main.toggle-element-search"
    }, {
        "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.RenderingOptions.View",
        "order": "11",
        "type": "drawer-view",
        "name": "rendering",
        "title": "Rendering"
    }, {
        "className": "WebInspector.InspectElementModeController.ToggleButtonProvider",
        "actionId": "main.toggle-element-search",
        "type": "@WebInspector.ToolbarItem.Provider",
        "location": "main-toolbar-left",
        "order": 0
    }, {
        "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"
    }, {
        "className": "WebInspector.InspectorView.ToggleDrawerButtonProvider",
        "type": "@WebInspector.ToolbarItem.Provider",
        "order": 2,
        "location": "main-toolbar-right"
    }, {
        "separator": true,
        "type": "@WebInspector.ToolbarItem.Provider",
        "order": 3,
        "location": "main-toolbar-right"
    }, {
        "className": "WebInspector.DockController.ButtonProvider",
        "type": "@WebInspector.ToolbarItem.Provider",
        "order": 5,
        "location": "main-toolbar-right"
    }, {
        "separator": true,
        "type": "@WebInspector.ToolbarItem.Provider",
        "order": 90,
        "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"
    }, {
        "defaultValue": {
            "latency": 0,
            "throughput": -1
        },
        "type": "setting",
        "settingName": "networkConditions",
        "settingType": "object"
    }, {
        "category": "",
        "title": "Disable JavaScript",
        "defaultValue": false,
        "settingName": "javaScriptDisabled",
        "settingType": "boolean",
        "type": "setting"
    }, {
        "category": "Appearance",
        "title": "Split panels vertically when docked to right",
        "defaultValue": true,
        "settingName": "splitVerticallyWhenDockedToRight",
        "settingType": "boolean",
        "type": "setting"
    }, {
        "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"
    }, {
        "defaultValue": false,
        "type": "setting",
        "settingName": "showPaintRects",
        "settingType": "boolean"
    }, {
        "defaultValue": false,
        "type": "setting",
        "settingName": "showDebugBorders",
        "settingType": "boolean"
    }, {
        "defaultValue": false,
        "type": "setting",
        "settingName": "showFPSCounter",
        "settingType": "boolean"
    }, {
        "defaultValue": false,
        "type": "setting",
        "settingName": "continuousPainting",
        "settingType": "boolean"
    }, {
        "defaultValue": false,
        "type": "setting",
        "settingName": "showScrollBottleneckRects",
        "settingType": "boolean"
    }],
    "name": "main",
    "scripts": [],
    "skip_compilation": ["Tests.js"]
}, {
    "dependencies": ["source_frame", "ui_lazy", "components_lazy"],
    "extensions": [{
        "className": "WebInspector.ResourcesPanelFactory",
        "order": 5,
        "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": 0,
        "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",
        "settingName": "colorFormat",
        "settingType": "enum",
        "type": "setting",
        "options": [["As authored", "original"], ["HEX: #DAC0DE", "hex", true], ["RGB: rgb(128, 255, 255)", "rgb", true], ["HSL: hsl(300, 80%, 90%)", "hsl", true]]
    }, {
        "category": "Elements",
        "title": "Show user agent shadow DOM",
        "defaultValue": false,
        "settingName": "showUAShadowDOM",
        "settingType": "boolean",
        "type": "setting"
    }, {
        "category": "Elements",
        "title": "Word wrap",
        "defaultValue": true,
        "settingName": "domWordWrap",
        "settingType": "boolean",
        "type": "setting"
    }, {
        "category": "Elements",
        "title": "Show rulers",
        "defaultValue": false,
        "settingName": "showMetricsRulers",
        "settingType": "boolean",
        "type": "setting"
    }, {
        "category": "Elements",
        "title": "Highlight DOM updates",
        "defaultValue": true,
        "settingName": "highlightDOMUpdates",
        "settingType": "boolean",
        "type": "setting"
    }, {
        "className": "WebInspector.StylesSidebarPane.AddNewRuleButtonProvider",
        "type": "@WebInspector.ToolbarItem.Provider",
        "order": 0,
        "location": "styles-sidebarpane-toolbar"
    }, {
        "className": "WebInspector.ElementStatePaneWidget.ButtonProvider",
        "type": "@WebInspector.ToolbarItem.Provider",
        "order": 1,
        "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": 3,
        "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"
    }],
    "name": "timeline",
    "scripts": []
}, {
    "dependencies": ["common", "platform"],
    "name": "host",
    "scripts": []
}, {
    "dependencies": ["bindings", "components", "platform", "ui"],
    "extensions": [{
        "className": "WebInspector.OverridesView",
        "order": "10",
        "type": "drawer-view",
        "name": "emulation",
        "title": "Emulation"
    }, {
        "className": "WebInspector.DeviceModeButtonProvider",
        "type": "@WebInspector.ToolbarItem.Provider",
        "order": 1,
        "condition": "can_dock",
        "location": "main-toolbar-left"
    }, {
        "className": "WebInspector.ToggleDeviceModeActionDelegate",
        "bindings": [{
            "platform": "windows,linux",
            "shortcut": "Shift+Ctrl+M"
        }, {
            "platform": "mac",
            "shortcut": "Shift+Meta+M"
        }],
        "type": "@WebInspector.ActionDelegate",
        "actionId": "emulation.toggle-device-mode",
        "condition": "can_dock"
    }, {
        "className": "WebInspector.OverridesView.Revealer",
        "contextTypes": ["WebInspector.OverridesSupport"],
        "type": "@WebInspector.Revealer"
    }, {
        "className": "WebInspector.DevicesSettingsTab",
        "order": "30",
        "type": "settings-view",
        "name": "devices",
        "title": "Devices"
    }],
    "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": "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": ["components"],
    "extensions": [{
        "className": "WebInspector.SettingsController.ActionDelegate",
        "bindings": [{
            "shortcut": "F1 Shift+?"
        }],
        "type": "@WebInspector.ActionDelegate",
        "actionId": "settings.show"
    }, {
        "title": "Settings",
        "elementClass": "settings-toolbar-item",
        "actionId": "settings.show",
        "type": "@WebInspector.ToolbarItem.Provider",
        "order": 4,
        "location": "main-toolbar-right"
    }, {
        "title": "Settings",
        "elementClass": "settings-toolbar-item",
        "actionId": "settings.show",
        "type": "@WebInspector.ToolbarItem.Provider",
        "order": 1,
        "location": "elements-toolbar"
    }, {
        "category": "Sources",
        "className": "WebInspector.SettingsScreen.SkipStackFramePatternSettingUI",
        "type": "@WebInspector.SettingUI"
    }],
    "name": "settings",
    "scripts": []
}, {
    "name": "heap_snapshot_worker",
    "scripts": []
}, {
    "dependencies": ["components", "ui_lazy"],
    "extensions": [{
        "className": "WebInspector.ProfilesPanelFactory",
        "order": 4,
        "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": false,
        "settingName": "highResolutionCpuProfiling",
        "settingType": "boolean",
        "type": "setting"
    }],
    "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,
        "experiment": "customObjectFormatters",
        "settingName": "customFormatters",
        "settingType": "boolean",
        "type": "setting"
    }],
    "name": "components",
    "scripts": []
}, {
    "experiment": "securityPanel",
    "extensions": [{
        "className": "WebInspector.SecurityPanelFactory",
        "order": 7,
        "type": "@WebInspector.PanelFactory",
        "name": "security",
        "title": "Security"
    }],
    "name": "security",
    "dependencies": ["platform", "ui", "sdk"],
    "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;
            }
            var sourceURL = window.location.href;
            if (window.location.search)
                sourceURL = sourceURL.replace(window.location.search, "");
            sourceURL = sourceURL.substring(0, sourceURL.lastIndexOf("/") + 1) + path;
            Runtime.cachedResources[path] = content + "\n/*# sourceURL=" + sourceURL + " */";
        }
    },
    _loadScripts: function() 
    {
        if (!this._descriptor.scripts)
            return Promise.resolve();
        if (Runtime.isReleaseMode()) {
            var base = this._descriptor.remote && Runtime._remoteBase || undefined;
            return loadScriptsPromise([this._name + "_module.js"], base);
        }
        return loadScriptsPromise(this._descriptor.scripts.map(this._modularizeURL, this));
    },
    _modularizeURL: function(resourceName) 
    {
        return normalizePath(this._name + "/" + resourceName);
    },
    _instance: function(className) 
    {
        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();
        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 && !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);
            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");
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, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
}
String.prototype.unescapeHTML = function() 
{
    return this.replace(/</g, "<").replace(/>/g, ">").replace(/:/g, ":").replace(/"/g, "\"").replace(/</g, "<").replace(/>/g, ">").replace(/&/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.prototype.startsWith = function(substring) 
{
    return !this.lastIndexOf(substring, 0);
}
String.prototype.endsWith = function(substring) 
{
    return this.indexOf(substring, this.length - substring.length) !== -1;
}
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);
    }
}
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;
        if (firstOnly) {
            this.splice(index, 1);
            return;
        }
        for (var i = index + 1, n = this.length; i < n; ++i) {
            if (this[i] !== value)
                this[index++] = this[i];
        }
        this.length = index;
    }
});
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) 
    {
        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;
    },
    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();
    },
    _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("http://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.appendChildren = function(var_args) 
{
    for (var i = 0, n = arguments.length; i < n; ++i)
        this.appendChild(arguments[i]);
}
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;
}
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
        });
    },
    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.prototype = {
    addEventListener: function(eventType, listener, thisObject) {},
    removeEventListener: function(eventType, listener, thisObject) {},
    removeAllListeners: function() {},
    hasEventListeners: function(eventType) {},
    dispatchEventToListeners: function(eventType, eventData) {},
};
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);
            return new WebInspector.Color(rgba,WebInspector.Color.Format.HSL,text);
        }
        return null ;
    }
    var advanced = /^(?:rgba\(((?:-?\d+%?,){3}-?\d+(?:\.\d+)?)\)|hsla\((-?\d+\.?\d*(?:,-?\d+\.?\d*%){2},-?\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);
            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 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);
    var hsla = [h, s, t / 2, hsva[3]];
    return new WebInspector.Color(WebInspector.Color._hsl2rgb(hsla),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 = 1;
        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;
    },
    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._hsl2rgb = function(hsl) 
{
    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);
    var r = hue2rgb(p, q, tr);
    var g = hue2rgb(p, q, tg);
    var b = hue2rgb(p, q, tb);
    return [r, g, b, hsl[3]];
}
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.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;
    }
}
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._decodeIfPossible = function(url) 
{
    var decodedURL = url;
    try {
        decodedURL = decodeURI(url);
    } catch (e) {}
    return decodedURL;
}
WebInspector.ParsedURL.splitURLIntoPathComponents = function(url) 
{
    var decodedURL = WebInspector.ParsedURL._decodeIfPossible(url);
    var parsedURL = new WebInspector.ParsedURL(decodedURL);
    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.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 : "");
    }
}
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, categoryTitle, shortCategoryTitle, color, isTextType) 
{
    this._name = name;
    this._title = title;
    this._categoryTitle = categoryTitle;
    this._shortCategoryTitle = shortCategoryTitle;
    this._color = color;
    this._isTextType = isTextType;
}
WebInspector.ResourceType.prototype = {
    name: function() 
    {
        return this._name;
    },
    title: function() 
    {
        return this._title;
    },
    categoryTitle: function() 
    {
        return this._categoryTitle;
    },
    shortCategoryTitle: function() 
    {
        return this._shortCategoryTitle;
    },
    color: function() 
    {
        return this._color;
    },
    isTextType: function() 
    {
        return this._isTextType;
    },
    toString: function() 
    {
        return this._name;
    },
    canonicalMimeType: function() 
    {
        if (this === WebInspector.resourceTypes.Document)
            return "text/html";
        if (this === WebInspector.resourceTypes.Script)
            return "text/javascript";
        if (this === WebInspector.resourceTypes.Stylesheet)
            return "text/css";
        return "";
    }
}
WebInspector.resourceTypes = {
    XHR: new WebInspector.ResourceType("xhr","XHR","XHR","XHR","rgb(231,231,10)",true),
    Script: new WebInspector.ResourceType("script","Script","Scripts","JS","rgb(255,121,0)",true),
    Stylesheet: new WebInspector.ResourceType("stylesheet","Stylesheet","Stylesheets","CSS","rgb(157,231,119)",true),
    Image: new WebInspector.ResourceType("image","Image","Images","Img","rgb(164,60,255)",false),
    Media: new WebInspector.ResourceType("media","Media","Media","Media","rgb(164,60,255)",false),
    Font: new WebInspector.ResourceType("font","Font","Fonts","Font","rgb(255,82,62)",false),
    Document: new WebInspector.ResourceType("document","Document","Documents","Doc","rgb(47,102,236)",true),
    TextTrack: new WebInspector.ResourceType("texttrack","TextTrack","TextTracks","TextTracks","rgb(164,60,255)",true),
    WebSocket: new WebInspector.ResourceType("websocket","WebSocket","WebSockets","WS","rgb(186,186,186)",false),
    Other: new WebInspector.ResourceType("other","Other","Other","Other","rgb(186,186,186)",false)
}
WebInspector.ResourceType.mimeTypesForExtensions = {
    "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"
};
WebInspector.Settings = function(prefs) 
{
    this._settingsStorage = prefs;
    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 ? (window.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 ? (window.localStorage || {}) : this._settingsStorage,regexFlags));
        return ( this._registry.get(key)) ;
    },
    clearAll: function() 
    {
        if (window.localStorage)
            window.localStorage.clear();
        for (var key in this._settingsStorage)
            delete this._settingsStorage[key];
        var versionSetting = WebInspector.settings.createSetting(WebInspector.VersionController._currentVersionName, 0);
        versionSetting.set(WebInspector.VersionController.currentVersion);
    }
}
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._name in this._storage) {
            try {
                this._value = JSON.parse(this._storage[this._name]);
            } catch (e) {
                this.remove();
            }
        }
        return this._value;
    },
    set: function(value) 
    {
        this._value = value;
        try {
            var settingString = JSON.stringify(value);
            try {
                this._storage[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);
        delete this._storage[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);
        WebInspector.console.log("Ten largest settings: ");
        var sizes = {
            __proto__: null 
        };
        for (var key in this._storage)
            sizes[key] = this._storage[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.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 = 14;
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);
    },
    _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.runTest = function(testName) 
{
    try {
        this[testName]();
        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);
    }
}
WebInspector.SourceRange = function(offset, length) 
{
    this.offset = offset;
    this.length = length;
}
;
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();
    }
}
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(error) 
    {
        if (error)
            console.error(error);
        this._isRunningProcess = false;
        if (this._process)
            this._innerSchedule(false);
        this._processCompletedForTests();
    },
    _processCompletedForTests: function() 
    {},
    _onTimeout: function() 
    {
        delete this._processTimeout;
        this._asSoonAsPossible = false;
        this._isRunningProcess = true;
        var process = this._process;
        this._process = null ;
        try {
            process(this._processCompleted.bind(this));
        } catch (e) {
            if (this._isRunningProcess)
                this._processCompleted(e);
        }
    },
    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) {}
}
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",
    DevicesUpdated: "devicesUpdated",
    DispatchMessage: "dispatchMessage",
    DispatchMessageChunk: "dispatchMessageChunk",
    EnterInspectElementMode: "enterInspectElementMode",
    FileSystemsLoaded: "fileSystemsLoaded",
    FileSystemRemoved: "fileSystemRemoved",
    FileSystemAdded: "fileSystemAdded",
    IndexingTotalWorkCalculated: "indexingTotalWorkCalculated",
    IndexingWorked: "indexingWorked",
    IndexingDone: "indexingDone",
    KeyEventUnhandled: "keyEventUnhandled",
    RevealSourceLine: "revealSourceLine",
    SavedURL: "savedURL",
    SearchCompleted: "searchCompleted",
    SetInspectedTabId: "setInspectedTabId",
    SetUseSoftMenu: "setUseSoftMenu",
    ShowConsole: "showConsole"
}
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.DevicesUpdated, ["devices"]], [InspectorFrontendHostAPI.Events.DispatchMessage, ["messageObject"]], [InspectorFrontendHostAPI.Events.DispatchMessageChunk, ["messageChunk", "messageSize"]], [InspectorFrontendHostAPI.Events.EnterInspectElementMode, []], [InspectorFrontendHostAPI.Events.FileSystemsLoaded, ["fileSystems"]], [InspectorFrontendHostAPI.Events.FileSystemRemoved, ["fileSystemPath"]], [InspectorFrontendHostAPI.Events.FileSystemAdded, ["errorMessage", "fileSystem"]], [InspectorFrontendHostAPI.Events.IndexingTotalWorkCalculated, ["requestId", "fileSystemPath", "totalWork"]], [InspectorFrontendHostAPI.Events.IndexingWorked, ["requestId", "fileSystemPath", "worked"]], [InspectorFrontendHostAPI.Events.IndexingDone, ["requestId", "fileSystemPath"]], [InspectorFrontendHostAPI.Events.KeyEventUnhandled, ["event"]], [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.ShowConsole, []]];
InspectorFrontendHostAPI.prototype = {
    addFileSystem: function() {},
    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) {},
    setDevicesUpdatesEnabled: function(enabled) {},
    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() {}
};
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() 
    {},
    addFileSystem: function() 
    {},
    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;
    },
    setDevicesUpdatesEnabled: function(enabled) 
    {},
    showContextMenuAtPoint: function(x, y, items, document) 
    {
        throw "Soft context menu should be used";
    },
    isHostedMode: function() 
    {
        return true;
    }
};
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.targetUserAgent = "";
WebInspector.ResourceLoader.loadUsingTargetUA = function(url, headers, callback) 
{
    if (!WebInspector.ResourceLoader.targetUserAgent) {
        WebInspector.ResourceLoader.load(url, headers, callback);
        return;
    }
    var headersWithUA = {};
    if (headers) {
        for (var header in headers)
            headersWithUA[header] = headers[header];
    }
    headersWithUA["User-Agent"] = WebInspector.ResourceLoader.targetUserAgent;
    WebInspector.ResourceLoader.load(url, headersWithUA, callback);
}
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() 
{
    for (var actionName in WebInspector.UserMetrics._ActionCodes) {
        var actionCode = WebInspector.UserMetrics._ActionCodes[actionName];
        this[actionName] = new WebInspector.UserMetrics._Recorder(actionCode);
    }
}
WebInspector.UserMetrics._ActionCodes = {
    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
}
WebInspector.UserMetrics._PanelCodes = {
    elements: 1,
    resources: 2,
    network: 3,
    sources: 4,
    timeline: 5,
    profiles: 6,
    audits: 7,
    console: 8,
    layers: 9
}
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);
    }
}
WebInspector.UserMetrics._Recorder = function(actionCode) 
{
    this._actionCode = actionCode;
}
WebInspector.UserMetrics._Recorder.prototype = {
    record: function() 
    {
        var size = Object.keys(WebInspector.UserMetrics._ActionCodes).length + 1;
        InspectorFrontendHost.recordEnumeratedHistogram("DevTools.ActionTaken", this._actionCode, 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.createStyleElement = function(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;
    return styleElement;
}
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) 
    {
        (this._isWebComponent ? this._shadowRoot : this.element).appendChild(WebInspector.Widget.createStyleElement(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();
    },
    __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
}
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"
}
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 ;
    },
    _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) {
            nextSelectedElement = this.selectedTreeElement.traversePreviousTreeElement(true);
            while (nextSelectedElement && !nextSelectedElement.selectable)
                nextSelectedElement = nextSelectedElement.traversePreviousTreeElement(!this.expandTreeElementsWhenArrowing);
            handled = nextSelectedElement ? true : false;
        } else if (event.keyIdentifier === "Down" && !event.altKey) {
            nextSelectedElement = this.selectedTreeElement.traverseNextTreeElement(true);
            while (nextSelectedElement && !nextSelectedElement.selectable)
                nextSelectedElement = nextSelectedElement.traverseNextTreeElement(!this.expandTreeElementsWhenArrowing);
            handled = nextSelectedElement ? true : false;
        } 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);
    },
    __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);
    this._shadowRoot.appendChild(WebInspector.Widget.createStyleElement("ui/treeoutline.css"));
    this._shadowRoot.appendChild(innerElement);
    this._renderSelection = true;
}
TreeOutlineInShadow.prototype = {
    registerRequiredCSS: function(cssFile) 
    {
        this._shadowRoot.appendChild(WebInspector.Widget.createStyleElement(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;
    if (typeof title === "string")
        this.tooltip = 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);
}
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) 
    {
        this._title = x;
        if (typeof this._title === "string")
            this._listItemNode.textContent = this._title;
        else {
            this._listItemNode.removeChildren();
            if (this._title)
                this._listItemNode.appendChild(this._title);
            this._ensureSelection();
        }
    },
    set tooltip(x) 
    {
        if (x)
            this._listItemNode.setAttribute("title", x);
        else
            this._listItemNode.removeAttribute("title");
    },
    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();
    },
    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");
        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)
            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");
        this.onexpand();
        if (this.treeOutline)
            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() 
    {
        var currentAncestor = this.parent;
        while (currentAncestor && !currentAncestor.root) {
            if (!currentAncestor.expanded)
                currentAncestor.expand();
            currentAncestor = currentAncestor.parent;
        }
        this.listItemElement.scrollIntoViewIfNeeded();
        this.onreveal();
    },
    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");
        if (this._selectionElement)
            this._selectionElement.style.height = this._listItemNode.offsetHeight + "px";
        return this.onselect(selectedByUser);
    },
    revealAndSelect: function(omitFocus) 
    {
        this.reveal();
        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._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;
    },
    onreveal: function() 
    {},
    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, extension);
        }
    },
    applicableActions: function(actionIds, context) 
    {
        var extensions = [];
        actionIds.forEach(function(actionId) {
            var extension = this._actionsById.get(actionId);
            if (extension)
                extensions.push(extension);
        }
        , this);
        return context.applicableExtensions(extensions).valuesArray().map(function(extension) {
            return extension.descriptor()["actionId"];
        }
        );
    },
    execute: function(actionId) 
    {
        var extension = this._actionsById.get(actionId);
        console.assert(extension, "No action found for actionId '" + actionId + "'");
        return extension.instancePromise().then(handleAction);
        function handleAction(actionDelegate) 
        {
            (actionDelegate).handleAction(WebInspector.context, actionId);
        }
    }
}
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;
    },
    handleShortcut: function(event) 
    {
        this.handleKey(WebInspector.KeyboardShortcut.makeKeyFromEvent(event), event.keyIdentifier, event);
    },
    handleKey: function(key, keyIdentifier, event) 
    {
        var keyModifiers = key >> 8;
        var actionIds = this.applicableActions(key);
        if (!actionIds.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);
        } else {
            this._pendingActionTimer = setTimeout(processNextAction.bind(this), 0);
        }
        function processNextAction() 
        {
            delete this._pendingActionTimer;
            var actionId = actionIds.shift();
            if (!actionId)
                return;
            this._actionRegistry.execute(actionId).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);
        root.appendChild(WebInspector.Widget.createStyleElement("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":
            return {
                type: "item",
                id: this._id,
                label: this._label,
                enabled: !this._disabled
            };
        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);
    }
}
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;
    },
    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;
    },
    __proto__: WebInspector.ContextMenuItem.prototype
}
WebInspector.ContextMenu = function(event) 
{
    WebInspector.ContextSubMenuItem.call(this, this, "");
    this._pendingPromises = [];
    this._pendingTargets = [];
    this._event = event;
    this._x = event.x;
    this._y = event.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);
    },
    _innerShow: function() 
    {
        var menuObject = this._buildDescriptors();
        WebInspector._contextMenu = this;
        if (WebInspector.ContextMenu._useSoftMenu || InspectorFrontendHost.isHostedMode()) {
            var softMenu = new WebInspector.SoftContextMenu(menuObject,this._itemSelected.bind(this));
            softMenu.show(this._event.target.ownerDocument, this._x, this._y);
        } else {
            InspectorFrontendHost.showContextMenuAtPoint(this._x, this._y, menuObject, this._event.target.ownerDocument);
            InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.ContextMenuCleared, this._menuCleared, this);
            InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.ContextMenuItemSelected, this._onItemSelected, 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(relativeToElement, delegate) 
{
    this._delegate = delegate;
    this._relativeToElement = relativeToElement;
    this._glassPane = new WebInspector.GlassPane((relativeToElement.ownerDocument));
    WebInspector.GlassPane.DefaultFocusedViewStack.push(this);
    this._glassPane.element.tabIndex = 0;
    this._glassPane.element.addEventListener("focus", this._onGlassPaneFocus.bind(this), false);
    this._element = this._glassPane.element.createChild("div");
    this._element.tabIndex = 0;
    this._element.addEventListener("focus", this._onFocus.bind(this), false);
    this._element.addEventListener("keydown", this._onKeyDown.bind(this), false);
    this._closeKeys = [WebInspector.KeyboardShortcut.Keys.Enter.code, WebInspector.KeyboardShortcut.Keys.Esc.code, ];
    delegate.show(this._element);
    this._position();
    this._delegate.focus();
}
WebInspector.Dialog.currentInstance = function() 
{
    return WebInspector.Dialog._instance;
}
WebInspector.Dialog.show = function(relativeToElement, delegate) 
{
    if (WebInspector.Dialog._instance)
        return;
    WebInspector.Dialog._instance = new WebInspector.Dialog(relativeToElement || WebInspector.Dialog.modalHostView().element,delegate);
}
WebInspector.Dialog.hide = function() 
{
    if (!WebInspector.Dialog._instance)
        return;
    WebInspector.Dialog._instance._hide();
}
WebInspector.Dialog.prototype = {
    focus: function() 
    {
        this._element.focus();
    },
    _hide: function() 
    {
        if (this._isHiding)
            return;
        this._isHiding = true;
        this._delegate.willHide();
        delete WebInspector.Dialog._instance;
        WebInspector.GlassPane.DefaultFocusedViewStack.pop();
        this._glassPane.dispose();
    },
    _onGlassPaneFocus: function(event) 
    {
        this._hide();
    },
    _onFocus: function(event) 
    {
        this._delegate.focus();
    },
    _position: function() 
    {
        this._delegate.position(this._element, this._relativeToElement);
    },
    _onKeyDown: function(event) 
    {
        if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Tab.code) {
            event.preventDefault();
            return;
        }
        if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Enter.code)
            this._delegate.onEnter(event);
        if (!event.handled && this._closeKeys.indexOf(event.keyCode) >= 0) {
            this._hide();
            event.consume(true);
        }
    }
};
WebInspector.DialogDelegate = function() 
{
    this.element = createElement("div");
}
WebInspector.DialogDelegate.prototype = {
    show: function(element) 
    {
        element.appendChild(this.element);
        this.element.classList.add("dialog-contents");
        element.classList.add("dialog");
    },
    position: function(element, relativeToElement) 
    {
        var container = WebInspector.Dialog._modalHostView.element;
        var box = relativeToElement.boxInWindow(window).relativeToElement(container);
        var positionX = box.x + (relativeToElement.offsetWidth - element.offsetWidth) / 2;
        positionX = Number.constrain(positionX, 0, container.offsetWidth - element.offsetWidth);
        var positionY = box.y + (relativeToElement.offsetHeight - element.offsetHeight) / 2;
        positionY = Number.constrain(positionY, 0, container.offsetHeight - element.offsetHeight);
        element.style.position = "absolute";
        element.positionAt(positionX, positionY, container);
    },
    focus: function() {},
    onEnter: function(event) {},
    willHide: function() {},
    __proto__: WebInspector.Object.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);
        shadowRoot.appendChild(WebInspector.Widget.createStyleElement("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) 
{
    this._filtersShown = false;
    this._element = createElementWithClass("div", "filter-bar hidden");
    this._filterButton = new WebInspector.ToolbarButton(WebInspector.UIString("Filter"),"filter-toolbar-item",3);
    this._filterButton.element.addEventListener("click", this._handleFilterButtonClick.bind(this), false);
    this._filters = [];
    this._stateSetting = WebInspector.settings.createSetting("filterBar-" + name + "-toggled", !!visibleByDefault);
    this._setState(this._stateSetting.get());
}
WebInspector.FilterBar.FilterBarState = {
    Inactive: "inactive",
    Active: "active",
    Shown: "shown"
};
WebInspector.FilterBar.prototype = {
    filterButton: function() 
    {
        return this._filterButton;
    },
    filtersElement: function() 
    {
        return this._element;
    },
    filtersToggled: function() 
    {
        return this._filtersShown;
    },
    addFilter: function(filter) 
    {
        this._filters.push(filter);
        this._element.appendChild(filter.element());
        filter.addEventListener(WebInspector.FilterUI.Events.FilterChanged, this._filterChanged, this);
        this._updateFilterButton();
    },
    _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;
    },
    _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._element.classList.toggle("hidden", !this._filtersShown);
        if (this._filtersShown) {
            for (var i = 0; i < this._filters.length; ++i) {
                if (this._filters[i] instanceof WebInspector.TextFilterUI) {
                    var textFilterUI = (this._filters[i]);
                    textFilterUI.focus();
                }
            }
        }
    },
    clear: function() 
    {
        this._element.removeChildren();
        this._filters = [];
        this._updateFilterButton();
    },
    __proto__: WebInspector.Object.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("Use %s Click 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(typeName) 
    {
        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;
    },
    _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.HelpScreen = function(title) 
{
    WebInspector.VBox.call(this);
    this.markAsRoot();
    this.registerRequiredCSS("ui/helpScreen.css");
    this.element.classList.add("help-window-outer");
    this.element.addEventListener("keydown", this._onKeyDown.bind(this), false);
    this.element.tabIndex = 0;
    if (title) {
        var mainWindow = this.element.createChild("div", "help-window-main");
        var captionWindow = mainWindow.createChild("div", "help-window-caption");
        captionWindow.appendChild(this.createCloseButton());
        this.helpContentElement = mainWindow.createChild("div", "help-content");
        captionWindow.createChild("h1", "help-window-title").textContent = title;
    }
}
WebInspector.HelpScreen._visibleScreen = null ;
WebInspector.HelpScreen.prototype = {
    createCloseButton: function() 
    {
        var closeButton = createElementWithClass("div", "help-close-button", "dt-close-button");
        closeButton.gray = true;
        closeButton.addEventListener("click", this.hide.bind(this), false);
        return closeButton;
    },
    showModal: function() 
    {
        var visibleHelpScreen = WebInspector.HelpScreen._visibleScreen;
        if (visibleHelpScreen === this)
            return;
        if (visibleHelpScreen)
            visibleHelpScreen.hide();
        WebInspector.HelpScreen._visibleScreen = this;
        WebInspector.GlassPane.DefaultFocusedViewStack.push(this);
        this.show(WebInspector.Dialog.modalHostView().element);
        this.focus();
    },
    hide: function() 
    {
        if (!this.isShowing())
            return;
        WebInspector.HelpScreen._visibleScreen = null ;
        WebInspector.GlassPane.DefaultFocusedViewStack.pop();
        WebInspector.restoreFocusFromElement(this.element);
        this.detach();
    },
    isClosingKey: function(keyCode) 
    {
        return [WebInspector.KeyboardShortcut.Keys.Enter.code, WebInspector.KeyboardShortcut.Keys.Esc.code, WebInspector.KeyboardShortcut.Keys.Space.code, ].indexOf(keyCode) >= 0;
    },
    _onKeyDown: function(event) 
    {
        if (this.isShowing() && this.isClosingKey(event.keyCode)) {
            this.hide();
            event.consume();
        }
    },
    __proto__: WebInspector.VBox.prototype
};
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, disableSetting) 
{
    this.element = createElementWithClass("div");
    this._shadowRoot = WebInspector.createShadowRootWithCoreStyles(this.element);
    this._shadowRoot.appendChild(WebInspector.Widget.createStyleElement("ui/infobar.css"));
    this._contentElement = this._shadowRoot.createChild("div", "infobar infobar-" + type);
    this._contentElement.createChild("label", "icon", "dt-icon-label").type = type + "-icon";
    this._contentElement.createChild("div", "content").createChild("content");
    this._disableSetting = null ;
    if (disableSetting) {
        this._disableSetting = disableSetting;
        disableSetting.addChangeListener(this._updateVisibility, this);
        var disableButton = this._contentElement.createChild("div", "disable-button");
        disableButton.textContent = WebInspector.UIString("Never show");
        disableButton.addEventListener("click", disableSetting.set.bind(disableSetting, true), false);
    }
    this._closeButton = this._contentElement.createChild("div", "close-button", "dt-close-button");
    this._closeButton.addEventListener("click", this.close.bind(this), false);
    this._closeCallback = null ;
    this.setVisible(false);
}
WebInspector.Infobar.Type = {
    Warning: "warning",
    Info: "info"
}
WebInspector.Infobar.prototype = {
    setVisible: function(visible) 
    {
        this._visible = visible;
        if (this._disableSetting)
            visible = visible && !this._disableSetting.get();
        this.element.classList.toggle("hidden", !visible);
    },
    _updateVisibility: function() 
    {
        this.setVisible(this._visible);
    },
    close: function() 
    {
        this.setVisible(false);
        if (this._closeCallback)
            this._closeCallback.call(null );
    },
    setCloseCallback: function(callback) 
    {
        this._closeCallback = callback;
    }
};
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: {
            mac: "\u238b",
            other: "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) 
{
    const cmdKey = "\u2318";
    const optKey = "\u2325";
    const shiftKey = "\u21e7";
    const ctrlKey = "\u2303";
    var isMac = WebInspector.isMac();
    var res = "";
    if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Ctrl)
        res += isMac ? ctrlKey : "Ctrl + ";
    if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Alt)
        res += isMac ? optKey : "Alt + ";
    if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Shift)
        res += isMac ? shiftKey : "Shift + ";
    if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Meta)
        res += isMac ? cmdKey : "Win + ";
    return res;
}
;
WebInspector.KeyboardShortcut.SelectAll = WebInspector.KeyboardShortcut.makeKey("a", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta);
;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;
            return;
        }
        var searchableView = this.searchableView();
        if (!searchableView)
            return;
        function handleSearchShortcuts(shortcuts, handler) 
        {
            for (var i = 0; i < shortcuts.length; ++i) {
                if (shortcuts[i].key !== shortcutKey)
                    continue;return handler.call(searchableView);
            }
            return false;
        }
        if (handleSearchShortcuts(WebInspector.SearchableView.findShortcuts(), searchableView.handleFindShortcut))
            event.handled = true;
        else if (handleSearchShortcuts(WebInspector.SearchableView.cancelSearchShortcuts(), searchableView.handleCancelSearchShortcut))
            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.setVisible(true);
        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 custom-popup-vertical-scroll custom-popup-horizontal-scroll";
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 : 11;
        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._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);
    this._shadowRoot.appendChild(WebInspector.Widget.createStyleElement("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(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._searchProvider = searchable;
    this._setting = settingName ? WebInspector.settings.createSetting(settingName, {}) : null ;
    this.element.addEventListener("keydown", this._onKeyDown.bind(this), false);
    this.contentElement.createChild("content");
    this._footerElementContainer = this.contentElement.createChild("div", "search-bar hidden");
    this._footerElementContainer.style.order = 100;
    var toolbar = new WebInspector.Toolbar(this._footerElementContainer);
    if (this._searchProvider.supportsCaseSensitiveSearch()) {
        this._caseSensitiveButton = new WebInspector.ToolbarTextButton(WebInspector.UIString("Case sensitive"),"case-sensitive-search-toolbar-item","Aa",2);
        this._caseSensitiveButton.addEventListener("click", this._toggleCaseSensitiveSearch, this);
        toolbar.appendToolbarItem(this._caseSensitiveButton);
    }
    if (this._searchProvider.supportsRegexSearch()) {
        this._regexButton = new WebInspector.ToolbarTextButton(WebInspector.UIString("Regex"),"regex-search-toolbar-item",".*",2);
        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._registerShortcuts();
    this._loadSetting();
}
WebInspector.SearchableView._lastUniqueId = 0;
WebInspector.SearchableView.findShortcuts = function() 
{
    if (WebInspector.SearchableView._findShortcuts)
        return WebInspector.SearchableView._findShortcuts;
    WebInspector.SearchableView._findShortcuts = [WebInspector.KeyboardShortcut.makeDescriptor("f", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)];
    if (!WebInspector.isMac())
        WebInspector.SearchableView._findShortcuts.push(WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F3));
    return WebInspector.SearchableView._findShortcuts;
}
WebInspector.SearchableView.cancelSearchShortcuts = function() 
{
    if (WebInspector.SearchableView._cancelSearchShortcuts)
        return WebInspector.SearchableView._cancelSearchShortcuts;
    WebInspector.SearchableView._cancelSearchShortcuts = [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Esc)];
    return WebInspector.SearchableView._cancelSearchShortcuts;
}
WebInspector.SearchableView.findNextShortcut = function() 
{
    if (WebInspector.SearchableView._findNextShortcut)
        return WebInspector.SearchableView._findNextShortcut;
    WebInspector.SearchableView._findNextShortcut = [];
    if (WebInspector.isMac())
        WebInspector.SearchableView._findNextShortcut.push(WebInspector.KeyboardShortcut.makeDescriptor("g", WebInspector.KeyboardShortcut.Modifiers.Meta));
    return WebInspector.SearchableView._findNextShortcut;
}
WebInspector.SearchableView.findPreviousShortcuts = function() 
{
    if (WebInspector.SearchableView._findPreviousShortcuts)
        return WebInspector.SearchableView._findPreviousShortcuts;
    WebInspector.SearchableView._findPreviousShortcuts = [];
    if (WebInspector.isMac())
        WebInspector.SearchableView._findPreviousShortcuts.push(WebInspector.KeyboardShortcut.makeDescriptor("g", WebInspector.KeyboardShortcut.Modifiers.Meta | WebInspector.KeyboardShortcut.Modifiers.Shift));
    return WebInspector.SearchableView._findPreviousShortcuts;
}
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);
    },
    _onKeyDown: function(event) 
    {
        var shortcutKey = WebInspector.KeyboardShortcut.makeKeyFromEvent((event));
        var handler = this._shortcuts[shortcutKey];
        if (handler && handler(event))
            event.consume(true);
    },
    _registerShortcuts: function() 
    {
        this._shortcuts = {};
        function register(shortcuts, handler) 
        {
            for (var i = 0; i < shortcuts.length; ++i)
                this._shortcuts[shortcuts[i].key] = handler;
        }
        register.call(this, WebInspector.SearchableView.findShortcuts(), this.handleFindShortcut.bind(this));
        register.call(this, WebInspector.SearchableView.cancelSearchShortcuts(), this.handleCancelSearchShortcut.bind(this));
        register.call(this, WebInspector.SearchableView.findNextShortcut(), this.handleFindNextShortcut.bind(this));
        register.call(this, WebInspector.SearchableView.findPreviousShortcuts(), this.handleFindPreviousShortcut.bind(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) 
    {
        this.element.insertBefore(WebInspector.Widget.createStyleElement(cssFile), this.headerElement);
    },
    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 || "";
    if (validatorCallback || instant) {
        inputElement.addEventListener("change", onInput, false);
        inputElement.addEventListener("input", onInput, false);
    }
    inputElement.addEventListener("keydown", onKeyDown, false);
    var errorMessageLabel;
    if (validatorCallback)
        errorMessageLabel = p.createChild("div", "field-error-message");
    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);
        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;
    }
    onSettingChange();
    if (validatorCallback)
        validate();
    return p;
}
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");
    },
    onreveal: function() 
    {
        if (this.listItemElement)
            this.listItemElement.scrollIntoViewIfNeeded(false);
    },
    __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);
    },
    onreveal: function() 
    {
        if (this.listItemElement)
            this.listItemElement.scrollIntoViewIfNeeded(false);
    },
    __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._contextMenuElement)
            this._discardMenu(true);
        if (!this._items.length)
            return;
        this._document = document;
        this._x = x;
        this._y = y;
        this._time = new Date().getTime();
        this._contextMenuElement = createElementWithClass("div", "soft-context-menu");
        var root = WebInspector.createShadowRootWithCoreStyles(this._contextMenuElement);
        root.appendChild(WebInspector.Widget.createStyleElement("ui/softContextMenu.css"));
        var menuElement = root.createChild("div");
        this._contextMenuElement.tabIndex = 0;
        this._contextMenuElement.style.top = y + "px";
        this._contextMenuElement.style.left = x + "px";
        menuElement.addEventListener("mouseup", consumeEvent, false);
        menuElement.addEventListener("keydown", this._menuKeyDown.bind(this), false);
        for (var i = 0; i < this._items.length; ++i)
            menuElement.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._contextMenuElement);
            document.body.appendChild(this._glassPaneElement);
            this._focus();
        } else {
            this._parentMenu._parentGlassPaneElement().appendChild(this._contextMenuElement);
        }
        if (document.body.offsetWidth < this._contextMenuElement.offsetLeft + this._contextMenuElement.offsetWidth)
            this._contextMenuElement.style.left = Math.max(0, x - this._contextMenuElement.offsetWidth) + "px";
        if (document.body.offsetHeight < this._contextMenuElement.offsetTop + this._contextMenuElement.offsetHeight)
            this._contextMenuElement.style.top = Math.max(0, document.body.offsetHeight - this._contextMenuElement.offsetHeight) + "px";
    },
    _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("span", "soft-context-menu-item-checkmark");
        checkMarkElement.textContent = "\u2713 ";
        if (!item.checked)
            checkMarkElement.style.opacity = "0";
        menuItemElement.createTextChild(item.label);
        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");
        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.addEventListener("mouseover", this._hideSubMenu.bind(this), false);
        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);
        this._subMenu.show(this._document, this._x + menuItemElement.offsetWidth - 3, this._y + menuItemElement.offsetTop - 1);
    },
    _hideSubMenu: function() 
    {
        if (!this._subMenu)
            return;
        this._subMenu._discardSubMenus();
        this._focus();
    },
    _menuItemMouseOver: function(event) 
    {
        this._highlightMenuItem(event.target);
    },
    _menuItemMouseLeave: function(event) 
    {
        if (!this._subMenu || !event.relatedTarget) {
            this._highlightMenuItem(null );
            return;
        }
        var relatedTarget = event.relatedTarget;
        if (relatedTarget.classList.contains("soft-context-menu-glass-pane"))
            this._highlightMenuItem(null );
    },
    _highlightMenuItem: function(menuItemElement) 
    {
        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 (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 = menuItemElement.previousSibling;
        if (menuItemElement)
            this._highlightMenuItem(menuItemElement);
    },
    _highlightNext: function() 
    {
        var menuItemElement = this._highlightedMenuItemElement ? this._highlightedMenuItemElement.nextSibling : this._contextMenuElement.firstChild;
        while (menuItemElement && menuItemElement._isSeparator)
            menuItemElement = menuItemElement.nextSibling;
        if (menuItemElement)
            this._highlightMenuItem(menuItemElement);
    },
    _menuKeyDown: function(event) 
    {
        switch (event.keyIdentifier) {
        case "Up":
            this._highlightPrevious();
            break;
        case "Down":
            this._highlightNext();
            break;
        case "Left":
            if (this._parentMenu) {
                this._highlightMenuItem(null );
                this._parentMenu._focus();
            }
            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(true, event);
            break;
        case "Enter":
            if (!isEnterKey(event))
                break;
        case "U+0020":
            if (this._highlightedMenuItemElement)
                this._triggerAction(this._highlightedMenuItemElement, event);
            break;
        }
        event.consume(true);
    },
    _glassPaneMouseUp: function(event) 
    {
        if (event.x === this._x && event.y === this._y && new Date().getTime() - this._time < 300)
            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);
            }
            if (event)
                event.consume(true);
        } else if (this._parentMenu && this._contextMenuElement.parentElement) {
            this._discardSubMenus();
            if (closeParentMenus)
                this._parentMenu._discardMenu(closeParentMenus, event);
            if (event)
                event.consume(true);
        }
    },
    _discardSubMenus: function() 
    {
        if (this._subMenu)
            this._subMenu._discardSubMenus();
        this._contextMenuElement.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(parentElement) 
{
    this._items = [];
    this.element = parentElement ? parentElement.createChild("div", "toolbar") : createElementWithClass("div", "toolbar");
    this._shadowRoot = WebInspector.createShadowRootWithCoreStyles(this.element);
    this._shadowRoot.appendChild(WebInspector.Widget.createStyleElement("ui/toolbar.css"));
    this._contentElement = this._shadowRoot.createChild("div", "toolbar-shadow");
    this._contentElement.createChild("content");
}
WebInspector.Toolbar.prototype = {
    makeVertical: function() 
    {
        this._contentElement.classList.add("vertical");
    },
    setEnabled: function(enabled) 
    {
        for (var item of this._items)
            item.setEnabled(enabled);
    },
    appendToolbarItem: function(item) 
    {
        this._items.push(item);
        item._toolbar = this;
        this._contentElement.insertBefore(item.element, this._contentElement.lastChild);
        this._hideSeparatorDupes();
    },
    appendSeparator: function() 
    {
        this.appendToolbarItem(new WebInspector.ToolbarSeparator());
    },
    removeToolbarItems: function() 
    {
        for (var item of this._items)
            delete item._toolbar;
        this._items = [];
        this._contentElement.removeChildren();
        this._contentElement.createChild("content");
    },
    setColor: function(color) 
    {
        var style = createElement("style");
        style.textContent = "button.toolbar-item .glyph { background-color: " + color + " !important }";
        this._shadowRoot.appendChild(style);
    },
    setToggledColor: function(color) 
    {
        var style = createElement("style");
        style.textContent = "button.toolbar-item.toggled-on .glyph { background-color: " + color + " !important }";
        this._shadowRoot.appendChild(style);
    },
    _hideSeparatorDupes: function() 
    {
        var previousIsSeparator = true;
        var lastSeparator;
        for (var i = 1; 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 ;
            }
        }
        if (lastSeparator && lastSeparator !== this._items.peekLast())
            lastSeparator.setVisible(false);
    }
}
WebInspector.ToolbarItem = function(element) 
{
    this.element = element;
    this.element.classList.add("toolbar-item");
    this._enabled = true;
    this._visible = true;
}
WebInspector.ToolbarItem.prototype = {
    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.ToolbarCounter = function(counters) 
{
    WebInspector.ToolbarItem.call(this, createElementWithClass("div", "toolbar-counter hidden"));
    this.element.addEventListener("click", this._clicked.bind(this), false);
    this._counters = [];
    for (var i = 0; i < counters.length; ++i) {
        var element = this.element.createChild("span", "toolbar-counter-item");
        var icon = element.createChild("label", "", "dt-icon-label");
        icon.type = counters[i];
        var span = icon.createChild("span");
        this._counters.push({
            counter: counters[i],
            element: element,
            value: 0,
            title: "",
            span: span
        });
    }
    this._update();
}
WebInspector.ToolbarCounter.prototype = {
    setCounter: function(counter, value, title) 
    {
        for (var i = 0; i < this._counters.length; ++i) {
            if (this._counters[i].counter === counter) {
                this._counters[i].value = value;
                this._counters[i].title = title;
                this._update();
                return;
            }
        }
    },
    _update: function() 
    {
        var total = 0;
        var title = "";
        for (var i = 0; i < this._counters.length; ++i) {
            var counter = this._counters[i];
            var value = counter.value;
            if (!counter.value) {
                counter.element.classList.add("hidden");
                continue;
            }
            counter.element.classList.remove("hidden");
            counter.element.classList.toggle("toolbar-counter-item-first", !total);
            counter.span.textContent = value;
            total += value;
            if (counter.title) {
                if (title)
                    title += ", ";
                title += counter.title;
            }
        }
        this.element.classList.toggle("hidden", !total);
        this.element.title = title;
    },
    _clicked: function(event) 
    {
        this.dispatchEventToListeners("click");
    },
    __proto__: WebInspector.ToolbarItem.prototype
}
WebInspector.ToolbarText = function(text, className) 
{
    WebInspector.ToolbarItem.call(this, createElementWithClass("span", "toolbar-text"));
    if (className)
        this.element.classList.add(className);
    this.element.textContent = text;
}
WebInspector.ToolbarText.prototype = {
    setText: function(text) 
    {
        this.element.textContent = text;
    },
    __proto__: WebInspector.ToolbarItem.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.ToolbarButtonBase = function(title, className, states) 
{
    WebInspector.ToolbarItem.call(this, createElementWithClass("button", className + " toolbar-item"));
    this.element.addEventListener("click", this._clicked.bind(this), false);
    this._longClickController = new WebInspector.LongClickController(this.element);
    this._longClickController.addEventListener(WebInspector.LongClickController.Events.LongClick, this._onLongClick.bind(this));
    this._longClickController.addEventListener(WebInspector.LongClickController.Events.LongPress, this._onLongPress.bind(this));
    this._states = states;
    if (!states)
        this._states = 2;
    if (states == 2)
        this._state = "off";
    else
        this._state = "0";
    this.setTitle(title);
    this.className = className;
}
WebInspector.ToolbarButtonBase.prototype = {
    _onLongClick: function(event) 
    {
        var nativeEvent = event.data;
        this.dispatchEventToListeners("longClickDown", nativeEvent);
    },
    _onLongPress: function(event) 
    {
        var nativeEvent = event.data;
        this.dispatchEventToListeners("longPressDown", nativeEvent);
    },
    _clicked: function() 
    {
        this.dispatchEventToListeners("click");
        this._longClickController.reset();
    },
    _applyEnabledState: function() 
    {
        this.element.disabled = !this._enabled;
        this._longClickController.reset();
    },
    enabled: function() 
    {
        return this._enabled;
    },
    title: function() 
    {
        return this._title;
    },
    setTitle: function(x) 
    {
        if (this._title === x)
            return;
        this._title = x;
        this.element.title = x;
    },
    state: function() 
    {
        return this._state;
    },
    setState: function(x) 
    {
        if (this._state === x)
            return;
        this.element.classList.remove("toggled-" + this._state);
        this.element.classList.add("toggled-" + x);
        this._state = x;
    },
    toggled: function() 
    {
        if (this._states !== 2)
            throw ("Only used toggled when there are 2 states, otherwise, use state");
        return this.state() === "on";
    },
    setToggled: function(x) 
    {
        if (this._states !== 2)
            throw ("Only used toggled when there are 2 states, otherwise, use state");
        this.setState(x ? "on" : "off");
    },
    makeLongClickEnabled: function() 
    {
        this._longClickController.enable();
        this._longClickGlyph = this.element.createChild("div", "fill long-click-glyph toolbar-button-theme");
    },
    unmakeLongClickEnabled: function() 
    {
        this._longClickController.disable();
        if (this._longClickGlyph)
            this.element.removeChild(this._longClickGlyph);
    },
    setLongClickOptionsEnabled: function(buttonsProvider) 
    {
        if (buttonsProvider) {
            if (!this._longClickOptionsData) {
                this.makeLongClickEnabled();
                var longClickDownListener = this._showOptions.bind(this);
                this.addEventListener("longClickDown", longClickDownListener, this);
                this._longClickOptionsData = {
                    longClickDownListener: longClickDownListener
                };
            }
            this._longClickOptionsData.buttonsProvider = buttonsProvider;
        } else {
            if (!this._longClickOptionsData)
                return;
            this.removeEventListener("longClickDown", this._longClickOptionsData.longClickDownListener, this);
            delete this._longClickOptionsData;
            this.unmakeLongClickEnabled();
        }
    },
    _showOptions: function() 
    {
        var buttons = this._longClickOptionsData.buttonsProvider();
        var mainButtonClone = new WebInspector.ToolbarButton(this.title(),this.className,this._states);
        mainButtonClone.addEventListener("click", this._clicked, this);
        mainButtonClone.setState(this.state());
        buttons.push(mainButtonClone);
        var document = this.element.ownerDocument;
        document.documentElement.addEventListener("mouseup", mouseUp, false);
        var optionsGlassPane = new WebInspector.GlassPane(document);
        var optionsBar = new WebInspector.Toolbar(optionsGlassPane.element);
        optionsBar.element.classList.add("fill");
        optionsBar._contentElement.classList.add("floating");
        const buttonHeight = 26;
        var hostButtonPosition = this.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;
                }
            }
        }
    },
    __proto__: WebInspector.ToolbarItem.prototype
}
WebInspector.ToolbarButton = function(title, className, states) 
{
    WebInspector.ToolbarButtonBase.call(this, title, className, states);
    this._glyphElement = this.element.createChild("div", "glyph toolbar-button-theme");
}
WebInspector.ToolbarButton.prototype = {
    setBackgroundImage: function(iconURL) 
    {
        this.element.style.backgroundImage = "url(" + iconURL + ")";
        this._glyphElement.classList.add("hidden");
    },
    __proto__: WebInspector.ToolbarButtonBase.prototype
}
WebInspector.ToolbarSettingToggle = function(setting, className, title, toggledTitle) 
{
    WebInspector.ToolbarButton.call(this, "", className, 2);
    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() 
    {
        this._setting.set(!this.toggled());
        WebInspector.ToolbarButton.prototype._clicked.call(this);
    },
    __proto__: WebInspector.ToolbarButton.prototype
}
WebInspector.ToolbarSeparator = function() 
{
    WebInspector.ToolbarItem.call(this, createElementWithClass("div", "toolbar-divider"));
}
WebInspector.ToolbarSeparator.prototype = {
    __proto__: WebInspector.ToolbarItem.prototype
}
WebInspector.ToolbarTextButton = function(title, className, text, states) 
{
    WebInspector.ToolbarButtonBase.call(this, title, className, states);
    this._textElement = this.element.createChild("div", "toolbar-button-text");
    this._textElement.textContent = text;
}
WebInspector.ToolbarTextButton.prototype = {
    __proto__: WebInspector.ToolbarButtonBase.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-select-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.ToolbarStatesSettingButton = function(className, states, titles, initialState, currentStateSetting, lastStateSetting, stateChangedCallback) 
{
    WebInspector.ToolbarButton.call(this, "", className, states.length);
    var onClickBound = this._onClick.bind(this);
    this.addEventListener("click", onClickBound, this);
    this._states = states;
    this._buttons = [];
    for (var index = 0; index < states.length; index++) {
        var button = new WebInspector.ToolbarButton(titles[index],className,states.length);
        button.setState(this._states[index]);
        button.addEventListener("click", onClickBound, this);
        this._buttons.push(button);
    }
    this._currentStateSetting = currentStateSetting;
    this._lastStateSetting = lastStateSetting;
    this._stateChangedCallback = stateChangedCallback;
    this.setLongClickOptionsEnabled(this._createOptions.bind(this));
    this._currentState = null ;
    this._toggleState(initialState);
}
WebInspector.ToolbarStatesSettingButton.prototype = {
    _onClick: function(e) 
    {
        this._toggleState(e.target.state());
    },
    _toggleState: function(state) 
    {
        if (this._currentState === state)
            return;
        if (this._currentState)
            this._lastStateSetting.set(this._currentState);
        this._currentState = state;
        this._currentStateSetting.set(this._currentState);
        if (this._stateChangedCallback)
            this._stateChangedCallback(state);
        var defaultState = this._defaultState();
        this.setState(defaultState);
        this.setTitle(this._buttons[this._states.indexOf(defaultState)].title());
    },
    toggle: function() 
    {
        this._toggleState(this.state());
    },
    _defaultState: function() 
    {
        var lastState = this._lastStateSetting.get();
        if (lastState && this._states.indexOf(lastState) >= 0 && lastState != this._currentState)
            return lastState;
        if (this._states.length > 1 && this._currentState === this._states[0])
            return this._states[1];
        return this._states[0];
    },
    _createOptions: function() 
    {
        var options = [];
        for (var index = 0; index < this._states.length; index++) {
            if (this._states[index] !== this.state() && this._states[index] !== this._currentState)
                options.push(this._buttons[index]);
        }
        return options;
    },
    __proto__: WebInspector.ToolbarButton.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["className"])
                return Promise.resolve(new WebInspector.ToolbarButton(WebInspector.UIString(descriptor["title"]),descriptor["elementClass"])).then(attachHandler);
            return extension.instancePromise().then(fetchItemFromProvider).then(attachHandler);
            function fetchItemFromProvider(provider) 
            {
                return (provider).item();
            }
            function attachHandler(item) 
            {
                if (extension.descriptor()["actionId"] && item)
                    item.addEventListener("click", handler);
                return item;
            }
            function handler() 
            {
                WebInspector.actionRegistry.execute(extension.descriptor()["actionId"]);
            }
        }
        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.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._element = createElementWithClass("div", "suggest-box");
    this._element.addEventListener("mousedown", this._onBoxMouseDown.bind(this), true);
}
WebInspector.SuggestBox.prototype = {
    visible: function() 
    {
        return !!this._element.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._element);
    },
    hide: function() 
    {
        if (!this.visible())
            return;
        this._bodyElement.removeEventListener("mousedown", this._maybeHideBound, true);
        delete this._bodyElement;
        this._element.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.textContent;
        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) 
    {
        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);
        } else {
            element.createChild("span", "suffix").textContent = text;
        }
        element.createChild("span", "spacer");
        element.addEventListener("mousedown", this._onItemMouseDown.bind(this), false);
        return element;
    },
    _updateItems: function(items, userEnteredText) 
    {
        this._length = items.length;
        this._element.removeChildren();
        delete this._selectedElement;
        for (var i = 0; i < items.length; ++i) {
            var item = items[i];
            var currentItemElement = this._createItemElement(userEnteredText, item);
            this._element.appendChild(currentItemElement);
        }
    },
    _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");
        if (scrollIntoView)
            this._selectedElement.scrollIntoViewIfNeeded(false);
    },
    _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) 
    {
        if (this._canShowBox(completions, canShowForSingleItem, userEnteredText)) {
            this._updateItems(completions, userEnteredText);
            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);
    root.appendChild(WebInspector.Widget.createStyleElement("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 toolbar-colors");
    this._headerElement.createChild("content").select = ".tabbed-pane-header-before";
    this._headerContentsElement = this._headerElement.createChild("div", "tabbed-pane-header-contents");
    this._tabSlider = this._headerContentsElement.createChild("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"
}
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;
    },
    setRetainTabOrder: function(retainTabOrder, tabOrderComparator) 
    {
        this._retainTabOrder = retainTabOrder;
        this._tabOrderComparator = tabOrderComparator;
    },
    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) 
    {
        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;
        function comparator(tab1, tab2) 
        {
            return this._tabOrderComparator(tab1.id, tab2.id);
        }
        if (this._tabOrderComparator)
            this._tabs.splice(insertionIndexForObjectInListSortedByFunction(tab, this._tabs, comparator.bind(this)), 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;
            }
        }
        if (!this._measuredDropDownButtonWidth)
            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.createTextChild("\u00bb");
        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.selectTab(tabId, true);
    },
    _totalWidth: function() 
    {
        return this._headerContentsElement.getBoundingClientRect().width;
    },
    _updateTabsDropDown: function() 
    {
        var tabsToShowIndexes = this._tabsToShowIndexes(this._tabs, this._tabsHistory, this._totalWidth(), this._measuredDropDownButtonWidth);
        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);
        }
        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]);
            continue;
        }
        function compareFunction(tab1, tab2) 
        {
            return tab1.title.localeCompare(tab2.title);
        }
        if (!this._retainTabOrder)
            tabsToShow.sort(compareFunction);
        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() 
    {
        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]);
        for (var i = 0; i < tabCount; ++i) {
            var tab = this._retainTabOrder ? tabsToLookAt[i] : tabsHistory[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)
            return;
        if (!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;
        this._tabSlider.style.transform = "translateX(" + left + "px)";
        this._tabSlider.style.width = sliderWidth + "px";
    },
    _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);
    },
    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");
    },
    __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._closeable)
                WebInspector.installDragHandle(tabElement, this._startTabDragging.bind(this), this._tabDragging.bind(this), this._endTabDragging.bind(this), "pointer");
        }
        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;
        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("position", "relative");
        this._tabElement.style.setProperty("left", (event.pageX - this._dragStartX) + "px");
    },
    _endTabDragging: function(event) 
    {
        this._tabElement.style.removeProperty("position");
        this._tabElement.style.removeProperty("left");
        delete this._dragStartX;
    }
}
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._tabOrders = {};
    this._promiseForId = {};
    this._tabbedPane.setRetainTabOrder(true, this._tabOrderComparator.bind(this));
    this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);
    this._views = new Map();
    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 descriptor = extensions[i].descriptor();
            var id = descriptor["name"];
            this._tabOrders[id] = i;
            var title = WebInspector.UIString(descriptor["title"]);
            this._extensions.set(id, extensions[i]);
            this._tabbedPane.appendTab(id, title, new WebInspector.Widget());
        }
    },
    appendView: function(id, title, order, view) 
    {
        this._tabOrders[id] = order;
        this._views.set(id, view);
        this._tabbedPane.appendTab(id, title, new WebInspector.Widget());
    },
    _tabSelected: function(event) 
    {
        var tabId = (event.data.tabId);
        this.viewForId(tabId).then(viewLoaded.bind(this));
        function viewLoaded(view) 
        {
            if (!view)
                return;
            this._tabbedPane.changeTabView(tabId, view);
            var shouldFocus = this._tabbedPane.visibleView.element.isSelfOrAncestor(WebInspector.currentFocusElement());
            if (shouldFocus)
                view.focus();
        }
    },
    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);
            return view;
        }
    },
    _tabOrderComparator: function(id1, id2) 
    {
        return this._tabOrders[id2] = this._tabOrders[id1];
    }
};
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.setRetainTabOrder(true);
    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);
        shadowRoot.appendChild(WebInspector.Widget.createStyleElement("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;
    },
    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), wordPrefixRange, force || false, this._completionsReady.bind(this, selection, wordPrefixRange, !!reverse));
    },
    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();
    },
    _completionsReady: function(selection, originalWordPrefixRange, reverse, completions, selectedIndex) 
    {
        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 (originalWordPrefixRange.toString() + 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, originalPrefixRange) 
    {
        var wordPrefixLength;
        if (originalPrefixRange)
            wordPrefixLength = originalPrefixRange.toString().length;
        else
            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;
    },
    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) 
{
    element.addEventListener("mousedown", WebInspector.elementDragStart.bind(WebInspector, elementDragStart, elementDrag, elementDragEnd, cursor), false);
    if (hoverCursor !== null )
        element.style.cursor = hoverCursor || cursor;
}
WebInspector.elementDragStart = function(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);
    var targetElement = (event.target);
    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) 
{
    this.element = createElement("div");
    this.element.style.cssText = "position:absolute;top:0;bottom:0;left:0;right:0;background-color:transparent;z-index:1000;overflow:hidden;";
    this.element.id = "glass-pane";
    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.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("%.3f\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, initialValue) 
{
    var element = createElement("span");
    var formatters = {
        s: function(substitution) 
        {
            return substitution;
        }
    };
    function append(a, b) 
    {
        if (typeof b === "string")
            b = createTextNode(b);
        else if (b.shadowRoot)
            b = createTextNode(b.shadowRoot.lastChild.textContent);
        element.appendChild(b);
    }
    String.format(WebInspector.UIString(format), substitutions, formatters, initialValue, append);
    return element;
}
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.manageBlackboxingButtonLabel = function() 
{
    return WebInspector.UIString("Manage framework blackboxing...");
}
WebInspector.installComponentRootStyles = function(element) 
{
    element.appendChild(WebInspector.Widget.createStyleElement("ui/inspectorCommon.css"));
    element.appendChild(WebInspector.Widget.createStyleElement("ui/inspectorSyntaxHighlight.css"));
    element.classList.add("platform-" + WebInspector.platform());
    if (Runtime.experiments.isEnabled("materialDesign"))
        element.classList.add("material");
}
WebInspector.createShadowRootWithCoreStyles = function(element) 
{
    var shadowRoot = element.createShadowRoot();
    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("ui/inspectorCommon.css"));
    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("ui/inspectorSyntaxHighlight.css"));
    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 (WebInspector._currentFocusElement) {
        WebInspector._currentFocusElement.focus();
        var selection = x.getComponentSelection();
        if (!WebInspector._isTextEditingElement(WebInspector._currentFocusElement) && selection.isCollapsed && !WebInspector._currentFocusElement.isInsertionCaretInside()) {
            var selectionRange = WebInspector._currentFocusElement.ownerDocument.createRange();
            selectionRange.setStart(WebInspector._currentFocusElement, 0);
            selectionRange.setEnd(WebInspector._currentFocusElement, 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 lineText = element.deepTextContent();
    var ownerDocument = element.ownerDocument;
    var textNodes = element.childTextNodes();
    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) 
{
    this._element = element;
}
WebInspector.LongClickController.Events = {
    LongClick: "LongClick",
    LongPress: "LongPress"
};
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);
        var longClicks = 0;
        this._longClickData = {
            mouseUp: boundMouseUp,
            mouseDown: boundMouseDown,
            reset: boundReset
        };
        function mouseDown(e) 
        {
            if (e.which !== 1)
                return;
            longClicks = 0;
            this._longClickInterval = setInterval(longClicked.bind(this, e), 200);
        }
        function mouseUp(e) 
        {
            if (e.which !== 1)
                return;
            this.reset();
        }
        function longClicked(e) 
        {
            ++longClicks;
            this.dispatchEventToListeners(longClicks === 1 ? WebInspector.LongClickController.Events.LongClick : WebInspector.LongClickController.Events.LongPress, e);
        }
    },
    disable: 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(window) 
{
    window.addEventListener("focus", WebInspector._windowFocused.bind(WebInspector, window.document), false);
    window.addEventListener("blur", WebInspector._windowBlurred.bind(WebInspector, window.document), false);
    window.document.addEventListener("focus", WebInspector._focusChanged.bind(WebInspector), true);
    window.document.addEventListener("blur", WebInspector._documentBlurred.bind(WebInspector, window.document), true);
}
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;
}
;(function() {
    registerCustomElement("button", "text-button", {
        createdCallback: function() 
        {
            this.type = "button";
            var root = WebInspector.createShadowRootWithCoreStyles(this);
            root.appendChild(WebInspector.Widget.createStyleElement("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);
            root.appendChild(WebInspector.Widget.createStyleElement("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);
            this._root.appendChild(WebInspector.Widget.createStyleElement("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)
                    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);
            root.appendChild(WebInspector.Widget.createStyleElement("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);
            root.appendChild(WebInspector.Widget.createStyleElement("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.ViewportControl = function(provider) 
{
    this.element = createElement("div");
    this.element.style.overflow = "auto";
    this._topGapElement = this.element.createChild("div", "viewport-control-gap-element");
    this._topGapElement.textContent = ".";
    this._topGapElement.style.height = "0px";
    this._contentElement = this.element.createChild("div");
    this._bottomGapElement = this.element.createChild("div", "viewport-control-gap-element");
    this._bottomGapElement.textContent = ".";
    this._bottomGapElement.style.height = "0px";
    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 = {
    cacheFastHeight: function() {},
    willHide: function() {},
    wasShown: function() {},
    element: function() {},
}
WebInspector.StaticViewportElement = function(element) 
{
    this._element = element;
}
WebInspector.StaticViewportElement.prototype = {
    cacheFastHeight: function() {},
    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;
        this._cumulativeHeights = new Int32Array(itemCount);
        this._cumulativeHeights[0] = this._provider.fastHeight(0);
        for (var i = 1; i < itemCount; ++i)
            this._cumulativeHeights[i] = this._cumulativeHeights[i - 1] + this._provider.fastHeight(i);
    },
    _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) {
            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].cacheFastHeight();
            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) {
            this._renderedItems[i].cacheFastHeight();
            if (this._cumulativeHeights && Math.abs(this._cachedItemHeight(this._firstVisibleIndex + i) - this._provider.fastHeight(i + this._firstVisibleIndex)) > 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];
        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();
        else
            this._partialViewportUpdate(oldFirstVisibleIndex, oldLastVisibleIndex);
        this._contentElement.style.removeProperty("height");
        if (shouldRestoreSelection)
            this._restoreSelection(selection);
        if (shouldStickToBottom)
            this.element.scrollTop = this.element.scrollHeight;
    },
    _fullViewportUpdate: function() 
    {
        for (var i = 0; i < this._renderedItems.length; ++i)
            this._renderedItems[i].willHide();
        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);
            viewportElement.wasShown();
        }
    },
    _partialViewportUpdate: function(oldFirstVisibleIndex, oldLastVisibleIndex) 
    {
        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();
        for (var i = 0; i < willBeHidden.length; ++i)
            willBeHidden[i].element().remove();
        this._renderedItems = [];
        var anchor = this._contentElement.firstChild;
        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);
                viewportElement.wasShown();
            } else {
                anchor = anchor.nextSibling;
            }
            this._renderedItems.push(viewportElement);
        }
    },
    _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(finishedCallback) 
    {
        finishedCallback();
    },
    update: function() 
    {
        this._updateWhenVisible = !this.isShowing();
        if (this._updateWhenVisible)
            return;
        this._updateThrottler.schedule(innerUpdate.bind(this));
        function innerUpdate(finishedCallback) 
        {
            if (this.isShowing()) {
                this.doUpdate(finishedCallback);
            } else {
                this._updateWhenVisible = true;
                finishedCallback();
            }
        }
    },
    wasShown: function() 
    {
        WebInspector.Widget.prototype.wasShown.call(this);
        if (this._updateWhenVisible)
            this.update();
    },
    __proto__: WebInspector.Widget.prototype
};
function InspectorBackendClass() 
{
    this._connection = null ;
    this._agentPrototypes = {};
    this._dispatcherPrototypes = {};
    this._initialized = false;
    this._enums = {};
    this._initProtocolAgentsConstructor();
}
InspectorBackendClass._DevToolsErrorCode = -32000;
InspectorBackendClass.reportProtocolError = function(error, messageObject) 
{
    console.error(error + ": " + JSON.stringify(messageObject));
}
InspectorBackendClass.prototype = {
    _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;
    },
    connection: function() 
    {
        if (!this._connection)
            throw "Main connection was not initialized";
        return this._connection;
    },
    setConnection: function(connection) 
    {
        this._connection = connection;
        this._connection.registerAgentsOn(window);
        for (var type in this._enums) {
            var domainAndMethod = type.split(".");
            window[domainAndMethod[0] + "Agent"][domainAndMethod[1]] = this._enums[type];
        }
    },
    _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) 
    {
        this._enums[type] = values;
        this._initialized = true;
    },
    registerEvent: function(eventName, params) 
    {
        var domain = eventName.split(".")[0];
        this._dispatcherPrototype(domain).registerEvent(eventName, params);
        this._initialized = true;
    },
    loadFromJSONIfNeeded: function(jsonUrl) 
    {
        if (this._initialized)
            return;
        var xhr = new XMLHttpRequest();
        xhr.open("GET", jsonUrl, false);
        xhr.send(null );
        var schema = JSON.parse(xhr.responseText);
        var code = InspectorBackendClass._generateCommands(schema);
        eval(code);
    },
    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._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");
}
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]);
    },
    registerAgentsOn: function(object) 
    {
        for (var domain in this._agents)
            object[domain + "Agent"] = {};
    },
    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 {
            if (messageObject.error) {
                InspectorBackendClass.reportProtocolError("Generic message format error", messageObject);
                return;
            }
            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.MainConnection = function() 
{
    InspectorBackendClass.Connection.call(this);
    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.DispatchMessage, this._dispatchMessage, this);
    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.DispatchMessageChunk, this._dispatchMessageChunk, this);
}
InspectorBackendClass.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
}
InspectorBackendClass.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");
}
InspectorBackendClass.WebSocketConnection.Create = function(url, onConnectionReady) 
{
    new InspectorBackendClass.WebSocketConnection(url,onConnectionReady);
}
InspectorBackendClass.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
}
InspectorBackendClass.StubConnection = function() 
{
    InspectorBackendClass.Connection.call(this);
}
InspectorBackendClass.StubConnection.prototype = {
    sendMessage: function(messageObject) 
    {
        setTimeout(this._echoResponse.bind(this, messageObject), 0);
    },
    _echoResponse: function(messageObject) 
    {
        this.dispatch(messageObject);
    },
    __proto__: InspectorBackendClass.Connection.prototype
}
InspectorBackendClass.AgentPrototype = function(domain) 
{
    this._replyArgs = {};
    this._hasErrorData = {};
    this._domain = domain;
    this._suppressErrorLogging = false;
    this._promisified = domain in InspectorBackendClass.AgentPrototype.PromisifiedDomains;
}
InspectorBackendClass.AgentPrototype.PromisifiedDomains = {
    "CSS": true,
    "Profiler": true
}
InspectorBackendClass.AgentPrototype.prototype = {
    setConnection: function(connection) 
    {
        this._connection = connection;
    },
    registerCommand: function(methodName, signature, replyArgs, hasErrorData) 
    {
        var domainAndMethod = this._domain + "." + methodName;
        function sendMessage(vararg) 
        {
            var params = Array.prototype.slice.call(arguments);
            InspectorBackendClass.AgentPrototype.prototype._sendMessageToBackend.call(this, domainAndMethod, signature, params);
        }
        function sendMessagePromise(vararg) 
        {
            var params = Array.prototype.slice.call(arguments);
            return InspectorBackendClass.AgentPrototype.prototype._sendMessageToBackendPromise.call(this, domainAndMethod, signature, replyArgs, params);
        }
        this[methodName] = this._promisified ? sendMessagePromise : sendMessage;
        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 
    },
    _sendMessageToBackend: function(method, signature, args) 
    {
        var errorMessage;
        function onError(message) 
        {
            console.error(message)
            errorMessage = message;
        }
        var callback = (args.length && typeof args.peekLast() === "function") ? args.pop() : null ;
        var params = this._prepareParameters(method, signature, args, !callback, onError);
        if (errorMessage)
            return;
        this._connection._wrapCallbackAndSendMessageObject(this._domain, method, params, callback);
    },
    _sendMessageToBackendPromise: function(method, signature, replyArgs, 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, false, 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 && !InspectorBackendClass.Options.suppressRequestErrors && !this._suppressErrorLogging) {
            var id = InspectorFrontendHost.isUnderTest() ? "##" : messageObject.id;
            console.error("Request with id = " + 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.registerCommand("Memory.getDOMCounters", [], ["documents", "nodes", "jsEventListeners"], false);
InspectorBackend.registerEnum("Page.ResourceType", {
    Document: "Document",
    Stylesheet: "Stylesheet",
    Image: "Image",
    Media: "Media",
    Font: "Font",
    Script: "Script",
    TextTrack: "TextTrack",
    XHR: "XHR",
    WebSocket: "WebSocket",
    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", "frameNumber"]);
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.canScreencast", [], ["result"], 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
}], [], false);
InspectorBackend.registerCommand("Page.stopScreencast", [], [], false);
InspectorBackend.registerCommand("Page.screencastFrameAck", [{
    "name": "frameNumber",
    "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.setShowViewportSizeOnResize", [{
    "name": "show",
    "type": "boolean",
    "optional": false
}, {
    "name": "showGrid",
    "type": "boolean",
    "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.setContinuousPaintingEnabled", [{
    "name": "enabled",
    "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.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("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"]);
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.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.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",
    Author: "author"
});
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.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.setInspectModeEnabled", [{
    "name": "enabled",
    "type": "boolean",
    "optional": false
}, {
    "name": "inspectUAShadowDOM",
    "type": "boolean",
    "optional": true
}, {
    "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.registerCommand("CSS.enable", [], [], false);
InspectorBackend.registerCommand("CSS.disable", [], [], false);
InspectorBackend.registerCommand("CSS.getMatchedStylesForNode", [{
    "name": "nodeId",
    "type": "number",
    "optional": false
}, {
    "name": "excludePseudo",
    "type": "boolean",
    "optional": true
}, {
    "name": "excludeInherited",
    "type": "boolean",
    "optional": true
}], ["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.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
}], [], false);
InspectorBackend.registerCommand("CSS.setRuleSelector", [{
    "name": "styleSheetId",
    "type": "string",
    "optional": false
}, {
    "name": "range",
    "type": "object",
    "optional": false
}, {
    "name": "selector",
    "type": "string",
    "optional": false
}], ["rule"], 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.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", "isContentScript", "isInternalScript", "sourceMapURL", "hasSourceURL"]);
InspectorBackend.registerEvent("Debugger.scriptFailedToParse", ["scriptId", "url", "startLine", "startColumn", "endLine", "endColumn", "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", "result", "asyncStackTrace"], true);
InspectorBackend.registerCommand("Debugger.restartFrame", [{
    "name": "callFrameId",
    "type": "string",
    "optional": false
}], ["callFrames", "result", "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": true
}], ["scriptId", "exceptionDetails"], false);
InspectorBackend.registerCommand("Debugger.runScript", [{
    "name": "scriptId",
    "type": "string",
    "optional": false
}, {
    "name": "executionContextId",
    "type": "number",
    "optional": true
}, {
    "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"]);
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.skipWaiting", [{
    "name": "versionId",
    "type": "string",
    "optional": false
}], [], false);
InspectorBackend.registerCommand("ServiceWorker.setDebugOnStart", [{
    "name": "debugOnStart",
    "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
}], [], 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", []);
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
}], [], false);
InspectorBackend.registerCommand("Tracing.end", [], [], false);
InspectorBackend.registerCommand("Tracing.getCategories", [], ["categories"], false);
InspectorBackend.registerEvent("Power.dataAvailable", ["value"]);
InspectorBackend.registerCommand("Power.start", [], [], false);
InspectorBackend.registerCommand("Power.end", [], [], false);
InspectorBackend.registerCommand("Power.canProfilePower", [], ["result"], false);
InspectorBackend.registerCommand("Power.getAccuracyLevel", [], ["result"], false);
InspectorBackend.registerEnum("Animation.AnimationType", {
    CSSTransition: "CSSTransition",
    CSSAnimation: "CSSAnimation",
    WebAnimation: "WebAnimation"
});
InspectorBackend.registerEvent("Animation.animationCreated", ["player", "resetTimeline"]);
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.setCurrentTime", [{
    "name": "currentTime",
    "type": "number",
    "optional": false
}], [], false);
InspectorBackend.registerCommand("Animation.setTiming", [{
    "name": "playerId",
    "type": "string",
    "optional": false
}, {
    "name": "duration",
    "type": "number",
    "optional": false
}, {
    "name": "delay",
    "type": "number",
    "optional": false
}], [], false);
InspectorBackend.registerEnum("Accessibility.AXValueType", {
    Boolean: "boolean",
    Tristate: "tristate",
    BooleanOrUndefined: "booleanOrUndefined",
    Idref: "idref",
    IdrefList: "idrefList",
    Integer: "integer",
    Number: "number",
    String: "string",
    Token: "token",
    TokenList: "tokenList",
    DomRelation: "domRelation",
    Role: "role",
    InternalRole: "internalRole"
});
InspectorBackend.registerEnum("Accessibility.AXPropertySourceType", {
    Attribute: "attribute",
    Implicit: "implicit",
    Style: "style"
});
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);
InspectorBackend.registerEnum("Security.SecurityState", {
    Unknown: "unknown",
    Http: "http",
    Insecure: "insecure",
    Warning: "warning",
    Secure: "secure"
});
InspectorBackend.registerEvent("Security.securityStateChanged", ["securityState", "explanations"]);
InspectorBackend.registerCommand("Security.enable", [], [], false);
InspectorBackend.registerCommand("Security.disable", [], [], false);
;WebInspector.Target = function(name, type, connection, parentTarget, callback) 
{
    Protocol.Agents.call(this, connection.agentsMap());
    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._capabilities = {};
    this.pageAgent().canScreencast(this._initializeCapability.bind(this, WebInspector.Target.Capabilities.CanScreencast, this._loadedWithCapabilities.bind(this, callback)));
}
WebInspector.Target.Capabilities = {
    CanScreencast: "CanScreencast"
}
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;
    },
    decorateLabel: function(label) 
    {
        return this.isWorker() ? "\u2699 " + label : label;
    },
    _initializeCapability: function(name, callback, error, result) 
    {
        this._capabilities[name] = result;
        if (callback)
            callback();
    },
    hasCapability: function(capability) 
    {
        return !!this._capabilities[capability];
    },
    _loadedWithCapabilities: function(callback) 
    {
        if (this._connection.isClosed()) {
            callback(null );
            return;
        }
        this.consoleModel = new WebInspector.ConsoleModel(this);
        this.networkManager = new WebInspector.NetworkManager(this);
        this.resourceTreeModel = new WebInspector.ResourceTreeModel(this);
        this.networkLog = new WebInspector.NetworkLog(this);
        if (this.hasJSContext())
            new WebInspector.DebuggerModel(this);
        this.runtimeModel = new WebInspector.RuntimeModel(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.layerTreeModel = new WebInspector.LayerTreeModel(this);
        this.tracingManager = new WebInspector.TracingManager(this);
        if (this.isPage() && (Runtime.experiments.isEnabled("serviceWorkersInPageFrontend") || Runtime.experiments.isEnabled("serviceWorkersInResources")))
            this.serviceWorkerManager = new WebInspector.ServiceWorkerManager(this);
        if (callback)
            callback(this);
    },
    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() 
    {
        WebInspector.targetManager.removeTarget(this);
        this._dispose();
    },
    _dispose: function() 
    {
        WebInspector.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 = {
    __proto__: WebInspector.SDKObject.prototype
}
WebInspector.TargetManager = function() 
{
    WebInspector.Object.call(this);
    this._targets = [];
    this._observers = [];
    this._observerTypeSymbol = Symbol("observerType");
    this._modelListeners = {};
    this._suspendCount = 0;
}
WebInspector.TargetManager.Events = {
    InspectedURLChanged: "InspectedURLChanged",
    MainFrameNavigated: "MainFrameNavigated",
    Load: "Load",
    WillReloadPage: "WillReloadPage",
    SuspendStateChanged: "SuspendStateChanged",
    TargetDisposed: "TargetDisposed"
}
WebInspector.TargetManager.prototype = {
    suspendAllTargets: function() 
    {
        if (this._suspendCount++)
            return;
        this.dispatchEventToListeners(WebInspector.TargetManager.Events.SuspendStateChanged);
    },
    resumeAllTargets: function() 
    {
        console.assert(this._suspendCount > 0);
        if (--this._suspendCount)
            return;
        this.dispatchEventToListeners(WebInspector.TargetManager.Events.SuspendStateChanged);
    },
    allTargetsSuspended: function() 
    {
        return !!this._suspendCount;
    },
    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) 
    {
        if (this._targets.length)
            this._targets[0].resourceTreeModel.reloadPage(ignoreCache);
    },
    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, callback) 
    {
        new WebInspector.Target(name,type,connection,parentTarget,callbackWrapper.bind(this));
        function callbackWrapper(newTarget) 
        {
            if (newTarget)
                this.addTarget(newTarget);
            if (callback)
                callback(newTarget);
        }
    },
    _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.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 (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;
        }
    },
    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) 
{
    useCommandLineAPI = !!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
            });
        }
    }
    executionContext.evaluate(text, "console", useCommandLineAPI, false, false, true, printResult);
    WebInspector.userMetrics.ConsoleEvaluated.record();
}
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.ConcatenatedScriptsContentProvider = function(scripts) 
{
    this._scripts = scripts;
}
WebInspector.ConcatenatedScriptsContentProvider.scriptOpenTag = "<script>";
WebInspector.ConcatenatedScriptsContentProvider.scriptCloseTag = "</script>";
WebInspector.ConcatenatedScriptsContentProvider.prototype = {
    _sortedScripts: function() 
    {
        if (this._sortedScriptsArray)
            return this._sortedScriptsArray;
        this._sortedScriptsArray = [];
        var scripts = this._scripts.slice();
        scripts.sort(function(x, y) {
            return x.lineOffset - y.lineOffset || x.columnOffset - y.columnOffset;
        }
        );
        var scriptOpenTagLength = WebInspector.ConcatenatedScriptsContentProvider.scriptOpenTag.length;
        var scriptCloseTagLength = WebInspector.ConcatenatedScriptsContentProvider.scriptCloseTag.length;
        this._sortedScriptsArray.push(scripts[0]);
        for (var i = 1; i < scripts.length; ++i) {
            var previousScript = this._sortedScriptsArray[this._sortedScriptsArray.length - 1];
            var lineNumber = previousScript.endLine;
            var columnNumber = previousScript.endColumn + scriptCloseTagLength + scriptOpenTagLength;
            if (lineNumber < scripts[i].lineOffset || (lineNumber === scripts[i].lineOffset && columnNumber <= scripts[i].columnOffset))
                this._sortedScriptsArray.push(scripts[i]);
        }
        return this._sortedScriptsArray;
    },
    contentURL: function() 
    {
        return "";
    },
    contentType: function() 
    {
        return WebInspector.resourceTypes.Document;
    },
    requestContent: function(callback) 
    {
        var scripts = this._sortedScripts();
        var sources = [];
        function didRequestSource(content) 
        {
            sources.push(content);
            if (sources.length == scripts.length)
                callback(this._concatenateScriptsContent(scripts, sources));
        }
        for (var i = 0; i < scripts.length; ++i)
            scripts[i].requestContent(didRequestSource.bind(this));
    },
    searchInContent: function(query, caseSensitive, isRegex, callback) 
    {
        var results = {};
        var scripts = this._sortedScripts();
        var scriptsLeft = scripts.length;
        function maybeCallback() 
        {
            if (scriptsLeft)
                return;
            var result = [];
            for (var i = 0; i < scripts.length; ++i)
                result = result.concat(results[scripts[i].scriptId]);
            callback(result);
        }
        function searchCallback(script, searchMatches) 
        {
            results[script.scriptId] = [];
            for (var i = 0; i < searchMatches.length; ++i) {
                var searchMatch = new WebInspector.ContentProvider.SearchMatch(searchMatches[i].lineNumber + script.lineOffset,searchMatches[i].lineContent);
                results[script.scriptId].push(searchMatch);
            }
            scriptsLeft--;
            maybeCallback();
        }
        maybeCallback();
        for (var i = 0; i < scripts.length; ++i)
            scripts[i].searchInContent(query, caseSensitive, isRegex, searchCallback.bind(null , scripts[i]));
    },
    _concatenateScriptsContent: function(scripts, sources) 
    {
        var content = "";
        var lineNumber = 0;
        var columnNumber = 0;
        var scriptOpenTag = WebInspector.ConcatenatedScriptsContentProvider.scriptOpenTag;
        var scriptCloseTag = WebInspector.ConcatenatedScriptsContentProvider.scriptCloseTag;
        for (var i = 0; i < scripts.length; ++i) {
            for (var newLinesCount = scripts[i].lineOffset - lineNumber; newLinesCount > 0; --newLinesCount) {
                columnNumber = 0;
                content += "\n";
            }
            for (var spacesCount = scripts[i].columnOffset - columnNumber - scriptOpenTag.length; spacesCount > 0; --spacesCount)
                content += " ";
            content += scriptOpenTag;
            content += sources[i];
            content += scriptCloseTag;
            lineNumber = scripts[i].endLine;
            columnNumber = scripts[i].endColumn + scriptCloseTag.length;
        }
        return content;
    }
}
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.ResourceLoader.loadUsingTargetUA(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();
        this._fixLineAndColumnNumbers();
    }
    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);
    },
    _fixLineAndColumnNumbers: function() 
    {
        var nodeListsToTraverse = [this.profileHead.children];
        while (nodeListsToTraverse.length) {
            var nodeList = nodeListsToTraverse.pop();
            for (var i = 0; i < nodeList.length; ++i) {
                var node = nodeList[i];
                --node.lineNumber;
                --node.columnNumber;
                if (node.children)
                    nodeListsToTraverse.push(node.children);
            }
        }
    },
    _assignParentsInProfile: function() 
    {
        var head = this.profileHead;
        head.parent = null ;
        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.parent = parent;
                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 = {
    ProfileStarted: "ProfileStarted",
    ProfileStopped: "ProfileStopped",
    ConsoleProfileStarted: "ConsoleProfileStarted",
    ConsoleProfileFinished: "ConsoleProfileFinished"
};
WebInspector.CPUProfilerModel.prototype = {
    _configureCpuProfilerSamplingInterval: function() 
    {
        var intervalUs = WebInspector.moduleSetting("highResolutionCpuProfiling").get() ? 100 : 1000;
        this.target().profilerAgent().setSamplingInterval(intervalUs);
    },
    consoleProfileFinished: function(id, scriptLocation, cpuProfile, title) 
    {
        self.runtime.loadModulePromise("profiler").then(dispatchEvent.bind(this));
        function dispatchEvent() 
        {
            var debuggerModel = (WebInspector.DebuggerModel.fromTarget(this.target()));
            var debuggerLocation = WebInspector.DebuggerModel.Location.fromPayload(debuggerModel, scriptLocation);
            this.dispatchEventToListeners(WebInspector.CPUProfilerModel.EventTypes.ConsoleProfileFinished, {
                protocolId: id,
                scriptLocation: debuggerLocation,
                cpuProfile: cpuProfile,
                title: title
            });
        }
    },
    consoleProfileStarted: function(id, scriptLocation, title) 
    {
        self.runtime.loadModulePromise("profiler").then(dispatchEvent.bind(this));
        function dispatchEvent() 
        {
            var debuggerModel = (WebInspector.DebuggerModel.fromTarget(this.target()));
            var debuggerLocation = WebInspector.DebuggerModel.Location.fromPayload(debuggerModel, scriptLocation);
            this.dispatchEventToListeners(WebInspector.CPUProfilerModel.EventTypes.ConsoleProfileStarted, {
                protocolId: id,
                scriptLocation: debuggerLocation,
                title: title
            });
        }
    },
    isRecordingProfile: function() 
    {
        return this._isRecording;
    },
    startRecording: function() 
    {
        this._isRecording = true;
        this.target().profilerAgent().start();
        this.dispatchEventToListeners(WebInspector.CPUProfilerModel.EventTypes.ProfileStarted);
        WebInspector.userMetrics.ProfilesCPUProfileTaken.record();
    },
    stopRecording: function() 
    {
        function extractProfile(error, profile) 
        {
            return !error && profile ? profile : null ;
        }
        this._isRecording = false;
        this.dispatchEventToListeners(WebInspector.CPUProfilerModel.EventTypes.ProfileStopped);
        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"]
    },
    "-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"]
    },
    "-webkit-text-combine": {
        values: ["none", "horizontal"]
    },
    "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"]
    }
}
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": 249,
    "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);
    },
    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.Property;
;WebInspector.CSSStyleModel = function(target) 
{
    WebInspector.SDKModel.call(this, WebInspector.CSSStyleModel, target);
    this._domModel = WebInspector.DOMModel.fromTarget(target);
    this._agent = target.cssAgent();
    WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged, this._suspendStateChanged, this);
    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.PseudoStatePropertyName = "pseudoState";
WebInspector.CSSStyleModel.parseRuleMatchArrayPayload = function(cssModel, matchArray) 
{
    if (!matchArray)
        return [];
    var result = [];
    for (var i = 0; i < matchArray.length; ++i)
        result.push(WebInspector.CSSRule.parsePayload(cssModel, matchArray[i].rule, matchArray[i].matchingSelectors));
    return result;
}
WebInspector.CSSStyleModel.Events = {
    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.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, excludePseudo, excludeInherited) 
    {
        function callback(error, matchedPayload, pseudoPayload, inheritedPayload) 
        {
            if (error)
                return null ;
            var matchedRules = WebInspector.CSSStyleModel.parseRuleMatchArrayPayload(this, matchedPayload);
            var pseudoElements = [];
            if (pseudoPayload) {
                for (var i = 0; i < pseudoPayload.length; ++i) {
                    var entryPayload = pseudoPayload[i];
                    pseudoElements.push(new WebInspector.CSSStyleModel.PseudoElementMatches(entryPayload.pseudoId,WebInspector.CSSStyleModel.parseRuleMatchArrayPayload(this, entryPayload.matches)));
                }
            }
            var inherited = [];
            if (inheritedPayload) {
                for (var i = 0; i < inheritedPayload.length; ++i) {
                    var entryPayload = inheritedPayload[i];
                    var inlineStyle = entryPayload.inlineStyle ? WebInspector.CSSStyleDeclaration.parsePayload(this, entryPayload.inlineStyle) : null ;
                    var matchedCSSRules = entryPayload.matchedCSSRules ? WebInspector.CSSStyleModel.parseRuleMatchArrayPayload(this, entryPayload.matchedCSSRules) : null ;
                    inherited.push(new WebInspector.CSSStyleModel.InheritedMatches(inlineStyle,matchedCSSRules));
                }
            }
            return new WebInspector.CSSStyleModel.MatchedStyleResult(matchedRules,inherited,pseudoElements);
        }
        return this._agent.getMatchedStylesForNode(nodeId, excludePseudo, excludeInherited, callback.bind(this));
    },
    computedStylePromise: function(nodeId) 
    {
        return this._styleLoader.computedStylePromise(nodeId);
    },
    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 ? WebInspector.CSSStyleDeclaration.parsePayload(this, inlinePayload) : null ;
            var attributesStyle = attributesStylePayload ? WebInspector.CSSStyleDeclaration.parsePayload(this, attributesStylePayload) : null ;
            return new WebInspector.CSSStyleModel.InlineStyleResult(inlineStyle,attributesStyle);
        }
        return this._agent.getInlineStylesForNode(nodeId, callback.bind(this));
    },
    forcePseudoState: function(node, pseudoClass, enable) 
    {
        var pseudoClasses = node.getUserProperty(WebInspector.CSSStyleModel.PseudoStatePropertyName) || [];
        if (enable) {
            if (pseudoClasses.indexOf(pseudoClass) >= 0)
                return false;
            pseudoClasses.push(pseudoClass);
            node.setUserProperty(WebInspector.CSSStyleModel.PseudoStatePropertyName, pseudoClasses);
        } else {
            if (pseudoClasses.indexOf(pseudoClass) < 0)
                return false;
            pseudoClasses.remove(pseudoClass);
            if (!pseudoClasses.length)
                node.removeUserProperty(WebInspector.CSSStyleModel.PseudoStatePropertyName);
        }
        this._agent.forcePseudoState(node.id, pseudoClasses);
        this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.PseudoStateForced, {
            node: node,
            pseudoClass: pseudoClass,
            enable: enable
        });
        return true;
    },
    setRuleSelector: function(rule, nodeId, newSelector, userCallback) 
    {
        function callback(error, rulePayload) 
        {
            if (error || !rulePayload)
                return null ;
            this._domModel.markUndoableState();
            return rulePayload;
        }
        if (!rule.styleSheetId)
            throw "No rule stylesheet id";
        WebInspector.userMetrics.StyleRuleEdited.record();
        this._agent.setRuleSelector(rule.styleSheetId, rule.selectorRange, newSelector, callback.bind(this)).then(this._computeMatchingSelectors.bind(this, nodeId)).catchException(null ).then(userCallback);
    },
    setMediaText: function(media, newMediaText, userCallback) 
    {
        function parsePayload(error, mediaPayload) 
        {
            if (!mediaPayload)
                return null ;
            this._domModel.markUndoableState();
            return WebInspector.CSSMedia.parsePayload(this, mediaPayload);
        }
        console.assert(!!media.parentStyleSheetId);
        WebInspector.userMetrics.StyleRuleEdited.record();
        this._agent.setMediaText(media.parentStyleSheetId, media.range, newMediaText, parsePayload.bind(this)).catchException(null ).then(userCallback);
    },
    _computeMatchingSelectors: function(nodeId, rulePayload) 
    {
        var ownerDocumentId = this._ownerDocumentId(nodeId);
        if (!ownerDocumentId || !rulePayload)
            return Promise.resolve((null ));
        var rule = WebInspector.CSSRule.parsePayload(this, rulePayload);
        var matchingSelectors = [];
        var allSelectorsBarrier = new CallbackBarrier();
        for (var i = 0; i < rule.selectors.length; ++i) {
            var selector = rule.selectors[i];
            var boundCallback = allSelectorsBarrier.createCallback(selectorQueried.bind(null , i, nodeId, matchingSelectors));
            this._domModel.querySelectorAll(ownerDocumentId, selector.value, boundCallback);
        }
        return new Promise(promiseConstructor);
        function promiseConstructor(resolve) 
        {
            allSelectorsBarrier.callWhenDone(function() {
                rule.matchingSelectors = matchingSelectors;
                resolve(rule);
            }
            );
        }
        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(this._computeMatchingSelectors.bind(this, node.id)).catchException(null ).then(userCallback);
        function parsePayload(error, rulePayload) 
        {
            if (error || !rulePayload)
                return null ;
            this._domModel.markUndoableState();
            return rulePayload;
        }
    },
    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) 
    {
        if (!styleSheetId || !this.hasEventListeners(WebInspector.CSSStyleModel.Events.StyleSheetChanged))
            return;
        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 && majorChange)
                this._domModel.markUndoableState();
            return error;
        }
    },
    _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]);
    },
    _suspendStateChanged: function() 
    {
        if (WebInspector.targetManager.allTargetsSuspended()) {
            this._agent.disable();
            this._isEnabled = false;
        } else {
            this._resetStyleSheets();
            this._agent.enable().then(this._wasEnabled.bind(this));
        }
    },
    __proto__: WebInspector.SDKModel.prototype
}
WebInspector.CSSLocation = function(cssModel, styleSheetId, url, lineNumber, columnNumber) 
{
    WebInspector.SDKObject.call(this, cssModel.target());
    this._cssModel = cssModel;
    this.styleSheetId = styleSheetId;
    this.url = url;
    this.lineNumber = lineNumber;
    this.columnNumber = columnNumber || 0;
}
WebInspector.CSSLocation.prototype = {
    cssModel: function() 
    {
        return this._cssModel;
    },
    __proto__: WebInspector.SDKObject.prototype
}
WebInspector.CSSStyleDeclaration = function(cssModel, payload) 
{
    this._cssModel = cssModel;
    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._livePropertyMap = {};
    this._allProperties = [];
    this.__disabledProperties = {};
    var payloadPropertyCount = payload.cssProperties.length;
    for (var i = 0; i < payloadPropertyCount; ++i) {
        var property = WebInspector.CSSProperty.parsePayload(this, i, payload.cssProperties[i]);
        this._allProperties.push(property);
    }
    this._computeActiveProperties();
    var propertyIndex = 0;
    for (var i = 0; i < this._allProperties.length; ++i) {
        var property = this._allProperties[i];
        if (property.disabled)
            this.__disabledProperties[i] = property;
        if (!property.active && !property.styleBased)
            continue;var name = property.name;
        this[propertyIndex] = name;
        this._livePropertyMap[name] = property;
        ++propertyIndex;
    }
    this.length = propertyIndex;
    if ("cssText" in payload)
        this.cssText = payload.cssText;
}
WebInspector.CSSStyleDeclaration.createDummyStyle = function(cssModel) 
{
    var dummyPayload = {
        shorthandEntries: [],
        cssProperties: []
    };
    return new WebInspector.CSSStyleDeclaration(cssModel,dummyPayload);
}
WebInspector.CSSStyleDeclaration.parsePayload = function(cssModel, payload) 
{
    return new WebInspector.CSSStyleDeclaration(cssModel,payload);
}
WebInspector.CSSStyleDeclaration.parseComputedStylePayload = function(cssModel, payload) 
{
    var newPayload = ({
        cssProperties: [],
        shorthandEntries: [],
        width: "",
        height: ""
    });
    if (payload)
        newPayload.cssProperties = (payload);
    return new WebInspector.CSSStyleDeclaration(cssModel,newPayload);
}
WebInspector.CSSStyleDeclaration.prototype = {
    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);
    },
    _computeActiveProperties: function() 
    {
        var activeProperties = {};
        for (var i = this._allProperties.length - 1; i >= 0; --i) {
            var property = this._allProperties[i];
            if (property.styleBased || property.disabled)
                continue;property._setActive(false);
            if (!property.parsedOk)
                continue;var canonicalName = WebInspector.CSSMetadata.canonicalPropertyName(property.name);
            var activeProperty = activeProperties[canonicalName];
            if (!activeProperty || (!activeProperty.important && property.important))
                activeProperties[canonicalName] = property;
        }
        for (var propertyName in activeProperties) {
            var property = activeProperties[propertyName];
            property._setActive(true);
        }
    },
    get allProperties() 
    {
        return this._allProperties;
    },
    getLiveProperty: function(name) 
    {
        return this._livePropertyMap[name] || null ;
    },
    getPropertyValue: function(name) 
    {
        var property = this._livePropertyMap[name];
        return property ? property.value : "";
    },
    isPropertyImplicit: function(name) 
    {
        var property = this._livePropertyMap[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._livePropertyMap[longhands[i]];
            if (property)
                result.push(property);
        }
        return result;
    },
    shorthandValue: function(shorthandProperty) 
    {
        return this._shorthandValues.get(shorthandProperty) || "";
    },
    shorthandIsImportant: function(shorthandProperty) 
    {
        return this._shorthandIsImportant.has(shorthandProperty);
    },
    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));
        property._setActive(true);
        return property;
    },
    setText: function(text, majorChange, userCallback) 
    {
        if (!this.styleSheetId) {
            userCallback(null );
            return;
        }
        function parsePayload(error, stylePayload) 
        {
            if (error || !stylePayload)
                return null ;
            if (majorChange)
                this._cssModel._domModel.markUndoableState();
            return WebInspector.CSSStyleDeclaration.parsePayload(this._cssModel, stylePayload);
        }
        this._cssModel._agent.setStyleText(this.styleSheetId, this.range.serializeToObject(), text, parsePayload.bind(this)).catchException(null ).then(userCallback)
    },
    insertPropertyAt: function(index, name, value, userCallback) 
    {
        this.newBlankProperty(index).setText(name + ": " + value + ";", false, true, userCallback);
    },
    appendProperty: function(name, value, userCallback) 
    {
        this.insertPropertyAt(this.allProperties.length, name, value, userCallback);
    }
}
WebInspector.CSSRuleSelector = function(payload) 
{
    this.value = payload.value;
    if (payload.range)
        this.range = WebInspector.TextRange.fromObject(payload.range);
}
WebInspector.CSSRuleSelector.parsePayload = function(payload) 
{
    return new WebInspector.CSSRuleSelector(payload);
}
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 = [];
    for (var i = 0; i < payload.selectorList.selectors.length; ++i) {
        var selectorPayload = payload.selectorList.selectors[i];
        this.selectors.push(WebInspector.CSSRuleSelector.parsePayload(selectorPayload));
    }
    this.selectorText = this.selectors.select("value").join(", ");
    var firstRange = this.selectors[0].range;
    if (firstRange) {
        var lastRange = this.selectors.peekLast().range;
        this.selectorRange = new WebInspector.TextRange(firstRange.startLine,firstRange.startColumn,lastRange.endLine,lastRange.endColumn);
    }
    if (this.styleSheetId) {
        var styleSheetHeader = cssModel.styleSheetHeaderForId(this.styleSheetId);
        this.sourceURL = styleSheetHeader.sourceURL;
    }
    this.origin = payload.origin;
    this.style = WebInspector.CSSStyleDeclaration.parsePayload(this._cssModel, payload.style);
    this.style.parentRule = this;
    if (payload.media)
        this.media = WebInspector.CSSMedia.parseMediaArrayPayload(cssModel, payload.media);
    this._setFrameId();
}
WebInspector.CSSRule.parsePayload = function(cssModel, payload, matchingIndices) 
{
    return new WebInspector.CSSRule(cssModel,payload,matchingIndices);
}
WebInspector.CSSRule.prototype = {
    sourceStyleSheetEdited: function(styleSheetId, oldRange, newRange) 
    {
        this._sourceStyleSheetEditedWithMedia(styleSheetId, oldRange, newRange, null , null );
    },
    _sourceStyleSheetEditedWithMedia: function(styleSheetId, oldRange, newRange, oldMedia, newMedia) 
    {
        if (this.styleSheetId === styleSheetId) {
            if (this.selectorRange)
                this.selectorRange = this.selectorRange.rebaseAfterTextEdit(oldRange, newRange);
            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);
    },
    _setFrameId: function() 
    {
        if (!this.styleSheetId)
            return;
        var styleSheetHeader = this._cssModel.styleSheetHeaderForId(this.styleSheetId);
        this.frameId = styleSheetHeader.frameId;
    },
    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);
    },
    get isUserAgent() 
    {
        return this.origin === "user-agent";
    },
    get isInjected() 
    {
        return this.origin === "injected";
    },
    get isViaInspector() 
    {
        return this.origin === "inspector";
    },
    get isRegular() 
    {
        return this.origin === "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 ;
}
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" : "") + ";";
    },
    get isLive() 
    {
        return this.active || this.styleBased;
    },
    get active() 
    {
        return typeof this._active === "boolean" && this._active;
    },
    get styleBased() 
    {
        return !this.range;
    },
    get inactive() 
    {
        return typeof this._active === "boolean" && !this._active;
    },
    setText: function(propertyText, majorChange, overwrite, userCallback) 
    {
        if (!this.ownerStyle)
            throw "No ownerStyle for property";
        if (!this.ownerStyle.styleSheetId)
            throw "No owner style id";
        if (!this.range || !this.ownerStyle.range)
            throw "Style not editable";
        if (majorChange)
            WebInspector.userMetrics.StyleRuleEdited.record();
        if (overwrite && propertyText === this.propertyText) {
            if (majorChange)
                this.ownerStyle._cssModel._domModel.markUndoableState();
            if (userCallback)
                userCallback(this.ownerStyle);
            return;
        }
        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 endIntentation = this.ownerStyle.cssText ? indentation.substring(0, this.ownerStyle.range.endColumn) : "";
        var newStyleText = range.replaceInText(this.ownerStyle.cssText || "", ";" + propertyText);
        this._formatStyle(newStyleText, indentation, endIntentation, setStyleText.bind(this));
        function setStyleText(styleText) 
        {
            this.ownerStyle.setText(styleText, majorChange, callback);
        }
        function callback(style) 
        {
            if (userCallback)
                userCallback(style);
        }
        function enabledCallback(style) 
        {
            if (userCallback)
                userCallback(style);
        }
    },
    _formatStyle: function(styleText, indentation, endIndentation, callback) 
    {
        self.runtime.instancePromise(WebInspector.TokenizerFactory).then(processTokens);
        var result = "";
        function processTokens(tokenizerFactory) 
        {
            var tokenize = tokenizerFactory.createTokenizer("text/css");
            tokenize("*{" + styleText + "}", processToken);
            result = result.slice(0, result.length - 1);
            callback(result + (indentation ? "\n" + endIndentation : ""));
        }
        var lastWasSemicolon = true;
        var lastWasMeta = false;
        var insideProperty = false;
        function processToken(token, tokenType, column, newColumn) 
        {
            if (newColumn <= 2)
                return;
            var isSemicolon = token === ";";
            if (isSemicolon && lastWasSemicolon)
                return;
            lastWasSemicolon = isSemicolon || (lastWasSemicolon && tokenType && tokenType.includes("css-comment")) || (lastWasSemicolon && !token.trim());
            if (!indentation) {
                result += token;
                return;
            }
            if (!insideProperty && !token.trim())
                return;
            if (tokenType && tokenType.includes("css-comment") && token.includes(":") && token.includes(";")) {
                result += "\n" + indentation + token;
                insideProperty = false;
                return;
            }
            if (isSemicolon)
                insideProperty = false;
            if (tokenType && (tokenType.includes("css-meta") || (tokenType.includes("css-property") && !lastWasMeta))) {
                result += "\n" + indentation;
                insideProperty = true;
            }
            result += token;
            lastWasMeta = tokenType && tokenType.includes("css-meta");
        }
    },
    _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, userCallback);
    },
    setDisabled: function(disabled, userCallback) 
    {
        if (!this.ownerStyle && userCallback)
            userCallback(null );
        if (disabled === this.disabled) {
            if (userCallback)
                userCallback(this.ownerStyle);
            return;
        }
        if (disabled)
            this.setText("/* " + this.text + " */", true, true, userCallback);
        else
            this.setText(this.text.substring(2, this.text.length - 2).trim(), true, true, userCallback);
    }
}
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() 
    {
        if (!this.header() || this.lineNumberInSource() === undefined)
            return null ;
        var lineNumber = Number(this.lineNumberInSource());
        return new WebInspector.CSSLocation(this._cssModel,this.header().id,this.sourceURL,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 sourceURLRegex = /\n[\040\t]*\/\*[#@][\040\t]sourceURL=[\040\t]*([^\s]*)[\040\t]*\*\/[\040\t]*$/mg;
        return text.replace(sourceURLRegex, "");
    },
    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, extractProtocolError);
        function extractProtocolError(error) 
        {
            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);
    },
}
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.bind(this)).then(cleanUp.bind(this));
        return this._nodeIdToPromise[nodeId];
        function parsePayload(error, computedPayload) 
        {
            return !error && computedPayload ? WebInspector.CSSStyleDeclaration.parseComputedStylePayload(this._cssModel, computedPayload) : null ;
        }
        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(matchedRules, inherited, pseudoElements) 
{
    this.matchedCSSRules = matchedRules;
    this.inherited = inherited;
    this.pseudoElements = pseudoElements;
}
WebInspector.CSSStyleModel.PseudoElementMatches = function(pseudoId, rules) 
{
    this.pseudoId = pseudoId;
    this.rules = rules;
}
WebInspector.CSSStyleModel.InheritedMatches = function(inlineStyle, matchedRules) 
{
    this.inlineStyle = inlineStyle;
    this.matchedCSSRules = matchedRules;
}
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._shadowRoots = [];
    this._attributes = [];
    this._attributesMap = {};
    if (payload.attributes)
        this._setAttributesPayload(payload.attributes);
    this._userProperties = {};
    this._descendantUserPropertyCounters = {};
    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",
    Author: "author"
}
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 === WebInspector.DOMNode.ShadowRootTypes.UserAgent ? " (user-agent)" : "");
        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 ;
        node._updateChildUserPropertyCountsOnRemoval(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.ownerDocument && !!this.ownerDocument.xmlVersion;
    },
    _updateChildUserPropertyCountsOnRemoval: function(parentNode) 
    {
        var result = {};
        if (this._userProperties) {
            for (var name in this._userProperties)
                result[name] = (result[name] || 0) + 1;
        }
        if (this._descendantUserPropertyCounters) {
            for (var name in this._descendantUserPropertyCounters) {
                var counter = this._descendantUserPropertyCounters[name];
                result[name] = (result[name] || 0) + counter;
            }
        }
        for (var name in result)
            parentNode._updateDescendantUserPropertyCount(name, -result[name]);
    },
    _updateDescendantUserPropertyCount: function(name, delta) 
    {
        if (!this._descendantUserPropertyCounters.hasOwnProperty(name))
            this._descendantUserPropertyCounters[name] = 0;
        this._descendantUserPropertyCounters[name] += delta;
        if (!this._descendantUserPropertyCounters[name])
            delete this._descendantUserPropertyCounters[name];
        if (this.parentNode)
            this.parentNode._updateDescendantUserPropertyCount(name, delta);
    },
    setUserProperty: function(name, value) 
    {
        if (value === null ) {
            this.removeUserProperty(name);
            return;
        }
        if (this.parentNode && !this._userProperties.hasOwnProperty(name))
            this.parentNode._updateDescendantUserPropertyCount(name, 1);
        this._userProperties[name] = value;
    },
    removeUserProperty: function(name) 
    {
        if (!this._userProperties.hasOwnProperty(name))
            return;
        delete this._userProperties[name];
        if (this.parentNode)
            this.parentNode._updateDescendantUserPropertyCount(name, -1);
    },
    getUserProperty: function(name) 
    {
        return (this._userProperties && this._userProperties[name]) || null ;
    },
    descendantUserPropertyCount: function(name) 
    {
        return this._descendantUserPropertyCounters && this._descendantUserPropertyCounters[name] ? this._descendantUserPropertyCounters[name] : 0;
    },
    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 ));
        }
    },
    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.xmlVersion = payload.xmlVersion;
    this._listeners = {};
}
WebInspector.DOMDocument.prototype = {
    __proto__: WebInspector.DOMNode.prototype
}
WebInspector.DOMModel = function(target) {
    WebInspector.SDKModel.call(this, WebInspector.DOMModel, target);
    this._agent = target.domAgent();
    WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged, this._suspendStateChanged, this);
    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",
    NodeRemoved: "NodeRemoved",
    DocumentUpdated: "DocumentUpdated",
    ChildNodeCountUpdated: "ChildNodeCountUpdated",
    UndoRedoRequested: "UndoRedoRequested",
    UndoRedoCompleted: "UndoRedoCompleted",
    DistributedNodesChanged: "DistributedNodesChanged",
    ModelSuspended: "ModelSuspended",
    InspectModeWillBeToggled: "InspectModeWillBeToggled"
}
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() 
    {
        if (!this.hasEventListeners(WebInspector.DOMModel.Events.DOMMutated))
            return;
        this._lastMutationId = (this._lastMutationId || 0) + 1;
        Promise.resolve().then(callObserve.bind(this, this._lastMutationId));
        function callObserve(mutationId) 
        {
            if (!this.hasEventListeners(WebInspector.DOMModel.Events.DOMMutated) || this._lastMutationId !== mutationId)
                return;
            this.dispatchEventToListeners(WebInspector.DOMModel.Events.DOMMutated);
        }
    },
    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();
    },
    _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();
    },
    _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();
                }
            }
        }
        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();
    },
    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();
    },
    _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();
    },
    _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();
    },
    _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();
    },
    _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();
    },
    _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();
    },
    _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();
    },
    _distributedNodesUpdated: function(insertionPointId, distributedNodes) 
    {
        var insertionPoint = this._idToDOMNode[insertionPointId];
        if (!insertionPoint)
            return;
        insertionPoint._setDistributedNodePayloads(distributedNodes);
        this.dispatchEventToListeners(WebInspector.DOMModel.Events.DistributedNodesChanged, insertionPoint);
        this._scheduleMutationEvent();
    },
    _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
        };
        if (this._hideDOMNodeHighlightTimeout) {
            clearTimeout(this._hideDOMNodeHighlightTimeout);
            delete this._hideDOMNodeHighlightTimeout;
        }
        var highlightConfig = this._buildHighlightConfig(config.mode);
        if (typeof config.showInfo !== "undefined")
            highlightConfig.showInfo = config.showInfo;
        this._highlighter.highlightDOMNode(this.nodeForId(nodeId || 0), highlightConfig, backendNodeId, objectId);
    },
    highlightDOMNodeForTwoSeconds: function(nodeId) 
    {
        this.highlightDOMNode(nodeId);
        if (!Runtime.experiments.isEnabled("layoutEditor"))
            this._hideDOMNodeHighlightTimeout = setTimeout(WebInspector.DOMModel.hideDOMNodeHighlight.bind(WebInspector.DOMModel), 2000);
    },
    highlightFrame: function(frameId) 
    {
        this._highlighter.highlightFrame(frameId);
    },
    setInspectModeEnabled: function(enabled, inspectUAShadowDOM, callback) 
    {
        function onDocumentAvailable() 
        {
            this.dispatchEventToListeners(WebInspector.DOMModel.Events.InspectModeWillBeToggled, enabled);
            this._highlighter.setInspectModeEnabled(enabled, inspectUAShadowDOM, 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.showLayoutEditor = Runtime.experiments.isEnabled("layoutEditor");
        }
        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 );
    },
    _suspendStateChanged: function() 
    {
        if (WebInspector.targetManager.allTargetsSuspended()) {
            this._agent.disable();
        } else {
            this._agent.enable();
            this._setDocument(null );
        }
    },
    __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);
    }
}
WebInspector.DOMNodeHighlighter = function() {}
WebInspector.DOMNodeHighlighter.prototype = {
    highlightDOMNode: function(node, config, backendNodeId, objectId) {},
    setInspectModeEnabled: function(enabled, inspectUAShadowDOM, 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();
    },
    setInspectModeEnabled: function(enabled, inspectUAShadowDOM, config, callback) 
    {
        this._agent.setInspectModeEnabled(enabled, inspectUAShadowDOM, 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.SuspendStateChanged, this._suspendStateChanged, this);
    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() 
    {
        if (this._debuggerEnabled)
            return;
        this._agent.enable();
        this._debuggerEnabled = true;
        if (this._hasStaleState) {
            this._globalObjectCleared();
            this._hasStaleState = false;
        }
        this._pauseOnExceptionStateChanged();
        this.asyncStackTracesStateChanged();
        this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerWasEnabled);
    },
    disableDebugger: function() 
    {
        if (!this._debuggerEnabled)
            return;
        this._hasStaleState = true;
        this._agent.disable();
        this._debuggerEnabled = false;
        this._isPausing = false;
        this.asyncStackTracesStateChanged();
        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() && !WebInspector.targetManager.allTargetsSuspended();
        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, isContentScript, isInternalScript, sourceMapURL, hasSourceURL, hasSyntaxError) 
    {
        var script = new WebInspector.Script(this,scriptId,sourceURL,startLine,startColumn,endLine,endColumn,isContentScript,isInternalScript,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));
    },
    callStackModified: function(newCallFrames, details, asyncStackTrace) 
    {
        if (details && details["stack_update_needs_step_in"])
            this.stepInto();
        else if (newCallFrames && newCallFrames.length)
            this._pausedScript(newCallFrames, this._debuggerPausedDetails.reason, this._debuggerPausedDetails.auxData, this._debuggerPausedDetails.breakpointIds, asyncStackTrace);
    },
    _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);
    },
    _suspendStateChanged: function() 
    {
        if (WebInspector.targetManager.allTargetsSuspended())
            this.disableDebugger();
        else
            this.enableDebugger();
    },
    __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, isContentScript, isInternalScript, sourceMapURL, hasSourceURL) 
    {
        this._debuggerModel._parsedScriptSource(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, !!isContentScript, !!isInternalScript, sourceMapURL, hasSourceURL, false);
    },
    scriptFailedToParse: function(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, sourceMapURL, hasSourceURL) 
    {
        this._debuggerModel._parsedScriptSource(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, !!isContentScript, !!isInternalScript, 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, details, asyncStackTrace) 
        {
            if (!error)
                this.debuggerModel.callStackModified(callFrames, details, asyncStackTrace);
            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._ordinal = ordinal;
}
WebInspector.DebuggerModel.Scope.prototype = {
    type: function() 
    {
        return this._type;
    },
    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.TracingLayerPayload;
WebInspector.TracingLayerTile;
WebInspector.LayerTreeModel = function(target) 
{
    WebInspector.SDKModel.call(this, WebInspector.LayerTreeModel, target);
    target.registerLayerTreeDispatcher(new WebInspector.LayerTreeDispatcher(this));
    WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.MainFrameNavigated, this._onMainFrameNavigated, this);
    this._layerTree = null ;
}
WebInspector.LayerTreeModel.Events = {
    LayerTreeChanged: "LayerTreeChanged",
    LayerPainted: "LayerPainted",
}
WebInspector.LayerTreeModel.ScrollRectType = {
    NonFastScrollable: {
        name: "NonFastScrollable",
        description: "Non fast scrollable"
    },
    TouchEventHandler: {
        name: "TouchEventHandler",
        description: "Touch event handler"
    },
    WheelEventHandler: {
        name: "WheelEventHandler",
        description: "Wheel event handler"
    },
    RepaintsOnScroll: {
        name: "RepaintsOnScroll",
        description: "Repaints on scroll"
    }
}
WebInspector.LayerTreeModel.prototype = {
    disable: function() 
    {
        if (!this._enabled)
            return;
        this._enabled = false;
        this._layerTree = null ;
        this.target().layerTreeAgent().disable();
    },
    enable: function() 
    {
        if (this._enabled)
            return;
        this._enabled = true;
        this._forceEnable();
    },
    _forceEnable: function() 
    {
        this._layerTree = new WebInspector.AgentLayerTree(this.target());
        this._lastPaintRectByLayerId = {};
        this.target().layerTreeAgent().enable();
    },
    setLayerTree: function(layerTree) 
    {
        this.disable();
        this._layerTree = layerTree;
        this.dispatchEventToListeners(WebInspector.LayerTreeModel.Events.LayerTreeChanged);
    },
    layerTree: function() 
    {
        return this._layerTree;
    },
    _layerTreeChanged: function(layers) 
    {
        if (!this._enabled)
            return;
        var layerTree = (this._layerTree);
        layerTree.setLayers(layers, onLayersSet.bind(this));
        function onLayersSet() 
        {
            for (var layerId in this._lastPaintRectByLayerId) {
                var lastPaintRect = this._lastPaintRectByLayerId[layerId];
                var layer = layerTree.layerById(layerId);
                if (layer)
                    layer._lastPaintRect = lastPaintRect;
            }
            this._lastPaintRectByLayerId = {};
            this.dispatchEventToListeners(WebInspector.LayerTreeModel.Events.LayerTreeChanged);
        }
    },
    _layerPainted: function(layerId, clipRect) 
    {
        if (!this._enabled)
            return;
        var layerTree = (this._layerTree);
        var layer = layerTree.layerById(layerId);
        if (!layer) {
            this._lastPaintRectByLayerId[layerId] = clipRect;
            return;
        }
        layer._didPaint(clipRect);
        this.dispatchEventToListeners(WebInspector.LayerTreeModel.Events.LayerPainted, layer);
    },
    _onMainFrameNavigated: function() 
    {
        if (this._enabled)
            this._forceEnable();
    },
    __proto__: WebInspector.SDKModel.prototype
}
WebInspector.LayerTreeBase = function(target) 
{
    this._target = target;
    this._domModel = target ? WebInspector.DOMModel.fromTarget(target) : null ;
    this._layersById = {};
    this._backendNodeIdToNode = new Map();
    this._reset();
}
WebInspector.LayerTreeBase.prototype = {
    _reset: function() 
    {
        this._root = null ;
        this._contentRoot = null ;
    },
    target: function() 
    {
        return this._target;
    },
    root: function() 
    {
        return this._root;
    },
    contentRoot: function() 
    {
        return this._contentRoot;
    },
    forEachLayer: function(callback, root) 
    {
        if (!root) {
            root = this.root();
            if (!root)
                return false;
        }
        return callback(root) || root.children().some(this.forEachLayer.bind(this, callback));
    },
    layerById: function(id) 
    {
        return this._layersById[id] || null ;
    },
    _resolveBackendNodeIds: function(requestedNodeIds, callback) 
    {
        if (!requestedNodeIds.size || !this._domModel) {
            callback();
            return;
        }
        if (this._domModel)
            this._domModel.pushNodesByBackendIdsToFrontend(requestedNodeIds, populateBackendNodeMap.bind(this));
        function populateBackendNodeMap(nodesMap) 
        {
            if (nodesMap) {
                for (var entry of nodesMap)
                    this._backendNodeIdToNode.set(entry[0], entry[1]);
            }
            callback();
        }
    },
    setViewportSize: function(viewportSize) 
    {
        this._viewportSize = viewportSize;
    },
    viewportSize: function() 
    {
        return this._viewportSize;
    },
    _nodeForId: function(id) 
    {
        return this._domModel ? this._domModel.nodeForId(id) : null ;
    }
}
WebInspector.TracingLayerTree = function(target) 
{
    WebInspector.LayerTreeBase.call(this, target);
    this._tileById = new Map();
}
WebInspector.TracingLayerTree.prototype = {
    setLayers: function(root, callback) 
    {
        var idsToResolve = new Set();
        this._extractNodeIdsToResolve(idsToResolve, {}, root);
        this._resolveBackendNodeIds(idsToResolve, onBackendNodeIdsResolved.bind(this));
        function onBackendNodeIdsResolved() 
        {
            var oldLayersById = this._layersById;
            this._layersById = {};
            this._contentRoot = null ;
            this._root = this._innerSetLayers(oldLayersById, root);
            callback();
        }
    },
    setTiles: function(tiles) 
    {
        this._tileById = new Map();
        for (var tile of tiles)
            this._tileById.set(tile.id, tile);
    },
    tileById: function(id) 
    {
        return this._tileById.get(id) || null ;
    },
    _innerSetLayers: function(oldLayersById, payload) 
    {
        var layer = (oldLayersById[payload.layer_id]);
        if (layer)
            layer._reset(payload);
        else
            layer = new WebInspector.TracingLayer(payload);
        this._layersById[payload.layer_id] = layer;
        if (payload.owner_node)
            layer._setNode(this._backendNodeIdToNode.get(payload.owner_node) || null );
        if (!this._contentRoot && layer.drawsContent())
            this._contentRoot = layer;
        for (var i = 0; payload.children && i < payload.children.length; ++i)
            layer.addChild(this._innerSetLayers(oldLayersById, payload.children[i]));
        return layer;
    },
    _extractNodeIdsToResolve: function(nodeIdsToResolve, seenNodeIds, payload) 
    {
        var backendNodeId = payload.owner_node;
        if (backendNodeId && !this._backendNodeIdToNode[backendNodeId])
            nodeIdsToResolve.add(backendNodeId);
        for (var i = 0; payload.children && i < payload.children.length; ++i)
            this._extractNodeIdsToResolve(nodeIdsToResolve, seenNodeIds, payload.children[i]);
    },
    __proto__: WebInspector.LayerTreeBase.prototype
}
WebInspector.AgentLayerTree = function(target) 
{
    WebInspector.LayerTreeBase.call(this, target);
}
WebInspector.AgentLayerTree.prototype = {
    setLayers: function(payload, callback) 
    {
        if (!payload) {
            onBackendNodeIdsResolved.call(this);
            return;
        }
        var idsToResolve = new Set();
        for (var i = 0; i < payload.length; ++i) {
            var backendNodeId = payload[i].backendNodeId;
            if (!backendNodeId || this._backendNodeIdToNode.has(backendNodeId))
                continue;idsToResolve.add(backendNodeId);
        }
        this._resolveBackendNodeIds(idsToResolve, onBackendNodeIdsResolved.bind(this));
        function onBackendNodeIdsResolved() 
        {
            this._innerSetLayers(payload);
            callback();
        }
    },
    _innerSetLayers: function(layers) 
    {
        this._reset();
        if (!layers)
            return;
        var oldLayersById = this._layersById;
        this._layersById = {};
        for (var i = 0; i < layers.length; ++i) {
            var layerId = layers[i].layerId;
            var layer = oldLayersById[layerId];
            if (layer)
                layer._reset(layers[i]);
            else
                layer = new WebInspector.AgentLayer(this._target,layers[i]);
            this._layersById[layerId] = layer;
            var backendNodeId = layers[i].backendNodeId;
            if (backendNodeId)
                layer._setNode(this._backendNodeIdToNode.get(backendNodeId));
            if (!this._contentRoot && layer.drawsContent())
                this._contentRoot = layer;
            var parentId = layer.parentId();
            if (parentId) {
                var parent = this._layersById[parentId];
                if (!parent)
                    console.assert(parent, "missing parent " + parentId + " for layer " + layerId);
                parent.addChild(layer);
            } else {
                if (this._root)
                    console.assert(false, "Multiple root layers");
                this._root = layer;
            }
        }
        if (this._root)
            this._root._calculateQuad(new WebKitCSSMatrix());
    },
    __proto__: WebInspector.LayerTreeBase.prototype
}
WebInspector.Layer = function() 
{}
WebInspector.Layer.prototype = {
    id: function() {},
    parentId: function() {},
    parent: function() {},
    isRoot: function() {},
    children: function() {},
    addChild: function(child) {},
    node: function() {},
    nodeForSelfOrAncestor: function() {},
    offsetX: function() {},
    offsetY: function() {},
    width: function() {},
    height: function() {},
    transform: function() {},
    quad: function() {},
    anchorPoint: function() {},
    invisible: function() {},
    paintCount: function() {},
    lastPaintRect: function() {},
    scrollRects: function() {},
    gpuMemoryUsage: function() {},
    requestCompositingReasons: function(callback) {},
    drawsContent: function() {}
}
WebInspector.AgentLayer = function(target, layerPayload) 
{
    this._target = target;
    this._reset(layerPayload);
}
WebInspector.AgentLayer.prototype = {
    id: function() 
    {
        return this._layerPayload.layerId;
    },
    parentId: function() 
    {
        return this._layerPayload.parentLayerId;
    },
    parent: function() 
    {
        return this._parent;
    },
    isRoot: function() 
    {
        return !this.parentId();
    },
    children: function() 
    {
        return this._children;
    },
    addChild: function(child) 
    {
        if (child._parent)
            console.assert(false, "Child already has a parent");
        this._children.push(child);
        child._parent = this;
    },
    _setNode: function(node) 
    {
        this._node = node;
    },
    node: function() 
    {
        return this._node;
    },
    nodeForSelfOrAncestor: function() 
    {
        for (var layer = this; layer; layer = layer._parent) {
            if (layer._node)
                return layer._node;
        }
        return null ;
    },
    offsetX: function() 
    {
        return this._layerPayload.offsetX;
    },
    offsetY: function() 
    {
        return this._layerPayload.offsetY;
    },
    width: function() 
    {
        return this._layerPayload.width;
    },
    height: function() 
    {
        return this._layerPayload.height;
    },
    transform: function() 
    {
        return this._layerPayload.transform;
    },
    quad: function() 
    {
        return this._quad;
    },
    anchorPoint: function() 
    {
        return [this._layerPayload.anchorX || 0, this._layerPayload.anchorY || 0, this._layerPayload.anchorZ || 0, ];
    },
    invisible: function() 
    {
        return this._layerPayload.invisible;
    },
    paintCount: function() 
    {
        return this._paintCount || this._layerPayload.paintCount;
    },
    lastPaintRect: function() 
    {
        return this._lastPaintRect;
    },
    scrollRects: function() 
    {
        return this._scrollRects;
    },
    requestCompositingReasons: function(callback) 
    {
        if (!this._target) {
            callback([]);
            return;
        }
        var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "LayerTreeAgent.reasonsForCompositingLayer(): ", undefined, []);
        this._target.layerTreeAgent().compositingReasons(this.id(), wrappedCallback);
    },
    drawsContent: function() 
    {
        return this._layerPayload.drawsContent;
    },
    gpuMemoryUsage: function() 
    {
        var bytesPerPixel = 4;
        return this.drawsContent() ? this.width() * this.height() * bytesPerPixel : 0;
    },
    requestSnapshot: function(callback) 
    {
        if (!this._target) {
            callback();
            return;
        }
        var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "LayerTreeAgent.makeSnapshot(): ", WebInspector.PaintProfilerSnapshot.bind(null , this._target));
        this._target.layerTreeAgent().makeSnapshot(this.id(), wrappedCallback);
    },
    _didPaint: function(rect) 
    {
        this._lastPaintRect = rect;
        this._paintCount = this.paintCount() + 1;
        this._image = null ;
    },
    _reset: function(layerPayload) 
    {
        this._node = null ;
        this._children = [];
        this._parent = null ;
        this._paintCount = 0;
        this._layerPayload = layerPayload;
        this._image = null ;
        this._scrollRects = this._layerPayload.scrollRects || [];
    },
    _matrixFromArray: function(a) 
    {
        function toFixed9(x) {
            return x.toFixed(9);
        }
        return new WebKitCSSMatrix("matrix3d(" + a.map(toFixed9).join(",") + ")");
    },
    _calculateTransformToViewport: function(parentTransform) 
    {
        var offsetMatrix = new WebKitCSSMatrix().translate(this._layerPayload.offsetX, this._layerPayload.offsetY);
        var matrix = offsetMatrix;
        if (this._layerPayload.transform) {
            var transformMatrix = this._matrixFromArray(this._layerPayload.transform);
            var anchorVector = new WebInspector.Geometry.Vector(this._layerPayload.width * this.anchorPoint()[0],this._layerPayload.height * this.anchorPoint()[1],this.anchorPoint()[2]);
            var anchorPoint = WebInspector.Geometry.multiplyVectorByMatrixAndNormalize(anchorVector, matrix);
            var anchorMatrix = new WebKitCSSMatrix().translate(-anchorPoint.x, -anchorPoint.y, -anchorPoint.z);
            matrix = anchorMatrix.inverse().multiply(transformMatrix.multiply(anchorMatrix.multiply(matrix)));
        }
        matrix = parentTransform.multiply(matrix);
        return matrix;
    },
    _createVertexArrayForRect: function(width, height) 
    {
        return [0, 0, 0, width, 0, 0, width, height, 0, 0, height, 0];
    },
    _calculateQuad: function(parentTransform) 
    {
        var matrix = this._calculateTransformToViewport(parentTransform);
        this._quad = [];
        var vertices = this._createVertexArrayForRect(this._layerPayload.width, this._layerPayload.height);
        for (var i = 0; i < 4; ++i) {
            var point = WebInspector.Geometry.multiplyVectorByMatrixAndNormalize(new WebInspector.Geometry.Vector(vertices[i * 3],vertices[i * 3 + 1],vertices[i * 3 + 2]), matrix);
            this._quad.push(point.x, point.y);
        }
        function calculateQuadForLayer(layer) 
        {
            layer._calculateQuad(matrix);
        }
        this._children.forEach(calculateQuadForLayer);
    }
}
WebInspector.TracingLayer = function(payload) 
{
    this._reset(payload);
}
WebInspector.TracingLayer.prototype = {
    _reset: function(payload) 
    {
        this._node = null ;
        this._layerId = String(payload.layer_id);
        this._offsetX = payload.position[0];
        this._offsetY = payload.position[1];
        this._width = payload.bounds.width;
        this._height = payload.bounds.height;
        this._children = [];
        this._parentLayerId = null ;
        this._parent = null ;
        this._quad = payload.layer_quad || [];
        this._createScrollRects(payload);
        this._compositingReasons = payload.compositing_reasons || [];
        this._drawsContent = !!payload.draws_content;
        this._gpuMemoryUsage = payload.gpu_memory_usage;
    },
    id: function() 
    {
        return this._layerId;
    },
    parentId: function() 
    {
        return this._parentLayerId;
    },
    parent: function() 
    {
        return this._parent;
    },
    isRoot: function() 
    {
        return !this.parentId();
    },
    children: function() 
    {
        return this._children;
    },
    addChild: function(child) 
    {
        if (child._parent)
            console.assert(false, "Child already has a parent");
        this._children.push(child);
        child._parent = this;
        child._parentLayerId = this._layerId;
    },
    _setNode: function(node) 
    {
        this._node = node;
    },
    node: function() 
    {
        return this._node;
    },
    nodeForSelfOrAncestor: function() 
    {
        for (var layer = this; layer; layer = layer._parent) {
            if (layer._node)
                return layer._node;
        }
        return null ;
    },
    offsetX: function() 
    {
        return this._offsetX;
    },
    offsetY: function() 
    {
        return this._offsetY;
    },
    width: function() 
    {
        return this._width;
    },
    height: function() 
    {
        return this._height;
    },
    transform: function() 
    {
        return null ;
    },
    quad: function() 
    {
        return this._quad;
    },
    anchorPoint: function() 
    {
        return [0.5, 0.5, 0];
    },
    invisible: function() 
    {
        return false;
    },
    paintCount: function() 
    {
        return 0;
    },
    lastPaintRect: function() 
    {
        return null ;
    },
    scrollRects: function() 
    {
        return this._scrollRects;
    },
    gpuMemoryUsage: function() 
    {
        return this._gpuMemoryUsage;
    },
    _scrollRectsFromParams: function(params, type) 
    {
        return {
            rect: {
                x: params[0],
                y: params[1],
                width: params[2],
                height: params[3]
            },
            type: type
        };
    },
    _createScrollRects: function(payload) 
    {
        this._scrollRects = [];
        if (payload.non_fast_scrollable_region)
            this._scrollRects.push(this._scrollRectsFromParams(payload.non_fast_scrollable_region, WebInspector.LayerTreeModel.ScrollRectType.NonFastScrollable.name));
        if (payload.touch_event_handler_region)
            this._scrollRects.push(this._scrollRectsFromParams(payload.touch_event_handler_region, WebInspector.LayerTreeModel.ScrollRectType.TouchEventHandler.name));
        if (payload.wheel_event_handler_region)
            this._scrollRects.push(this._scrollRectsFromParams(payload.wheel_event_handler_region, WebInspector.LayerTreeModel.ScrollRectType.WheelEventHandler.name));
        if (payload.scroll_event_handler_region)
            this._scrollRects.push(this._scrollRectsFromParams(payload.scroll_event_handler_region, WebInspector.LayerTreeModel.ScrollRectType.RepaintsOnScroll.name));
    },
    requestCompositingReasons: function(callback) 
    {
        callback(this._compositingReasons);
    },
    drawsContent: function() 
    {
        return this._drawsContent;
    }
}
WebInspector.DeferredLayerTree = function(target) 
{
    this._target = target;
}
WebInspector.DeferredLayerTree.prototype = {
    resolve: function(callback) {},
    target: function() 
    {
        return this._target;
    }
};
WebInspector.LayerTreeDispatcher = function(layerTreeModel) 
{
    this._layerTreeModel = layerTreeModel;
}
WebInspector.LayerTreeDispatcher.prototype = {
    layerTreeDidChange: function(layers) 
    {
        this._layerTreeModel._layerTreeChanged(layers || null );
    },
    layerPainted: function(layerId, clipRect) 
    {
        this._layerTreeModel._layerPainted(layerId, clipRect);
    }
};
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);
    },
    registrations: function() 
    {
        return this._registrations;
    },
    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);
    },
    skipWaiting: function(versionId) 
    {
        this._agent.skipWaiting(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) 
    {
        new WebInspector.ServiceWorker(this,workerId,url);
    },
    _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) 
{
    this._manager = manager;
    this._agent = manager.target().serviceWorkerAgent();
    this._workerId = workerId;
    this._connection = new WebInspector.ServiceWorkerConnection(this._agent,workerId);
    this._url = url;
    var parsedURL = url.asParsedURL();
    this._name = parsedURL ? parsedURL.lastPathComponentWithFragment() : "#" + (++WebInspector.ServiceWorker._lastAnonymousTargetId);
    this._scope = parsedURL.host + parsedURL.folderPathComponents;
    var title = WebInspector.UIString("\u2699 %s", this._name);
    this._manager._workers.set(workerId, this);
    WebInspector.targetManager.createTarget(title, WebInspector.Target.Type.ServiceWorker, this._connection, manager.target(), targetCreated.bind(this));
    function targetCreated(target) 
    {
        if (!target) {
            this._manager._workers.delete(workerId);
            return;
        }
        this._manager.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.WorkersUpdated);
        target.runtimeAgent().run();
    }
}
WebInspector.ServiceWorker._lastAnonymousTargetId = 0;
WebInspector.ServiceWorker.prototype = {
    name: function() 
    {
        return this._name;
    },
    url: function() 
    {
        return this._url;
    },
    scope: function() 
    {
        return this._scope;
    },
    stop: function() 
    {
        this._agent.stop(this._workerId);
    },
    _closeConnection: function() 
    {
        this._connection._close();
    }
}
WebInspector.ServiceWorkerDispatcher = function(manager) 
{
    this._manager = manager;
}
WebInspector.ServiceWorkerDispatcher.prototype = {
    workerCreated: function(workerId, url) 
    {
        this._manager._workerCreated(workerId, url);
    },
    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.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;
    },
    _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;
    },
    _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.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 ;
    },
    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, callback);
        this._activeClient.tracingStarted();
    },
    stop: function() 
    {
        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._backingStorage = backingStorage;
    this.reset();
}
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.ConsoleEventCategory = "blink.console";
WebInspector.TracingModel.FrameLifecycleEventCategory = "cc,devtools";
WebInspector.TracingModel.DevToolsMetadataEvent = {
    TracingStartedInPage: "TracingStartedInPage",
    TracingSessionIdForWorker: "TracingSessionIdForWorker",
};
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._rendererMainThreadName = "CrRendererMain";
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 = {
    devtoolsPageMetadataEvents: function() 
    {
        return this._devtoolsPageMetadataEvents;
    },
    devtoolsWorkerMetadataEvents: function() 
    {
        return this._devtoolsWorkerMetadataEvents;
    },
    sessionId: function() 
    {
        return this._sessionId;
    },
    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._processMetadataEvents();
        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._sessionId = null ;
        this._devtoolsPageMetadataEvents = [];
        this._devtoolsWorkerMetadataEvents = [];
        this._backingStorage.reset();
        this._appendDelimiter = false;
        this._loadedFromFile = 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.name === WebInspector.TracingModel.DevToolsMetadataEvent.TracingStartedInPage && event.hasCategory(WebInspector.TracingModel.DevToolsMetadataEventCategory)) {
                this._devtoolsPageMetadataEvents.push(event);
            }
            if (event.name === WebInspector.TracingModel.DevToolsMetadataEvent.TracingSessionIdForWorker && event.hasCategory(WebInspector.TracingModel.DevToolsMetadataEventCategory)) {
                this._devtoolsWorkerMetadataEvents.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;
        }
    },
    _processMetadataEvents: function() 
    {
        this._devtoolsPageMetadataEvents.sort(WebInspector.TracingModel.Event.compareStartTime);
        if (!this._devtoolsPageMetadataEvents.length) {
            var pageMetaEvent = this._loadedFromFile ? this._makeMockPageMetadataEvent() : null ;
            if (!pageMetaEvent) {
                console.error(WebInspector.TracingModel.DevToolsMetadataEvent.TracingStartedInPage + " event not found.");
                return;
            }
            this._devtoolsPageMetadataEvents.push(pageMetaEvent);
        }
        var sessionId = this._devtoolsPageMetadataEvents[0].args["sessionId"] || this._devtoolsPageMetadataEvents[0].args["data"]["sessionId"];
        this._sessionId = sessionId;
        var mismatchingIds = {};
        function checkSessionId(event) 
        {
            var args = event.args;
            if (args["data"])
                args = args["data"];
            var id = args["sessionId"];
            if (id === sessionId)
                return true;
            mismatchingIds[id] = true;
            return false;
        }
        this._devtoolsPageMetadataEvents = this._devtoolsPageMetadataEvents.filter(checkSessionId);
        this._devtoolsWorkerMetadataEvents = this._devtoolsWorkerMetadataEvents.filter(checkSessionId);
        var idList = Object.keys(mismatchingIds);
        if (idList.length)
            WebInspector.console.error("Timeline recording was started in more than one page simultaneously. Session id mismatch: " + this._sessionId + " and " + idList + ".");
    },
    _makeMockPageMetadataEvent: function() 
    {
        var rendererMainThreadName = WebInspector.TracingModel._rendererMainThreadName;
        var process = Object.values(this._processById).filter(function(p) {
            return p.threadByName(rendererMainThreadName);
        }
        )[0];
        var thread = process && process.threadByName(rendererMainThreadName);
        if (!thread)
            return null ;
        var pageMetaEvent = new WebInspector.TracingModel.Event(WebInspector.TracingModel.DevToolsMetadataEventCategory,WebInspector.TracingModel.DevToolsMetadataEvent.TracingStartedInPage,WebInspector.TracingModel.Phase.Metadata,this._minimumRecordTime,thread);
        pageMetaEvent.addArgs({
            "data": {
                "sessionId": "mockSessionId"
            }
        });
        return pageMetaEvent;
    },
    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);
    },
    _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.Loader = function(tracingModel) 
{
    this._tracingModel = tracingModel;
    this._firstChunkReceived = false;
}
WebInspector.TracingModel.Loader.prototype = {
    loadNextChunk: function(events) 
    {
        if (!this._firstChunkReceived) {
            this._tracingModel.reset();
            this._firstChunkReceived = true;
        }
        this._tracingModel.addEvents(events);
    },
    finish: function() 
    {
        this._tracingModel._loadedFromFile = true;
        this._tracingModel.tracingComplete();
    }
}
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 = {
    target: function() 
    {
        if (this.name() === WebInspector.TracingModel._rendererMainThreadName)
            return WebInspector.targetManager.targets()[0] || null ;
        else
            return null ;
    },
    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 title = WebInspector.UIString("\u2699 %s", workerName);
            WebInspector.targetManager.createTarget(title, WebInspector.Target.Type.DedicatedWorker, connection, this.target(), targetCreated.bind(this));
        }
        function targetCreated(target) 
        {
            if (!target)
                return;
            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 (!Runtime.experiments.isEnabled("customObjectFormatters"))
        return;
    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);
    },
    _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, 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(debuggerModel, payload, objectId) 
{
    WebInspector.SDKObject.call(this, debuggerModel.target());
    this._type = payload.type;
    this._useCapture = payload.useCapture;
    this._location = WebInspector.DebuggerModel.Location.fromPayload(debuggerModel, payload.location);
    this._handler = payload.handler ? this.target().runtimeModel.createRemoteObject(payload.handler) : null ;
    var script = debuggerModel.scriptForId(payload.location.scriptId);
    this._sourceName = script ? script.contentURL() : "";
    this._objectId = objectId;
}
WebInspector.EventListener.prototype = {
    type: function() 
    {
        return this._type;
    },
    useCapture: function() 
    {
        return this._useCapture;
    },
    location: function() 
    {
        return this._location;
    },
    handler: function() 
    {
        return this._handler;
    },
    sourceName: function() 
    {
        return this._sourceName;
    },
    objectId: function() 
    {
        return this._objectId;
    },
    __proto__: WebInspector.SDKObject.prototype
};
WebInspector.Script = function(debuggerModel, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, 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._isContentScript = isContentScript;
    this._isInternalScript = isInternalScript;
    this.sourceMapURL = sourceMapURL;
    this.hasSourceURL = hasSourceURL;
}
WebInspector.Script.Events = {
    ScriptEdited: "ScriptEdited",
    SourceMapURLAdded: "SourceMapURLAdded",
}
WebInspector.Script.sourceURLRegex = /\n[\040\t]*\/\/[@#]\ssourceURL=\s*(\S*?)\s*$/mg;
WebInspector.Script._trimSourceURLComment = function(source) 
{
    return source.replace(WebInspector.Script.sourceURLRegex, "");
}
WebInspector.Script.prototype = {
    isContentScript: function() 
    {
        return this._isContentScript;
    },
    isInternalScript: function() 
    {
        return this._isInternalScript;
    },
    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, debugData, asyncStackTrace) 
        {
            if (!error)
                this._source = newSource;
            var needsStepIn = !!debugData && debugData["stack_update_needs_step_in"] === true;
            callback(error, errorData, callFrames, asyncStackTrace, needsStepIn);
            if (!error)
                this.dispatchEventToListeners(WebInspector.Script.Events.ScriptEdited, newSource);
        }
        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.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";
    },
    getAllProperties: function(accessorPropertiesOnly, callback) 
    {
        throw "Not implemented";
    },
    eventListeners: function() 
    {
        throw "Not implemented";
    },
    deleteProperty: function(name, callback) 
    {
        throw "Not implemented";
    },
    callFunction: function(functionDeclaration, args, callback) 
    {
        throw "Not implemented";
    },
    callFunctionJSON: function(functionDeclaration, args, callback) 
    {
        throw "Not implemented";
    },
    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 );
    },
    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._objectId) {
                reject(null );
                return;
            }
            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 createEventListener(payload) 
            {
                return new WebInspector.EventListener(this._debuggerModel,payload,this._objectId);
            }
        }
    },
    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) 
{
    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;
}
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.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.Events = {
    MessageAdded: "message-added",
    MessagesCleared: "messages-cleared",
}
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 messages() 
    {
        return this._messages || [];
    },
    addMessage: function(msg) 
    {
        if (!msg.isErrorOrWarning() || !msg.messageText)
            return;
        if (!this._messages)
            this._messages = [];
        this._messages.push(msg);
        this.dispatchEventToListeners(WebInspector.Resource.Events.MessageAdded, msg);
    },
    get errors() 
    {
        return this._errors || 0;
    },
    set errors(x) 
    {
        this._errors = x;
    },
    get warnings() 
    {
        return this._warnings || 0;
    },
    set warnings(x) 
    {
        this._warnings = x;
    },
    clearErrorsAndWarnings: function() 
    {
        this._messages = [];
        this._warnings = 0;
        this._errors = 0;
        this.dispatchEventToListeners(WebInspector.Resource.Events.MessagesCleared);
    },
    get content() 
    {
        return this._content;
    },
    get contentEncoded() 
    {
        return this._contentEncoded;
    },
    contentURL: function() 
    {
        return this._url;
    },
    contentType: function() 
    {
        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.resourceType().canonicalMimeType() || this.mimeType;
    },
    searchInContent: function(query, caseSensitive, isRegex, callback) 
    {
        function callbackWrapper(error, searchMatches) 
        {
            callback(searchMatches || []);
        }
        if (this.resourceType() === WebInspector.resourceTypes.Document) {
            callback([]);
            return;
        }
        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);
    target.consoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded, this._consoleMessageAdded, this);
    target.consoleModel.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared, this._consoleCleared, this);
    this._agent = target.pageAgent();
    this._agent.enable();
    this._fetchResourceTree();
    target.registerPageDispatcher(new WebInspector.PageDispatcher(this));
    this._pendingConsoleMessages = {};
    this._securityOriginFrameCount = {};
    this._inspectedPageURL = "";
}
WebInspector.ResourceTreeModel.EventTypes = {
    FrameAdded: "FrameAdded",
    FrameNavigated: "FrameNavigated",
    FrameDetached: "FrameDetached",
    FrameResized: "FrameResized",
    MainFrameNavigated: "MainFrameNavigated",
    ResourceAdded: "ResourceAdded",
    WillLoadCachedResources: "WillLoadCachedResources",
    CachedResourcesLoaded: "CachedResourcesLoaded",
    DOMContentLoaded: "DOMContentLoaded",
    Load: "Load",
    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) {
            if (this.target().isPage() || this.target().isServiceWorker())
                console.error(JSON.stringify(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._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) {
            var resource = frame._addRequest(request);
            this._addPendingConsoleMessagesToResource(resource);
        }
    },
    _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);
    },
    _consoleMessageAdded: function(event) 
    {
        var msg = (event.data);
        var resource = msg.url ? this.resourceForURL(msg.url) : null ;
        if (resource)
            this._addConsoleMessageToResource(msg, resource);
        else
            this._addPendingConsoleMessage(msg);
    },
    _addPendingConsoleMessage: function(msg) 
    {
        if (!msg.url)
            return;
        if (!this._pendingConsoleMessages[msg.url])
            this._pendingConsoleMessages[msg.url] = [];
        this._pendingConsoleMessages[msg.url].push(msg);
    },
    _addPendingConsoleMessagesToResource: function(resource) 
    {
        var messages = this._pendingConsoleMessages[resource.url];
        if (messages) {
            for (var i = 0; i < messages.length; i++)
                this._addConsoleMessageToResource(messages[i], resource);
            delete this._pendingConsoleMessages[resource.url];
        }
    },
    _addConsoleMessageToResource: function(msg, resource) 
    {
        switch (msg.level) {
        case WebInspector.ConsoleMessage.MessageLevel.Warning:
            resource.warnings++;
            break;
        case WebInspector.ConsoleMessage.MessageLevel.Error:
            resource.errors++;
            break;
        }
        resource.addMessage(msg);
    },
    _consoleCleared: function() 
    {
        function callback(resource) 
        {
            resource.clearErrorsAndWarnings();
        }
        this._pendingConsoleMessages = {};
        this.forAllResources(callback);
    },
    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);
    },
    reloadPage: function(ignoreCache, scriptToEvaluateOnLoad) 
    {
        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.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 frame>");
        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, frameNumber) 
    {
        this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ScreencastFrame, {
            data: data,
            metadata: metadata,
            frameNumber: frameNumber
        });
    },
    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(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._sourceMappingURL = sourceMappingURL;
    this._reverseMappingsBySourceURL = {};
    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.ResourceLoader.loadUsingTargetUA(sourceMapURL, null , 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(baseURL,payload));
        } catch (e) {
            console.error(e.message);
            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[0] || (lineNumber === mapping[0] && columnNumber < mapping[1]))
                count = step;
            else {
                first = middle;
                count -= step;
            }
        }
        var entry = this._mappings[first];
        if (!first && entry && (lineNumber < entry[0] || (lineNumber === entry[0] && columnNumber < entry[1])))
            return null ;
        return entry;
    },
    findEntryReversed: function(sourceURL, lineNumber, span) 
    {
        var mappings = this._reverseMappingsBySourceURL[sourceURL];
        if (!mappings)
            return null ;
        var maxLineNumber = typeof span === "number" ? Math.min(lineNumber + span + 1, mappings.length) : mappings.length;
        for (; lineNumber < maxLineNumber; ++lineNumber) {
            var mapping = mappings[lineNumber];
            if (mapping)
                return mapping;
        }
        return null ;
    },
    _parseMap: function(map, lineNumber, columnNumber) 
    {
        var sourceIndex = 0;
        var sourceLineNumber = 0;
        var sourceColumnNumber = 0;
        var nameIndex = 0;
        var sources = [];
        var originalToCanonicalURLMap = {};
        for (var i = 0; i < map.sources.length; ++i) {
            var originalSourceURL = map.sources[i];
            var sourceRoot = map.sourceRoot || "";
            if (sourceRoot && !sourceRoot.endsWith("/"))
                sourceRoot += "/";
            var href = sourceRoot + originalSourceURL;
            var url = WebInspector.ParsedURL.completeURL(this._sourceMappingURL, href) || href;
            originalToCanonicalURLMap[originalSourceURL] = url;
            sources.push(url);
            this._sources[url] = true;
            if (map.sourcesContent && map.sourcesContent[i])
                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([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([lineNumber, columnNumber, sourceURL, sourceLineNumber, sourceColumnNumber]);
        }
        for (var i = 0; i < this._mappings.length; ++i) {
            var mapping = this._mappings[i];
            var url = mapping[2];
            if (!url)
                continue;if (!this._reverseMappingsBySourceURL[url])
                this._reverseMappingsBySourceURL[url] = [];
            var reverseMappings = this._reverseMappingsBySourceURL[url];
            var sourceLine = mapping[3];
            if (!reverseMappings[sourceLine])
                reverseMappings[sourceLine] = [mapping[0], mapping[1]];
        }
    },
    _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.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._initNetworkConditions();
    this._networkAgent.enable();
    WebInspector.moduleSetting("cacheDisabled").addChangeListener(this._cacheDisabledSettingChanged, this);
}
WebInspector.NetworkManager.EventTypes = {
    RequestStarted: "RequestStarted",
    RequestUpdated: "RequestUpdated",
    RequestFinished: "RequestFinished",
    RequestUpdateDropped: "RequestUpdateDropped"
}
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.IsThrottlingEnabled = function(conditions) 
{
    return conditions.throughput >= 0;
}
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);
    },
    clearBrowserCache: function() 
    {
        this._networkAgent.clearBrowserCache();
    },
    clearBrowserCookies: function() 
    {
        this._networkAgent.clearBrowserCookies();
    },
    _initNetworkConditions: function() 
    {
        this._networkAgent.canEmulateNetworkConditions(callback.bind(this));
        function callback(error, canEmulate) 
        {
            if (error || !canEmulate)
                return;
            WebInspector.moduleSetting("networkConditions").addChangeListener(this._networkConditionsSettingChanged, this);
            var conditions = WebInspector.moduleSetting("networkConditions").get();
            if (conditions.throughput < 0)
                return;
            this._updateNetworkConditions(conditions);
        }
    },
    _updateNetworkConditions: function(conditions) 
    {
        if (conditions.throughput < 0) {
            this._networkAgent.emulateNetworkConditions(false, 0, 0, 0);
        } else {
            var offline = !conditions.throughput && !conditions.latency;
            this._networkAgent.emulateNetworkConditions(!!offline, conditions.latency, conditions.throughput, conditions.throughput);
        }
    },
    _networkConditionsSettingChanged: function(event) 
    {
        this._updateNetworkConditions((event.data));
    },
    __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;
    },
    _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;
        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));
        }
    },
    _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);
    },
    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) 
    {
        var networkRequest = this._inflightRequestsById[requestId];
        if (!networkRequest)
            return;
        networkRequest.failed = true;
        networkRequest.setResourceType(WebInspector.resourceTypes[resourceType]);
        networkRequest.canceled = canceled;
        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.targetManager.observeTargets(this);
}
WebInspector.MultitargetNetworkManager.prototype = {
    targetAdded: function(target) 
    {
        var networkAgent = target.networkAgent();
        if (this._extraHeaders)
            networkAgent.setExtraHTTPHeaders(this._extraHeaders);
        if (typeof this._userAgent !== "undefined")
            networkAgent.setUserAgentOverride(this._userAgent);
    },
    targetRemoved: function(target) 
    {},
    setExtraHTTPHeaders: function(headers) 
    {
        this._extraHeaders = headers;
        for (var target of WebInspector.targetManager.targets())
            target.networkAgent().setExtraHTTPHeaders(this._extraHeaders);
    },
    setUserAgentOverride: function(userAgent) 
    {
        WebInspector.ResourceLoader.targetUserAgent = userAgent;
        this._userAgent = userAgent;
        for (var target of WebInspector.targetManager.targets())
            target.networkAgent().setUserAgentOverride(this._userAgent);
    }
}
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.statusCode = 0;
    this.statusText = "";
    this.requestMethod = "";
    this.requestTime = 0;
    this.protocol = "";
    this._resourceType = WebInspector.resourceTypes.Other;
    this._contentEncoded = false;
    this._pendingContentCallbacks = [];
    this._frames = [];
    this._eventSourceMessages = [];
    this._responseHeaderValues = {};
    this._remoteAddress = "";
    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;
    },
    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;
    },
    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;
    },
    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[0];
                if (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;
    },
    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": "-webkit-font-feature-settings"
}, {
    "name": "-webkit-font-smoothing"
}, {
    "name": "-webkit-locale"
}, {
    "name": "-webkit-text-orientation"
}, {
    "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": "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": "content"
}, {
    "name": "counter-increment"
}, {
    "name": "counter-reset"
}, {
    "name": "cursor"
}, {
    "name": "cx"
}, {
    "name": "cy"
}, {
    "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": "glyph-orientation-horizontal"
}, {
    "name": "glyph-orientation-vertical"
}, {
    "name": "grid-auto-columns"
}, {
    "name": "grid-auto-flow"
}, {
    "name": "grid-auto-rows"
}, {
    "name": "grid-column-end"
}, {
    "name": "grid-column-start"
}, {
    "name": "grid-row-end"
}, {
    "name": "grid-row-start"
}, {
    "name": "grid-template-areas"
}, {
    "name": "grid-template-columns"
}, {
    "name": "grid-template-rows"
}, {
    "name": "height"
}, {
    "name": "image-rendering"
}, {
    "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-blocks-on"
}, {
    "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"
}, {
    "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-box-contain"
}, {
    "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": "writing-mode"
}, {
    "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": "enable-background"
}, {
    "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"],
    "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-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.ExcludedFolderManager = function() 
{
    WebInspector.Object.call(this);
    this._excludedFoldersSetting = WebInspector.settings.createLocalSetting("workspaceExcludedFolders", {});
    var defaultCommonExcludedFolders = ["/\\.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" : "");
    this._excludedFolders = {};
    this._loadFromSettings();
}
WebInspector.ExcludedFolderManager.Events = {
    ExcludedFolderAdded: "ExcludedFolderAdded",
    ExcludedFolderRemoved: "ExcludedFolderRemoved"
}
WebInspector.ExcludedFolderManager.prototype = {
    workspaceFolderExcludePatternSetting: function() 
    {
        return this._workspaceFolderExcludePatternSetting;
    },
    _loadFromSettings: function() 
    {
        var savedExcludedFolders = this._excludedFoldersSetting.get();
        this._excludedFolders = {};
        for (var fileSystemPath in savedExcludedFolders) {
            var savedExcludedFoldersForPath = savedExcludedFolders[fileSystemPath];
            this._excludedFolders[fileSystemPath] = [];
            var excludedFolders = this._excludedFolders[fileSystemPath];
            for (var i = 0; i < savedExcludedFoldersForPath.length; ++i) {
                var savedEntry = savedExcludedFoldersForPath[i];
                var entry = new WebInspector.ExcludedFolderManager.Entry(savedEntry.fileSystemPath,savedEntry.path);
                excludedFolders.push(entry);
            }
        }
    },
    _saveToSettings: function() 
    {
        var savedExcludedFolders = this._excludedFolders;
        this._excludedFoldersSetting.set(savedExcludedFolders);
    },
    addExcludedFolder: function(fileSystemPath, excludedFolderPath) 
    {
        if (!this._excludedFolders[fileSystemPath])
            this._excludedFolders[fileSystemPath] = [];
        var entry = new WebInspector.ExcludedFolderManager.Entry(fileSystemPath,excludedFolderPath);
        this._excludedFolders[fileSystemPath].push(entry);
        this._saveToSettings();
        this.dispatchEventToListeners(WebInspector.ExcludedFolderManager.Events.ExcludedFolderAdded, entry);
    },
    removeExcludedFolder: function(fileSystemPath, path) 
    {
        var entry = this._excludedFolderEntryForPath(fileSystemPath, path);
        if (!entry)
            return;
        this._excludedFolders[fileSystemPath].remove(entry);
        this._saveToSettings();
        this.dispatchEventToListeners(WebInspector.ExcludedFolderManager.Events.ExcludedFolderRemoved, entry);
    },
    removeFileSystem: function(fileSystemPath) 
    {
        delete this._excludedFolders[fileSystemPath];
        this._saveToSettings();
    },
    _excludedFolderEntryForPath: function(fileSystemPath, path) 
    {
        var entries = this._excludedFolders[fileSystemPath];
        if (!entries)
            return null ;
        for (var i = 0; i < entries.length; ++i) {
            if (entries[i].path === path)
                return entries[i];
        }
        return null ;
    },
    isFileExcluded: function(fileSystemPath, folderPath) 
    {
        var excludedFolders = this._excludedFolders[fileSystemPath] || [];
        for (var i = 0; i < excludedFolders.length; ++i) {
            var entry = excludedFolders[i];
            if (entry.path === folderPath)
                return true;
        }
        var regex = this._workspaceFolderExcludePatternSetting.asRegExp();
        return !!(regex && regex.test(folderPath));
    },
    excludedFolders: function(fileSystemPath) 
    {
        var excludedFolders = this._excludedFolders[fileSystemPath];
        return excludedFolders ? excludedFolders.slice() : [];
    },
    __proto__: WebInspector.Object.prototype
}
WebInspector.ExcludedFolderManager.Entry = function(fileSystemPath, path) 
{
    this.fileSystemPath = fileSystemPath;
    this.path = path;
}
;
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];
            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(savedEntry.fileSystemPath,savedEntry.urlPrefix,savedEntry.pathPrefix);
                fileSystemMappings.push(entry);
            }
        }
        this._rebuildIndexes();
    },
    _saveToSettings: function() 
    {
        var savedMapping = this._fileSystemMappings;
        this._fileSystemMappingSetting.set(savedMapping);
        this._rebuildIndexes();
    },
    _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];
                this._mappingForURLPrefix[entry.urlPrefix] = entry;
                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._saveToSettings();
    },
    addFileMapping: function(fileSystemPath, urlPrefix, pathPrefix) 
    {
        var entry = new WebInspector.FileSystemMapping.Entry(fileSystemPath,urlPrefix,pathPrefix);
        this._fileSystemMappings[fileSystemPath].push(entry);
        this._saveToSettings();
        this.dispatchEventToListeners(WebInspector.FileSystemMapping.Events.FileMappingAdded, entry);
    },
    removeFileMapping: function(fileSystemPath, urlPrefix, pathPrefix) 
    {
        var entry = this._mappingEntryForPathPrefix(fileSystemPath, pathPrefix);
        if (!entry)
            return;
        this._fileSystemMappings[fileSystemPath].remove(entry);
        this._saveToSettings();
        this.dispatchEventToListeners(WebInspector.FileSystemMapping.Events.FileMappingRemoved, entry);
    },
    fileSystemPaths: function() 
    {
        return Object.keys(this._fileSystemMappings);
    },
    _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.pathPrefix.length > pathPrefix.length)
                continue;if (filePath.startsWith(pathPrefix.substr(1)))
                entry = entries[i];
        }
        return entry;
    },
    _mappingEntryForPathPrefix: function(fileSystemPath, pathPrefix) 
    {
        var entries = this._fileSystemMappings[fileSystemPath];
        for (var i = 0; i < entries.length; ++i) {
            if (pathPrefix === entries[i].pathPrefix)
                return entries[i];
        }
        return null ;
    },
    mappingEntries: function(fileSystemPath) 
    {
        return this._fileSystemMappings[fileSystemPath].slice();
    },
    hasMappingForURL: 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.filePath = entry.pathPrefix.substr(1) + url.substr(entry.urlPrefix.length);
        return file;
    },
    urlForPath: function(fileSystemPath, filePath) 
    {
        var entry = this._mappingEntryForPath(fileSystemPath, filePath);
        if (!entry)
            return "";
        return entry.urlPrefix + filePath.substring(entry.pathPrefix.length - 1);
    },
    removeMappingForURL: function(url) 
    {
        var entry = this._mappingEntryForURL(url);
        if (!entry)
            return;
        this._fileSystemMappings[entry.fileSystemPath].remove(entry);
        this._saveToSettings();
    },
    addMappingForResource: function(url, fileSystemPath, filePath) 
    {
        var commonPathSuffixLength = 0;
        var normalizedFilePath = "/" + filePath;
        for (var i = 0; i < normalizedFilePath.length; ++i) {
            var filePathCharacter = normalizedFilePath[normalizedFilePath.length - 1 - i];
            var urlCharacter = url[url.length - 1 - i];
            if (filePathCharacter !== urlCharacter)
                break;
            if (filePathCharacter === "/")
                commonPathSuffixLength = i;
        }
        var pathPrefix = normalizedFilePath.substr(0, normalizedFilePath.length - commonPathSuffixLength);
        var urlPrefix = url.substr(0, url.length - commonPathSuffixLength);
        this.addFileMapping(fileSystemPath, urlPrefix, pathPrefix);
    },
    __proto__: WebInspector.Object.prototype
}
WebInspector.FileSystemMapping.Entry = function(fileSystemPath, urlPrefix, pathPrefix) 
{
    this.fileSystemPath = fileSystemPath;
    this.urlPrefix = urlPrefix;
    this.pathPrefix = pathPrefix;
}
;
WebInspector.IsolatedFileSystem = function(manager, path, name, rootURL) 
{
    this._manager = manager;
    this._path = path;
    this._name = name;
    this._rootURL = rootURL;
}
WebInspector.IsolatedFileSystem.errorMessage = function(error) 
{
    return WebInspector.UIString("File system error: %s", error.message);
}
WebInspector.IsolatedFileSystem.normalizePath = function(fileSystemPath) 
{
    if (WebInspector.isWin())
        return fileSystemPath.replace(/\\/g, "/");
    return fileSystemPath;
}
WebInspector.IsolatedFileSystem.prototype = {
    path: function() 
    {
        return this._path;
    },
    normalizedPath: function() 
    {
        if (this._normalizedPath)
            return this._normalizedPath;
        this._normalizedPath = WebInspector.IsolatedFileSystem.normalizePath(this._path);
        return this._normalizedPath;
    },
    name: function() 
    {
        return this._name;
    },
    rootURL: function() 
    {
        return this._rootURL;
    },
    _requestFileSystem: function(callback) 
    {
        this._manager.requestDOMFileSystem(this._path, callback);
    },
    requestFilesRecursive: function(path, fileCallback, finishedCallback) 
    {
        var domFileSystem;
        var pendingRequests = 0;
        this._requestFileSystem(fileSystemLoaded.bind(this));
        function fileSystemLoaded(fs) 
        {
            domFileSystem = (fs);
            console.assert(domFileSystem);
            ++pendingRequests;
            this._requestEntries(domFileSystem, path, innerCallback.bind(this));
        }
        function innerCallback(entries) 
        {
            for (var i = 0; i < entries.length; ++i) {
                var entry = entries[i];
                if (!entry.isDirectory) {
                    if (this._manager.excludedFolderManager().isFileExcluded(this._path, entry.fullPath))
                        continue;fileCallback(entry.fullPath.substr(1));
                } 
                else {
                    if (this._manager.excludedFolderManager().isFileExcluded(this._path, entry.fullPath + "/"))
                        continue;++pendingRequests;
                    this._requestEntries(domFileSystem, entry.fullPath, innerCallback.bind(this));
                }
            }
            if (finishedCallback && (--pendingRequests === 0))
                finishedCallback();
        }
    },
    createFile: function(path, name, callback) 
    {
        this._requestFileSystem(fileSystemLoaded.bind(this));
        var newFileIndex = 1;
        if (!name)
            name = "NewFile";
        var nameCandidate;
        function fileSystemLoaded(fs) 
        {
            var domFileSystem = (fs);
            console.assert(domFileSystem);
            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._requestFileSystem(fileSystemLoaded.bind(this));
        function fileSystemLoaded(fs) 
        {
            var domFileSystem = (fs);
            console.assert(domFileSystem);
            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) + "'");
        }
    },
    requestMetadata: function(path, callback) 
    {
        this._requestFileSystem(fileSystemLoaded);
        function fileSystemLoaded(fs) 
        {
            var domFileSystem = (fs);
            console.assert(domFileSystem);
            domFileSystem.root.getFile(path, null , fileEntryLoaded, errorHandler);
        }
        function fileEntryLoaded(entry) 
        {
            entry.getMetadata(successHandler, errorHandler);
        }
        function successHandler(metadata) 
        {
            callback(metadata.modificationTime, metadata.size);
        }
        function errorHandler(error) 
        {
            callback(null , null );
        }
    },
    requestFileContent: function(path, callback) 
    {
        this._requestFileSystem(fileSystemLoaded.bind(this));
        function fileSystemLoaded(fs) 
        {
            var domFileSystem = (fs);
            console.assert(domFileSystem);
            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;
            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) 
    {
        this._requestFileSystem(fileSystemLoaded.bind(this));
        WebInspector.userMetrics.FileSavedInWorkspace.record();
        function fileSystemLoaded(fs) 
        {
            var domFileSystem = (fs);
            console.assert(domFileSystem);
            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 = writerEnd;
                fileWriter.truncate(blob.size);
            }
        }
        function writerEnd() 
        {
            callback();
        }
        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._requestFileSystem(fileSystemLoaded.bind(this));
        function fileSystemLoaded(fs) 
        {
            var domFileSystem = (fs);
            console.assert(domFileSystem);
            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(domFileSystem, path, callback) 
    {
        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([]);
        }
    }
};
WebInspector.IsolatedFileSystemManager = function() 
{
    this._fileSystems = {};
    this._pendingFileSystemRequests = {};
    this._fileSystemMapping = new WebInspector.FileSystemMapping();
    this._excludedFolderManager = new WebInspector.ExcludedFolderManager();
    this._requestFileSystems();
    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);
}
WebInspector.IsolatedFileSystemManager.FileSystem;
WebInspector.IsolatedFileSystemManager.Events = {
    FileSystemAdded: "FileSystemAdded",
    FileSystemRemoved: "FileSystemRemoved"
}
WebInspector.IsolatedFileSystemManager.prototype = {
    mapping: function() 
    {
        return this._fileSystemMapping;
    },
    excludedFolderManager: function() 
    {
        return this._excludedFolderManager;
    },
    _requestFileSystems: function() 
    {
        console.assert(!this._loaded);
        InspectorFrontendHost.requestFileSystems();
    },
    addFileSystem: function() 
    {
        InspectorFrontendHost.addFileSystem();
    },
    removeFileSystem: function(fileSystemPath) 
    {
        InspectorFrontendHost.removeFileSystem(fileSystemPath);
    },
    _onFileSystemsLoaded: function(event) 
    {
        var fileSystems = (event.data);
        var addedFileSystemPaths = {};
        for (var i = 0; i < fileSystems.length; ++i) {
            this._innerAddFileSystem(fileSystems[i]);
            addedFileSystemPaths[fileSystems[i].fileSystemPath] = true;
        }
        var fileSystemPaths = this._fileSystemMapping.fileSystemPaths();
        for (var i = 0; i < fileSystemPaths.length; ++i) {
            var fileSystemPath = fileSystemPaths[i];
            if (!addedFileSystemPaths[fileSystemPath])
                this._fileSystemRemoved(fileSystemPath);
        }
        this._loaded = true;
        this._processPendingFileSystemRequests();
    },
    _innerAddFileSystem: function(fileSystem) 
    {
        var fileSystemPath = fileSystem.fileSystemPath;
        this._fileSystemMapping.addFileSystem(fileSystemPath);
        var isolatedFileSystem = new WebInspector.IsolatedFileSystem(this,fileSystemPath,fileSystem.fileSystemName,fileSystem.rootURL);
        this._fileSystems[fileSystemPath] = isolatedFileSystem;
        this.dispatchEventToListeners(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded, isolatedFileSystem);
    },
    _processPendingFileSystemRequests: function() 
    {
        for (var fileSystemPath in this._pendingFileSystemRequests) {
            var callbacks = this._pendingFileSystemRequests[fileSystemPath];
            for (var i = 0; i < callbacks.length; ++i)
                callbacks[i](this._isolatedFileSystem(fileSystemPath));
        }
        delete this._pendingFileSystemRequests;
    },
    _onFileSystemAdded: function(event) 
    {
        var errorMessage = (event.data["errorMessage"]);
        var fileSystem = (event.data["fileSystem"]);
        if (errorMessage)
            WebInspector.console.error(errorMessage, true);
        else if (fileSystem)
            this._innerAddFileSystem(fileSystem);
    },
    _onFileSystemRemoved: function(event) 
    {
        this._fileSystemRemoved((event.data));
    },
    _fileSystemRemoved: function(fileSystemPath) 
    {
        this._fileSystemMapping.removeFileSystem(fileSystemPath);
        this._excludedFolderManager.removeFileSystem(fileSystemPath);
        var isolatedFileSystem = this._fileSystems[fileSystemPath];
        delete this._fileSystems[fileSystemPath];
        if (isolatedFileSystem)
            this.dispatchEventToListeners(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved, isolatedFileSystem);
    },
    _isolatedFileSystem: function(fileSystemPath) 
    {
        var fileSystem = this._fileSystems[fileSystemPath];
        if (!fileSystem)
            return null ;
        if (!InspectorFrontendHost.isolatedFileSystem)
            return null ;
        return InspectorFrontendHost.isolatedFileSystem(fileSystem.name(), fileSystem.rootURL());
    },
    requestDOMFileSystem: function(fileSystemPath, callback) 
    {
        if (!this._loaded) {
            if (!this._pendingFileSystemRequests[fileSystemPath])
                this._pendingFileSystemRequests[fileSystemPath] = this._pendingFileSystemRequests[fileSystemPath] || [];
            this._pendingFileSystemRequests[fileSystemPath].push(callback);
            return;
        }
        callback(this._isolatedFileSystem(fileSystemPath));
    },
    __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 = "((?!-?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 (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, parentPath, name, originURL, url, contentType) 
{
    this._project = project;
    this._parentPath = parentPath;
    this._name = name;
    this._originURL = originURL;
    this._url = url;
    this._contentType = contentType;
    this._requestContentCallbacks = [];
    this.history = [];
}
WebInspector.UISourceCode.Events = {
    WorkingCopyChanged: "WorkingCopyChanged",
    WorkingCopyCommitted: "WorkingCopyCommitted",
    TitleChanged: "TitleChanged",
    SavedStateUpdated: "SavedStateUpdated",
    SourceMappingChanged: "SourceMappingChanged",
}
WebInspector.UISourceCode.prototype = {
    networkURL: function() 
    {
        return this._url;
    },
    name: function() 
    {
        return this._name;
    },
    parentPath: function() 
    {
        return this._parentPath;
    },
    path: function() 
    {
        return this._parentPath ? this._parentPath + "/" + this._name : this._name;
    },
    fullDisplayName: function() 
    {
        return this._project.displayName() + "/" + (this._parentPath ? this._parentPath + "/" : "") + this.displayName(true);
    },
    displayName: function(skipTrim) 
    {
        var displayName = this.name() || WebInspector.UIString("(index)");
        return skipTrim ? displayName : displayName.trimEnd(100);
    },
    uri: function() 
    {
        var path = this.path();
        if (!this._project.url())
            return path;
        if (!path)
            return this._project.url();
        return this._project.url() + "/" + path;
    },
    originURL: function() 
    {
        return this._originURL;
    },
    canRename: function() 
    {
        return this._project.canRename();
    },
    rename: function(newName, callback) 
    {
        this._project.rename(this, newName, innerCallback.bind(this));
        function innerCallback(success, newName, newURL, newOriginURL, newContentType) 
        {
            if (success)
                this._updateName((newName), (newURL), (newOriginURL), (newContentType));
            callback(success);
        }
    },
    remove: function() 
    {
        this._project.deleteFile(this.path());
    },
    _updateName: function(name, url, originURL, contentType) 
    {
        var oldURI = this.uri();
        this._name = name;
        if (url)
            this._url = url;
        if (originURL)
            this._originURL = originURL;
        if (contentType)
            this._contentType = contentType;
        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.TitleChanged, oldURI);
    },
    contentURL: function() 
    {
        return this.originURL();
    },
    contentType: function() 
    {
        return this._contentType;
    },
    project: function() 
    {
        return this._project;
    },
    requestMetadata: function(callback) 
    {
        this._project.requestMetadata(this, callback);
    },
    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));
    },
    _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(callback) 
    {
        callback = callback || function() {}
        ;
        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._commitContent("", 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._commitContent(updatedContent, false);
                this._terminateContentCheck();
                return;
            }
            var shouldUpdate = window.confirm(WebInspector.UIString("This file was changed externally. Would you like to reload it?"));
            if (shouldUpdate)
                this._commitContent(updatedContent, false);
            else
                this._lastAcceptedContent = updatedContent;
            this._terminateContentCheck();
        }
    },
    requestOriginalContent: function(callback) 
    {
        this._project.requestFileContent(this, callback);
    },
    _commitContent: function(content, shouldSetContentInProject) 
    {
        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._hasCommittedChanges = true;
        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyCommitted);
        if (this._url && WebInspector.fileManager.isURLSaved(this._url))
            this._saveURLWithFileManager(false, this._content);
        if (shouldSetContentInProject)
            this._project.setFileContent(this, this._content, function() {}
            );
    },
    _saveURLWithFileManager: function(forceSaveAs, content) 
    {
        WebInspector.fileManager.save(this._url, (content), forceSaveAs, callback.bind(this));
        WebInspector.fileManager.close(this._url);
        function callback(accepted) 
        {
            this._savedWithFileManager = accepted;
            if (accepted)
                this._hasCommittedChanges = false;
            this.dispatchEventToListeners(WebInspector.UISourceCode.Events.SavedStateUpdated);
        }
    },
    save: function(forceSaveAs) 
    {
        if (this.project().type() === WebInspector.projectTypes.FileSystem || this.project().type() === WebInspector.projectTypes.Snippets) {
            this.commitWorkingCopy();
            return;
        }
        if (this.isDirty()) {
            this._saveURLWithFileManager(forceSaveAs, this.workingCopy());
            this.commitWorkingCopy();
            return;
        }
        this.requestContent(this._saveURLWithFileManager.bind(this, forceSaveAs));
    },
    hasUnsavedCommittedChanges: function() 
    {
        if (this._savedWithFileManager || this.project().canSetFileContent() || this._project.isServiceProject())
            return false;
        if (this._project.workspace().hasResourceContentTrackingExtensions())
            return false;
        return !!this._hasCommittedChanges;
    },
    addRevision: function(content) 
    {
        this._commitContent(content, true);
    },
    revertToOriginal: function() 
    {
        function callback(content) 
        {
            if (typeof content !== "string")
                return;
            this.addRevision(content);
        }
        WebInspector.userMetrics.RevisionApplied.record();
        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.RevisionApplied.record();
        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);
    },
    setWorkingCopyGetter: function(workingCopyGetter) 
    {
        this._workingCopyGetter = workingCopyGetter;
        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);
    },
    removeWorkingCopyGetter: function() 
    {
        if (!this._workingCopyGetter)
            return;
        this._workingCopy = this._workingCopyGetter();
        delete this._workingCopyGetter;
    },
    commitWorkingCopy: function() 
    {
        if (this.isDirty())
            this._commitContent(this.workingCopy(), true);
    },
    isDirty: function() 
    {
        return typeof this._workingCopy !== "undefined" || typeof this._workingCopyGetter !== "undefined";
    },
    extension: function() 
    {
        var lastIndexOfDot = this._name.lastIndexOf(".");
        var extension = lastIndexOfDot !== -1 ? this._name.substr(lastIndexOfDot + 1) : "";
        var indexOfQuestionMark = extension.indexOf("?");
        if (indexOfQuestionMark !== -1)
            extension = extension.substr(0, indexOfQuestionMark);
        return extension;
    },
    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);
    },
    __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.uri() + ":" + this.lineNumber + ":" + this.columnNumber;
    },
    toUIString: function() 
    {
        return this.uiSourceCode.uri() + ":" + (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.RevisionApplied.record();
        this.requestContent(revert.bind(this));
    },
    contentURL: function() 
    {
        return this._uiSourceCode.originURL();
    },
    contentType: function() 
    {
        return this._uiSourceCode.contentType();
    },
    requestContent: function(callback) 
    {
        callback(this._content || "");
    },
    searchInContent: function(query, caseSensitive, isRegex, callback) 
    {
        callback([]);
    }
};
WebInspector.ProjectSearchConfig = function() {}
WebInspector.ProjectSearchConfig.prototype = {
    query: function() {},
    ignoreCase: function() {},
    isRegex: function() {},
    queries: function() {},
    filePathMatchesFileQuery: function(filePath) {}
}
WebInspector.FileDescriptor = function(parentPath, name, originURL, url, contentType) 
{
    this.parentPath = parentPath;
    this.name = name;
    this.originURL = originURL;
    this.url = url;
    this.contentType = contentType;
}
WebInspector.ProjectDelegate = function() {}
WebInspector.ProjectDelegate.Events = {
    FileAdded: "FileAdded",
    FileRemoved: "FileRemoved",
}
WebInspector.ProjectDelegate.prototype = {
    type: function() {},
    displayName: function() {},
    url: function() {},
    requestMetadata: function(path, callback) {},
    requestFileContent: function(path, callback) {},
    canSetFileContent: function() {},
    setFileContent: function(path, newContent, callback) {},
    canRename: function() {},
    rename: function(path, newName, callback) {},
    refresh: function(path, callback) {},
    excludeFolder: function(path) {},
    createFile: function(path, name, content, callback) {},
    deleteFile: function(path) {},
    remove: function() {},
    searchInFileContent: function(path, query, caseSensitive, isRegex, callback) {},
    findFilesMatchingSearchRequest: function(searchConfig, filesMathingFileQuery, progress, callback) {},
    indexContent: function(progress) {}
}
WebInspector.Project = function(workspace, projectId, projectDelegate) 
{
    this._uiSourceCodesMap = new Map();
    this._uiSourceCodesList = [];
    this._workspace = workspace;
    this._projectId = projectId;
    this._projectDelegate = projectDelegate;
    this._url = this._projectDelegate.url();
    this._displayName = this._projectDelegate.displayName();
    projectDelegate.addEventListener(WebInspector.ProjectDelegate.Events.FileAdded, this._fileAdded, this);
    projectDelegate.addEventListener(WebInspector.ProjectDelegate.Events.FileRemoved, this._fileRemoved, this);
}
WebInspector.Project.Events = {
    DisplayNameUpdated: "DisplayNameUpdated"
};
WebInspector.Project.prototype = {
    id: function() 
    {
        return this._projectId;
    },
    type: function() 
    {
        return this._projectDelegate.type();
    },
    displayName: function() 
    {
        return this._displayName;
    },
    setDisplayName: function(displayName) 
    {
        if (this._displayName === displayName)
            return;
        this._displayName = displayName;
        this.dispatchEventToListeners(WebInspector.Project.Events.DisplayNameUpdated);
    },
    url: function() 
    {
        return this._url;
    },
    isServiceProject: function() 
    {
        return this._projectDelegate.type() === WebInspector.projectTypes.Debugger || this._projectDelegate.type() === WebInspector.projectTypes.Formatter || this._projectDelegate.type() === WebInspector.projectTypes.Service;
    },
    _fileAdded: function(event) 
    {
        var fileDescriptor = (event.data);
        var path = fileDescriptor.parentPath ? fileDescriptor.parentPath + "/" + fileDescriptor.name : fileDescriptor.name;
        var uiSourceCode = this.uiSourceCode(path);
        if (uiSourceCode)
            return;
        uiSourceCode = new WebInspector.UISourceCode(this,fileDescriptor.parentPath,fileDescriptor.name,fileDescriptor.originURL,fileDescriptor.url,fileDescriptor.contentType);
        this._uiSourceCodesMap.set(path, {
            uiSourceCode: uiSourceCode,
            index: this._uiSourceCodesList.length
        });
        this._uiSourceCodesList.push(uiSourceCode);
        this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.UISourceCodeAdded, uiSourceCode);
    },
    _fileRemoved: function(event) 
    {
        var path = (event.data);
        this._removeFile(path);
    },
    _removeFile: function(path) 
    {
        var uiSourceCode = this.uiSourceCode(path);
        if (!uiSourceCode)
            return;
        var entry = this._uiSourceCodesMap.get(path);
        var movedUISourceCode = this._uiSourceCodesList[this._uiSourceCodesList.length - 1];
        this._uiSourceCodesList[entry.index] = movedUISourceCode;
        var movedEntry = this._uiSourceCodesMap.get(movedUISourceCode.path());
        movedEntry.index = entry.index;
        this._uiSourceCodesList.splice(this._uiSourceCodesList.length - 1, 1);
        this._uiSourceCodesMap.delete(path);
        this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.UISourceCodeRemoved, entry.uiSourceCode);
    },
    _remove: function() 
    {
        this._projectDelegate.removeEventListener(WebInspector.ProjectDelegate.Events.FileAdded, this._fileAdded, this);
        this._projectDelegate.removeEventListener(WebInspector.ProjectDelegate.Events.FileRemoved, this._fileRemoved, this);
        this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.ProjectRemoved, this);
        this._uiSourceCodesMap = new Map();
        this._uiSourceCodesList = [];
    },
    workspace: function() 
    {
        return this._workspace;
    },
    uiSourceCode: function(path) 
    {
        var entry = this._uiSourceCodesMap.get(path);
        return entry ? entry.uiSourceCode : null ;
    },
    uiSourceCodeForOriginURL: function(originURL) 
    {
        for (var i = 0; i < this._uiSourceCodesList.length; ++i) {
            var uiSourceCode = this._uiSourceCodesList[i];
            if (uiSourceCode.originURL() === originURL)
                return uiSourceCode;
        }
        return null ;
    },
    uiSourceCodes: function() 
    {
        return this._uiSourceCodesList;
    },
    requestMetadata: function(uiSourceCode, callback) 
    {
        this._projectDelegate.requestMetadata(uiSourceCode.path(), callback);
    },
    requestFileContent: function(uiSourceCode, callback) 
    {
        this._projectDelegate.requestFileContent(uiSourceCode.path(), callback);
    },
    canSetFileContent: function() 
    {
        return this._projectDelegate.canSetFileContent();
    },
    setFileContent: function(uiSourceCode, newContent, callback) 
    {
        this._projectDelegate.setFileContent(uiSourceCode.path(), newContent, onSetContent.bind(this));
        function onSetContent(content) 
        {
            this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.UISourceCodeContentCommitted, {
                uiSourceCode: uiSourceCode,
                content: newContent
            });
            callback(content);
        }
    },
    canRename: function() 
    {
        return this._projectDelegate.canRename();
    },
    rename: function(uiSourceCode, newName, callback) 
    {
        if (newName === uiSourceCode.name()) {
            callback(true, uiSourceCode.name(), uiSourceCode.networkURL(), uiSourceCode.originURL(), uiSourceCode.contentType());
            return;
        }
        this._projectDelegate.rename(uiSourceCode.path(), newName, innerCallback.bind(this));
        function innerCallback(success, newName, newURL, newOriginURL, newContentType) 
        {
            if (!success || !newName) {
                callback(false);
                return;
            }
            var oldPath = uiSourceCode.path();
            var newPath = uiSourceCode.parentPath() ? uiSourceCode.parentPath() + "/" + newName : newName;
            var value = (this._uiSourceCodesMap.get(oldPath));
            this._uiSourceCodesMap.set(newPath, value);
            this._uiSourceCodesMap.delete(oldPath);
            callback(true, newName, newURL, newOriginURL, newContentType);
        }
    },
    refresh: function(path, callback) 
    {
        this._projectDelegate.refresh(path, callback);
    },
    excludeFolder: function(path) 
    {
        this._projectDelegate.excludeFolder(path);
        var uiSourceCodes = this._uiSourceCodesList.slice();
        for (var i = 0; i < uiSourceCodes.length; ++i) {
            var uiSourceCode = uiSourceCodes[i];
            if (uiSourceCode.path().startsWith(path.substr(1)))
                this._removeFile(uiSourceCode.path());
        }
    },
    createFile: function(path, name, content, callback) 
    {
        this._projectDelegate.createFile(path, name, content, innerCallback);
        function innerCallback(filePath) 
        {
            callback(filePath);
        }
    },
    deleteFile: function(path) 
    {
        this._projectDelegate.deleteFile(path);
    },
    remove: function() 
    {
        this._projectDelegate.remove();
    },
    searchInFileContent: function(uiSourceCode, query, caseSensitive, isRegex, callback) 
    {
        this._projectDelegate.searchInFileContent(uiSourceCode.path(), query, caseSensitive, isRegex, callback);
    },
    findFilesMatchingSearchRequest: function(searchConfig, filesMathingFileQuery, progress, callback) 
    {
        this._projectDelegate.findFilesMatchingSearchRequest(searchConfig, filesMathingFileQuery, progress, callback);
    },
    indexContent: function(progress) 
    {
        this._projectDelegate.indexContent(progress);
    },
    __proto__: WebInspector.Object.prototype
}
WebInspector.projectTypes = {
    Debugger: "debugger",
    Formatter: "formatter",
    Network: "network",
    Snippets: "snippets",
    FileSystem: "filesystem",
    ContentScripts: "contentscripts",
    Service: "service"
}
WebInspector.Workspace = function(fileSystemMapping) 
{
    this._fileSystemMapping = fileSystemMapping;
    this._projects = {};
    this._hasResourceContentTrackingExtensions = false;
}
WebInspector.Workspace.Events = {
    UISourceCodeAdded: "UISourceCodeAdded",
    UISourceCodeRemoved: "UISourceCodeRemoved",
    UISourceCodeContentCommitted: "UISourceCodeContentCommitted",
    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, path) 
    {
        var project = this._projects[projectId];
        return project ? project.uiSourceCode(path) : null ;
    },
    uiSourceCodeForOriginURL: function(originURL) 
    {
        var projects = this.projectsForType(WebInspector.projectTypes.Network);
        projects = projects.concat(this.projectsForType(WebInspector.projectTypes.ContentScripts));
        for (var i = 0; i < projects.length; ++i) {
            var project = projects[i];
            var uiSourceCode = project.uiSourceCodeForOriginURL(originURL);
            if (uiSourceCode)
                return uiSourceCode;
        }
        return null ;
    },
    uiSourceCodesForProjectType: function(type) 
    {
        var result = [];
        for (var projectName in this._projects) {
            var project = this._projects[projectName];
            if (project.type() === type)
                result = result.concat(project.uiSourceCodes());
        }
        return result;
    },
    addProject: function(projectId, projectDelegate) 
    {
        var project = new WebInspector.Project(this,projectId,projectDelegate);
        this._projects[projectId] = project;
        this.dispatchEventToListeners(WebInspector.Workspace.Events.ProjectAdded, project);
        return project;
    },
    removeProject: function(projectId) 
    {
        var project = this._projects[projectId];
        if (!project)
            return;
        delete this._projects[projectId];
        project._remove();
    },
    project: function(projectId) 
    {
        return this._projects[projectId];
    },
    projects: function() 
    {
        return Object.values(this._projects);
    },
    projectsForType: function(type) 
    {
        function filterByType(project) 
        {
            return project.type() === type;
        }
        return this.projects().filter(filterByType);
    },
    uiSourceCodes: function() 
    {
        var result = [];
        for (var projectId in this._projects) {
            var project = this._projects[projectId];
            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._stubProjectDelegate = new WebInspector.ContentProviderBasedProjectDelegate(this._workspace,this._stubProjectID,WebInspector.projectTypes.Service);
    debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this);
}
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.length === 2)
            return null ;
        var url = (entry[2]);
        var uiSourceCode = this._networkMapping.uiSourceCodeForURL(url, this._target);
        if (!uiSourceCode)
            return null ;
        return uiSourceCode.uiLocation((entry[3]), (entry[4]));
    },
    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 mappingSearchLinesCount = 5;
        var entry = sourceMap.findEntryReversed(networkURL, lineNumber, mappingSearchLinesCount);
        if (!entry)
            return null ;
        return this._debuggerModel.createRawLocation(script, (entry[0]), (entry[1]));
    },
    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 url = script.sourceURL;
        var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(url);
        var parentPath = splitURL.slice(1, -1).join("/");
        var name = splitURL.peekLast() || "";
        var uiSourceCodePath = this._stubProjectDelegate.addContentProvider(parentPath, name, url, url, 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!",url));
        var stubUISourceCode = (this._workspace.uiSourceCode(this._stubProjectID, uiSourceCodePath));
        this._stubUISourceCodes.set(script.scriptId, stubUISourceCode);
        this._debuggerWorkspaceBinding.pushSourceMapping(script, this);
        this._loadSourceMapForScript(script, this._sourceMapLoaded.bind(this, script, uiSourceCodePath));
    },
    _sourceMapLoaded: function(script, uiSourceCodePath, sourceMap) 
    {
        this._stubUISourceCodes.delete(script.scriptId);
        this._stubProjectDelegate.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);
            if (!this._networkMapping.hasMappingForURL(sourceURL) && !this._networkMapping.uiSourceCodeForURL(sourceURL, script.target())) {
                var contentProvider = sourceMap.sourceContentProvider(sourceURL, WebInspector.resourceTypes.Script);
                this._networkProject.addFileForURL(sourceURL, contentProvider, script.isContentScript());
            }
            var uiSourceCode = this._networkMapping.uiSourceCodeForURL(sourceURL, this._target);
            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.findEntryReversed(networkURL, lineNumber, 0);
    },
    _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 unbindUISourceCodeForURL(sourceURL) 
        {
            var uiSourceCode = this._networkMapping.uiSourceCodeForURL(sourceURL, this._target);
            if (!uiSourceCode)
                return;
            this._unbindUISourceCode(uiSourceCode);
        }
        this._sourceMapForURL.keysArray().forEach(unbindUISourceCodeForURL.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._boundURLs = new Set();
    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.project().isServiceProject())
            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.project().isServiceProject())
            return;
        this._unbindUISourceCode(uiSourceCode);
    },
    _hasMergedToVM: function(uiSourceCode) 
    {
        var scripts = this._scriptsForUISourceCode(uiSourceCode);
        if (!scripts.length)
            return;
        for (var i = 0; i < scripts.length; ++i)
            this._debuggerWorkspaceBinding.updateLocations(scripts[i]);
    },
    _hasDivergedFromVM: 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.uiSourceCodeForURL(script.sourceURL, this._target);
    },
    _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 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._boundURLs.add(this._networkMapping.networkURL(uiSourceCode));
    },
    _unbindUISourceCode: function(uiSourceCode) 
    {
        var scriptFile = this.scriptFile(uiSourceCode);
        if (scriptFile) {
            scriptFile.dispose();
            this._setScriptFile(uiSourceCode, null );
        }
        this._debuggerWorkspaceBinding.setSourceMapping(this._target, uiSourceCode, null );
    },
    _debuggerReset: function() 
    {
        var boundURLs = this._boundURLs.valuesArray();
        for (var i = 0; i < boundURLs.length; ++i) 
        {
            var uiSourceCode = this._networkMapping.uiSourceCodeForURL(boundURLs[i], this._target);
            if (!uiSourceCode)
                continue;this._unbindUISourceCode(uiSourceCode);
        }
        this._boundURLs.clear();
    },
    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;
    if (this._uiSourceCode.contentType() === WebInspector.resourceTypes.Script)
        this._script = scripts[0];
    this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged, this._workingCopyChanged, this);
    this._update();
}
WebInspector.ResourceScriptFile.Events = {
    DidMergeToVM: "DidMergeToVM",
    DidDivergeFromVM: "DidDivergeFromVM",
}
WebInspector.ResourceScriptFile.prototype = {
    commitLiveEdit: function(callback) 
    {
        function innerCallback(error, errorData) 
        {
            if (!error)
                this._scriptSource = source;
            this._update();
            if (callback)
                callback(error, errorData, this._script);
        }
        if (!this._script)
            return;
        var debuggerModel = this._resourceScriptMapping._debuggerModel;
        var source = this._uiSourceCode.workingCopy();
        debuggerModel.setScriptSource(this._script.scriptId, source, innerCallback.bind(this));
    },
    _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))
            return true;
        var suffix = this._uiSourceCode.workingCopy().substr(this._scriptSource.length);
        return !!suffix.length && !suffix.match(WebInspector.Script.sourceURLRegex);
    },
    _workingCopyChanged: function(event) 
    {
        this._update();
    },
    _update: function() 
    {
        if (this._isDiverged() && !this._hasDivergedFromVM)
            this._divergeFromVM();
        else if (!this._isDiverged() && this._hasDivergedFromVM)
            this._mergeToVM();
    },
    _divergeFromVM: function() 
    {
        this._isDivergingFromVM = true;
        this._resourceScriptMapping._hasDivergedFromVM(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._hasMergedToVM(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);
    },
    addSourceMapURL: function(sourceMapURL) 
    {
        if (!this._script)
            return;
        this._script.addSourceMapURL(sourceMapURL);
    },
    __proto__: WebInspector.Object.prototype
};
WebInspector.SASSSourceMapping = function(cssModel, workspace, networkMapping, networkProject) 
{
    this.pollPeriodMs = 30 * 1000;
    this.pollIntervalMs = 200;
    this._cssModel = cssModel;
    this._workspace = workspace;
    this._networkProject = networkProject;
    this._addingRevisionCounter = 0;
    this._reset();
    WebInspector.fileManager.addEventListener(WebInspector.FileManager.EventTypes.SavedURL, this._fileSaveFinished, this);
    WebInspector.moduleSetting("cssSourceMapsEnabled").addChangeListener(this._toggleSourceMapSupport, this);
    this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._styleSheetChanged, this);
    this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this);
    this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeContentCommitted, this._uiSourceCodeContentCommitted, this);
    this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved, this._reset, this);
    this._networkMapping = networkMapping;
}
WebInspector.SASSSourceMapping.prototype = {
    _styleSheetChanged: function(event) 
    {
        var id = (event.data.styleSheetId);
        if (this._addingRevisionCounter) {
            --this._addingRevisionCounter;
            return;
        }
        var header = this._cssModel.styleSheetHeaderForId(id);
        if (!header)
            return;
        this.removeHeader(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]);
        }
    },
    _fileSaveFinished: function(event) 
    {
        var sassURL = (event.data);
        this._sassFileSaved(sassURL, false);
    },
    _headerValue: function(headerName, headers) 
    {
        headerName = headerName.toLowerCase();
        var value = null ;
        for (var name in headers) {
            if (name.toLowerCase() === headerName) {
                value = headers[name];
                break;
            }
        }
        return value;
    },
    _lastModified: function(headers) 
    {
        var lastModifiedHeader = this._headerValue("last-modified", headers);
        if (!lastModifiedHeader)
            return null ;
        var lastModified = new Date(lastModifiedHeader);
        if (isNaN(lastModified.getTime()))
            return null ;
        return lastModified;
    },
    _checkLastModified: function(headers, url) 
    {
        var lastModified = this._lastModified(headers);
        if (lastModified)
            return lastModified;
        var etagMessage = this._headerValue("etag", headers) ? ", \"ETag\" response header found instead" : "";
        var message = String.sprintf("The \"Last-Modified\" response header is missing or invalid for %s%s. The CSS auto-reload functionality will not work correctly.", url, etagMessage);
        WebInspector.console.log(message);
        return null ;
    },
    _sassFileSaved: function(sassURL, wasLoadedFromFileSystem) 
    {
        var cssURLs = this._cssURLsForSASSURL[sassURL];
        if (!cssURLs)
            return;
        if (!WebInspector.moduleSetting("cssReloadEnabled").get())
            return;
        var sassFile = this._networkMapping.uiSourceCodeForURL(sassURL, this._cssModel.target());
        console.assert(sassFile);
        if (wasLoadedFromFileSystem)
            sassFile.requestMetadata(metadataReceived.bind(this));
        else
            WebInspector.ResourceLoader.loadUsingTargetUA(sassURL, null , sassLoadedViaNetwork.bind(this));
        function sassLoadedViaNetwork(statusCode, headers, content) 
        {
            if (statusCode >= 400) {
                console.error("Could not load content for " + sassURL + " : " + "HTTP status code: " + statusCode);
                return;
            }
            var lastModified = this._checkLastModified(headers, sassURL);
            if (!lastModified)
                return;
            metadataReceived.call(this, lastModified);
        }
        function metadataReceived(timestamp) 
        {
            if (!timestamp)
                return;
            var now = Date.now();
            var deadlineMs = now + this.pollPeriodMs;
            var pollData = this._pollDataForSASSURL[sassURL];
            if (pollData) {
                var dataByURL = pollData.dataByURL;
                for (var url in dataByURL)
                    clearTimeout(dataByURL[url].timer);
            }
            pollData = {
                dataByURL: {},
                deadlineMs: deadlineMs,
                sassTimestamp: timestamp
            };
            this._pollDataForSASSURL[sassURL] = pollData;
            for (var i = 0; i < cssURLs.length; ++i) {
                pollData.dataByURL[cssURLs[i]] = {
                    previousPoll: now
                };
                this._pollCallback(cssURLs[i], sassURL, false);
            }
        }
    },
    _pollCallback: function(cssURL, sassURL, stopPolling) 
    {
        var now;
        var pollData = this._pollDataForSASSURL[sassURL];
        if (!pollData)
            return;
        if (stopPolling) {
            this._stopPolling(cssURL, sassURL);
            return;
        }
        if ((now = new Date().getTime()) > pollData.deadlineMs) {
            WebInspector.console.warn(WebInspector.UIString("%s hasn't been updated in %d seconds.", cssURL, this.pollPeriodMs / 1000));
            this._stopPolling(cssURL, sassURL);
            return;
        }
        var nextPoll = this.pollIntervalMs + pollData.dataByURL[cssURL].previousPoll;
        var remainingTimeoutMs = Math.max(0, nextPoll - now);
        pollData.dataByURL[cssURL].previousPoll = now + remainingTimeoutMs;
        pollData.dataByURL[cssURL].timer = setTimeout(this._reloadCSS.bind(this, cssURL, sassURL, this._pollCallback.bind(this)), remainingTimeoutMs);
    },
    _stopPolling: function(cssURL, sassURL) 
    {
        var pollData = this._pollDataForSASSURL[sassURL];
        delete pollData.dataByURL[cssURL];
        if (!Object.keys(pollData.dataByURL).length)
            delete this._pollDataForSASSURL[sassURL];
    },
    _reloadCSS: function(cssURL, sassURL, callback) 
    {
        var cssUISourceCode = this._networkMapping.uiSourceCodeForURL(cssURL, this._cssModel.target());
        if (!cssUISourceCode) {
            WebInspector.console.warn(WebInspector.UIString("%s resource missing. Please reload the page.", cssURL));
            callback(cssURL, sassURL, true);
            return;
        }
        if (this._networkMapping.hasMappingForURL(sassURL))
            this._reloadCSSFromFileSystem(cssUISourceCode, sassURL, callback);
        else
            this._reloadCSSFromNetwork(cssUISourceCode, sassURL, callback);
    },
    _reloadCSSFromNetwork: function(cssUISourceCode, sassURL, callback) 
    {
        var cssURL = this._networkMapping.networkURL(cssUISourceCode);
        var data = this._pollDataForSASSURL[sassURL];
        if (!data) {
            callback(cssURL, sassURL, true);
            return;
        }
        var headers = {
            "if-modified-since": new Date(data.sassTimestamp.getTime() - 1000).toUTCString()
        };
        WebInspector.ResourceLoader.loadUsingTargetUA(cssURL, headers, contentLoaded.bind(this));
        function contentLoaded(statusCode, headers, content) 
        {
            if (statusCode >= 400) {
                console.error("Could not load content for " + cssURL + " : " + "HTTP status code: " + statusCode);
                callback(cssURL, sassURL, true);
                return;
            }
            if (!this._pollDataForSASSURL[sassURL]) {
                callback(cssURL, sassURL, true);
                return;
            }
            if (statusCode === 304) {
                callback(cssURL, sassURL, false);
                return;
            }
            var lastModified = this._checkLastModified(headers, cssURL);
            if (!lastModified) {
                callback(cssURL, sassURL, true);
                return;
            }
            if (lastModified.getTime() < data.sassTimestamp.getTime()) {
                callback(cssURL, sassURL, false);
                return;
            }
            this._updateCSSRevision(cssUISourceCode, content, sassURL, callback);
        }
    },
    _updateCSSRevision: function(cssUISourceCode, content, sassURL, callback) 
    {
        ++this._addingRevisionCounter;
        cssUISourceCode.addRevision(content);
        var networkURL = this._networkMapping.networkURL(cssUISourceCode);
        this._cssUISourceCodeUpdated(networkURL, sassURL, callback);
    },
    _reloadCSSFromFileSystem: function(cssUISourceCode, sassURL, callback) 
    {
        cssUISourceCode.requestMetadata(metadataCallback.bind(this));
        function metadataCallback(timestamp) 
        {
            var cssURL = this._networkMapping.networkURL(cssUISourceCode);
            if (!timestamp) {
                callback(cssURL, sassURL, false);
                return;
            }
            var cssTimestamp = timestamp.getTime();
            var pollData = this._pollDataForSASSURL[sassURL];
            if (!pollData) {
                callback(cssURL, sassURL, true);
                return;
            }
            if (cssTimestamp < pollData.sassTimestamp.getTime()) {
                callback(cssURL, sassURL, false);
                return;
            }
            cssUISourceCode.requestOriginalContent(contentCallback.bind(this));
            function contentCallback(content) 
            {
                if (content === null )
                    return;
                this._updateCSSRevision(cssUISourceCode, content, sassURL, callback);
            }
        }
    },
    _cssUISourceCodeUpdated: function(cssURL, sassURL, callback) 
    {
        var completeSourceMapURL = this._completeSourceMapURLForCSSURL[cssURL];
        if (!completeSourceMapURL)
            return;
        var ids = this._cssModel.styleSheetIdsForURL(cssURL);
        if (!ids)
            return;
        var headers = [];
        for (var i = 0; i < ids.length; ++i)
            headers.push(this._cssModel.styleSheetHeaderForId(ids[i]));
        for (var i = 0; i < ids.length; ++i)
            this._loadSourceMapAndBindUISourceCode(headers, true, completeSourceMapURL);
        callback(cssURL, sassURL, true);
    },
    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._completeSourceMapURLForCSSURL[header.sourceURL] = completeSourceMapURL;
        this._loadSourceMapAndBindUISourceCode([header], false, completeSourceMapURL);
    },
    removeHeader: function(header) 
    {
        var sourceURL = header.sourceURL;
        if (!sourceURL || !header.sourceMapURL || !this._completeSourceMapURLForCSSURL[sourceURL])
            return;
        delete this._sourceMapByStyleSheetURL[sourceURL];
        delete this._completeSourceMapURLForCSSURL[sourceURL];
        for (var sassURL in this._cssURLsForSASSURL) {
            var urls = this._cssURLsForSASSURL[sassURL];
            urls.remove(sourceURL);
            if (!urls.length)
                delete this._cssURLsForSASSURL[sassURL];
        }
        var completeSourceMapURL = WebInspector.ParsedURL.completeURL(sourceURL, header.sourceMapURL);
        if (completeSourceMapURL)
            delete this._sourceMapByURL[completeSourceMapURL];
        WebInspector.cssWorkspaceBinding.updateLocations(header);
    },
    _loadSourceMapAndBindUISourceCode: function(headersWithSameSourceURL, forceRebind, completeSourceMapURL) 
    {
        console.assert(headersWithSameSourceURL.length);
        var sourceURL = headersWithSameSourceURL[0].sourceURL;
        this._loadSourceMapForStyleSheet(completeSourceMapURL, sourceURL, forceRebind, sourceMapLoaded.bind(this));
        function sourceMapLoaded(sourceMap) 
        {
            if (!sourceMap)
                return;
            this._sourceMapByStyleSheetURL[sourceURL] = sourceMap;
            for (var i = 0; i < headersWithSameSourceURL.length; ++i) {
                if (forceRebind)
                    WebInspector.cssWorkspaceBinding.updateLocations(headersWithSameSourceURL[i]);
                else
                    this._bindUISourceCode(headersWithSameSourceURL[i], sourceMap);
            }
        }
    },
    _addCSSURLforSASSURL: function(cssURL, sassURL) 
    {
        var cssURLs;
        if (this._cssURLsForSASSURL.hasOwnProperty(sassURL))
            cssURLs = this._cssURLsForSASSURL[sassURL];
        else {
            cssURLs = [];
            this._cssURLsForSASSURL[sassURL] = cssURLs;
        }
        if (cssURLs.indexOf(cssURL) === -1)
            cssURLs.push(cssURL);
    },
    _loadSourceMapForStyleSheet: function(completeSourceMapURL, completeStyleSheetURL, forceReload, callback) 
    {
        var sourceMap = this._sourceMapByURL[completeSourceMapURL];
        if (sourceMap && !forceReload) {
            callback(sourceMap);
            return;
        }
        var pendingCallbacks = this._pendingSourceMapLoadingCallbacks[completeSourceMapURL];
        if (pendingCallbacks) {
            pendingCallbacks.push(callback);
            return;
        }
        pendingCallbacks = [callback];
        this._pendingSourceMapLoadingCallbacks[completeSourceMapURL] = pendingCallbacks;
        WebInspector.SourceMap.load(completeSourceMapURL, completeStyleSheetURL, sourceMapLoaded.bind(this));
        function sourceMapLoaded(sourceMap) 
        {
            var callbacks = this._pendingSourceMapLoadingCallbacks[completeSourceMapURL];
            delete this._pendingSourceMapLoadingCallbacks[completeSourceMapURL];
            if (!callbacks)
                return;
            if (sourceMap)
                this._sourceMapByURL[completeSourceMapURL] = sourceMap;
            else
                delete this._sourceMapByURL[completeSourceMapURL];
            for (var i = 0; i < callbacks.length; ++i)
                callbacks[i](sourceMap);
        }
    },
    _bindUISourceCode: function(header, sourceMap) 
    {
        WebInspector.cssWorkspaceBinding.pushSourceMapping(header, this);
        var rawURL = header.sourceURL;
        var sources = sourceMap.sources();
        for (var i = 0; i < sources.length; ++i) {
            var url = sources[i];
            this._addCSSURLforSASSURL(rawURL, url);
            if (!this._networkMapping.hasMappingForURL(url) && !this._networkMapping.uiSourceCodeForURL(url, header.target())) {
                var contentProvider = sourceMap.sourceContentProvider(url, WebInspector.resourceTypes.Stylesheet);
                this._networkProject.addFileForURL(url, contentProvider);
            }
        }
    },
    rawLocationToUILocation: function(rawLocation) 
    {
        var entry;
        var sourceMap = this._sourceMapByStyleSheetURL[rawLocation.url];
        if (!sourceMap)
            return null ;
        entry = sourceMap.findEntry(rawLocation.lineNumber, rawLocation.columnNumber);
        if (!entry || entry.length === 2)
            return null ;
        var uiSourceCode = this._networkMapping.uiSourceCodeForURL(entry[2], rawLocation.target());
        if (!uiSourceCode)
            return null ;
        return uiSourceCode.uiLocation(entry[3], entry[4]);
    },
    uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber) 
    {
        return null ;
    },
    isIdentity: function() 
    {
        return false;
    },
    uiLineHasMapping: function(uiSourceCode, lineNumber) 
    {
        return true;
    },
    target: function() 
    {
        return this._cssModel.target();
    },
    _uiSourceCodeAdded: function(event) 
    {
        var uiSourceCode = (event.data);
        var networkURL = this._networkMapping.networkURL(uiSourceCode);
        var cssURLs = this._cssURLsForSASSURL[networkURL];
        if (!cssURLs)
            return;
        for (var i = 0; i < cssURLs.length; ++i) {
            var ids = this._cssModel.styleSheetIdsForURL(cssURLs[i]);
            for (var j = 0; j < ids.length; ++j) {
                var header = this._cssModel.styleSheetHeaderForId(ids[j]);
                console.assert(header);
                WebInspector.cssWorkspaceBinding.updateLocations((header));
            }
        }
    },
    _uiSourceCodeContentCommitted: function(event) 
    {
        var uiSourceCode = (event.data.uiSourceCode);
        if (uiSourceCode.project().type() === WebInspector.projectTypes.FileSystem) {
            var networkURL = this._networkMapping.networkURL(uiSourceCode);
            this._sassFileSaved(networkURL, true);
        }
    },
    _reset: function() 
    {
        this._addingRevisionCounter = 0;
        this._completeSourceMapURLForCSSURL = {};
        this._cssURLsForSASSURL = {};
        this._pendingSourceMapLoadingCallbacks = {};
        this._pollDataForSASSURL = {};
        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._mainFrameNavigated, this);
    this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._styleSheetChanged, this);
    this._initialize();
}
WebInspector.StylesSourceMapping.ChangeUpdateTimeoutMs = 200;
WebInspector.StylesSourceMapping.prototype = {
    rawLocationToUILocation: function(rawLocation) 
    {
        var uiSourceCode = this._networkMapping.uiSourceCodeForURL(rawLocation.url, rawLocation.target());
        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.uiSourceCodeForURL(url, header.target());
        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.uiSourceCodeForURL(url, header.target());
                if (uiSourceCode)
                    this._unbindUISourceCode(uiSourceCode);
            }
        }
    },
    _unbindUISourceCode: function(uiSourceCode) 
    {
        var styleFile = this._styleFiles.get(uiSourceCode);
        if (!styleFile)
            return;
        styleFile.dispose();
        this._styleFiles.remove(uiSourceCode);
    },
    _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() 
    {
        this._urlToHeadersByFrameId = {};
        this._styleFiles = new Map();
    },
    _mainFrameNavigated: function(event) 
    {
        for (var url in this._urlToHeadersByFrameId) {
            var uiSourceCode = this._networkMapping.uiSourceCodeForURL(url, this._cssModel.target());
            if (!uiSourceCode)
                continue;this._unbindUISourceCode(uiSourceCode);
        }
        this._initialize();
    },
    _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.uiSourceCodeForURL(styleSheetURL, header.target());
        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._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(finishCallback) 
    {
        this._mapping._setStyleContent(this._uiSourceCode, this._uiSourceCode.workingCopy(), this._isMajorChangePending).then(this._styleContentSet.bind(this)).then(finishCallback).catch((finishCallback));
        this._isMajorChangePending = false;
    },
    _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 url = style.parentRule.resourceURL();
        if (!url)
            return null ;
        var line = forName ? range.startLine : range.endLine;
        var column = forName ? range.startColumn : range.endColumn - (cssProperty.text && cssProperty.text.endsWith(";") ? 2 : 1);
        var header = style.cssModel().styleSheetHeaderForId(style.styleSheetId);
        var rawLocation = new WebInspector.CSSLocation(style.cssModel(),style.styleSheetId,url,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,workspace,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.cssModel(),this._header.id,this._header.resourceURL(),lineNumber,columnNumber);
        for (var i = this._sourceMappings.length - 1; !uiLocation && i >= 0; --i)
            uiLocation = this._sourceMappings[i].rawLocationToUILocation(rawLocation);
        return uiLocation;
    },
    _pushSourceMapping: function(sourceMapping) 
    {
        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.uiSourceCodeForURL(cssLocation.url, cssLocation.target());
        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.uri();
    },
    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() === WebInspector.resourceTypes.Script || uiSourceCode.contentType() === WebInspector.resourceTypes.Document)
            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.path();
        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.ContentProviderBasedProjectDelegate = function(workspace, id, type) 
{
    WebInspector.Object.call(this);
    this._type = type;
    this._contentProviders = {};
    this._workspace = workspace;
    this._id = id;
    workspace.addProject(id, this);
}
WebInspector.ContentProviderBasedProjectDelegate.prototype = {
    type: function() 
    {
        return this._type;
    },
    displayName: function() 
    {
        return "";
    },
    url: function() 
    {
        return "";
    },
    requestMetadata: function(path, callback) 
    {
        callback(null , null );
    },
    requestFileContent: function(path, callback) 
    {
        var contentProvider = this._contentProviders[path];
        contentProvider.requestContent(callback);
        function innerCallback(content, encoded, mimeType) 
        {
            callback(content);
        }
    },
    canSetFileContent: function() 
    {
        return false;
    },
    setFileContent: function(path, newContent, callback) 
    {
        callback(null );
    },
    canRename: function() 
    {
        return false;
    },
    rename: function(path, newName, callback) 
    {
        this.performRename(path, newName, innerCallback.bind(this));
        function innerCallback(success, newName) 
        {
            if (success)
                this._updateName(path, (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);
    },
    _updateName: function(path, newName) 
    {
        var oldPath = path;
        var copyOfPath = path.split("/");
        copyOfPath[copyOfPath.length - 1] = newName;
        var newPath = copyOfPath.join("/");
        this._contentProviders[newPath] = this._contentProviders[oldPath];
        delete this._contentProviders[oldPath];
    },
    searchInFileContent: function(path, query, caseSensitive, isRegex, callback) 
    {
        var contentProvider = this._contentProviders[path];
        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) 
    {
        setTimeout(progress.done.bind(progress), 0);
    },
    addContentProvider: function(parentPath, name, originURL, url, contentProvider) 
    {
        var path = parentPath ? parentPath + "/" + name : name;
        if (this._contentProviders[path])
            return path;
        var fileDescriptor = new WebInspector.FileDescriptor(parentPath,name,originURL,url,contentProvider.contentType());
        this._contentProviders[path] = contentProvider;
        this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileAdded, fileDescriptor);
        return path;
    },
    removeFile: function(path) 
    {
        delete this._contentProviders[path];
        this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileRemoved, path);
    },
    contentProviders: function() 
    {
        return this._contentProviders;
    },
    reset: function() 
    {
        this._contentProviders = {};
        this._workspace.removeProject(this._id);
        this._workspace.addProject(this._id, this);
    },
    __proto__: WebInspector.Object.prototype
};
WebInspector.DefaultScriptMapping = function(debuggerModel, workspace, debuggerWorkspaceBinding) 
{
    this._debuggerModel = debuggerModel;
    this._debuggerWorkspaceBinding = debuggerWorkspaceBinding;
    this._workspace = workspace;
    this._projectId = WebInspector.DefaultScriptMapping.projectIdForTarget(debuggerModel.target());
    this._projectDelegate = new WebInspector.DebuggerProjectDelegate(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 path = this._projectDelegate.addScript(script);
        var uiSourceCode = this._workspace.uiSourceCode(this._projectId, path);
        console.assert(uiSourceCode);
        uiSourceCode = (uiSourceCode);
        this._uiSourceCodeForScriptId.set(script.scriptId, uiSourceCode);
        this._scriptIdForUISourceCode.set(uiSourceCode, script.scriptId);
        this._debuggerWorkspaceBinding.setSourceMapping(this._debuggerModel.target(), uiSourceCode, this);
        this._debuggerWorkspaceBinding.pushSourceMapping(script, this);
        script.addEventListener(WebInspector.Script.Events.ScriptEdited, this._scriptEdited, this);
    },
    isIdentity: function() 
    {
        return true;
    },
    uiLineHasMapping: function(uiSourceCode, lineNumber) 
    {
        return true;
    },
    _scriptEdited: function(event) 
    {
        var script = (event.target);
        var content = (event.data);
        this._uiSourceCodeForScriptId.get(script.scriptId).addRevision(content);
    },
    _debuggerReset: function() 
    {
        this._uiSourceCodeForScriptId = new Map();
        this._scriptIdForUISourceCode = new Map();
        this._projectDelegate.reset();
    },
    dispose: function() 
    {
        this._workspace.removeProject(this._projectId);
    }
}
WebInspector.DefaultScriptMapping.projectIdForTarget = function(target) 
{
    return "debugger:" + target.id();
}
WebInspector.DebuggerProjectDelegate = function(workspace, id, type) 
{
    WebInspector.ContentProviderBasedProjectDelegate.call(this, workspace, id, type);
}
WebInspector.DebuggerProjectDelegate.prototype = {
    displayName: function() 
    {
        return "";
    },
    url: function() 
    {
        return "debugger:";
    },
    addScript: function(script) 
    {
        var contentProvider = script.isInlineScript() && !script.hasSourceURL ? new WebInspector.ConcatenatedScriptsContentProvider([script]) : script;
        var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(script.sourceURL);
        var name = splitURL[splitURL.length - 1];
        name = "VM" + script.scriptId + (name ? " " + name : "");
        return this.addContentProvider("", name, script.sourceURL, script.sourceURL, contentProvider);
    },
    __proto__: WebInspector.ContentProviderBasedProjectDelegate.prototype
};
WebInspector.FileSystemWorkspaceBinding = function(isolatedFileSystemManager, workspace, networkMapping) 
{
    this._isolatedFileSystemManager = isolatedFileSystemManager;
    this._workspace = workspace;
    this._networkMapping = networkMapping;
    this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded, this._fileSystemAdded, this);
    this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved, this._fileSystemRemoved, this);
    this._boundFileSystems = new Map();
    this._callbacks = {};
    this._progresses = {};
    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);
}
WebInspector.FileSystemWorkspaceBinding._styleSheetExtensions = ["css", "scss", "sass", "less"].keySet();
WebInspector.FileSystemWorkspaceBinding._documentExtensions = ["htm", "html", "asp", "aspx", "phtml", "jsp"].keySet();
WebInspector.FileSystemWorkspaceBinding._lastRequestId = 0;
WebInspector.FileSystemWorkspaceBinding.projectId = function(fileSystemPath) 
{
    return "filesystem:" + fileSystemPath;
}
WebInspector.FileSystemWorkspaceBinding.prototype = {
    _fileSystemAdded: function(event) 
    {
        var fileSystem = (event.data);
        var boundFileSystem = new WebInspector.FileSystemWorkspaceBinding.FileSystem(this,fileSystem,this._workspace,this._networkMapping);
        this._boundFileSystems.set(fileSystem.normalizedPath(), boundFileSystem);
    },
    _fileSystemRemoved: function(event) 
    {
        var fileSystem = (event.data);
        var boundFileSystem = this._boundFileSystems.get(fileSystem.normalizedPath());
        boundFileSystem.dispose();
        this._boundFileSystems.remove(fileSystem.normalizedPath());
    },
    fileSystemPath: function(projectId) 
    {
        var fileSystemPath = projectId.substr("filesystem:".length);
        var normalizedPath = WebInspector.IsolatedFileSystem.normalizePath(fileSystemPath);
        return projectId.substr("filesystem:".length);
    },
    _nextId: function() 
    {
        return ++WebInspector.FileSystemWorkspaceBinding._lastRequestId;
    },
    registerCallback: function(callback) 
    {
        var requestId = this._nextId();
        this._callbacks[requestId] = callback;
        return requestId;
    },
    registerProgress: function(progress) 
    {
        var requestId = this._nextId();
        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];
    },
}
WebInspector.FileSystemWorkspaceBinding.FileSystem = function(fileSystemWorkspaceBinding, isolatedFileSystem, workspace, networkMapping) 
{
    WebInspector.Object.call(this);
    this._fileSystemWorkspaceBinding = fileSystemWorkspaceBinding;
    this._fileSystem = isolatedFileSystem;
    this._fileSystemBaseURL = "file://" + this._fileSystem.normalizedPath() + "/";
    this._fileSystemProjectURL = "filesystem:" + this._fileSystem.normalizedPath();
    this._workspace = workspace;
    this._networkMapping = networkMapping;
    this._projectId = WebInspector.FileSystemWorkspaceBinding.projectId(this._fileSystem.path());
    console.assert(!this._workspace.project(this._projectId));
    this._workspace.addProject(this._projectId, this);
    this.populate();
}
WebInspector.FileSystemWorkspaceBinding.FileSystem.prototype = {
    type: function() 
    {
        return WebInspector.projectTypes.FileSystem;
    },
    fileSystemPath: function() 
    {
        return this._fileSystem.path();
    },
    displayName: function() 
    {
        var normalizedPath = this._fileSystem.normalizedPath();
        return normalizedPath.substr(normalizedPath.lastIndexOf("/") + 1);
    },
    url: function() 
    {
        return this._fileSystemProjectURL;
    },
    _filePathForPath: function(path) 
    {
        return "/" + path;
    },
    requestFileContent: function(path, callback) 
    {
        var filePath = this._filePathForPath(path);
        this._fileSystem.requestFileContent(filePath, callback);
    },
    requestMetadata: function(path, callback) 
    {
        var filePath = this._filePathForPath(path);
        this._fileSystem.requestMetadata(filePath, callback);
    },
    canSetFileContent: function() 
    {
        return true;
    },
    setFileContent: function(path, newContent, callback) 
    {
        var filePath = this._filePathForPath(path);
        this._fileSystem.setFileContent(filePath, newContent, callback.bind(this, ""));
    },
    canRename: function() 
    {
        return true;
    },
    rename: function(path, newName, callback) 
    {
        var filePath = this._filePathForPath(path);
        this._fileSystem.renameFile(filePath, newName, innerCallback.bind(this));
        function innerCallback(success, newName) 
        {
            if (!success) {
                callback(false, newName);
                return;
            }
            var validNewName = (newName);
            console.assert(validNewName);
            var slash = filePath.lastIndexOf("/");
            var parentPath = filePath.substring(0, slash);
            filePath = parentPath + "/" + validNewName;
            filePath = filePath.substr(1);
            var newURL = this._networkMapping.urlForPath(this._fileSystem.path(), filePath);
            var extension = this._extensionForPath(validNewName);
            var newOriginURL = this._fileSystemBaseURL + filePath;
            var newContentType = this._contentTypeForExtension(extension);
            callback(true, validNewName, newURL, newOriginURL, newContentType);
        }
    },
    searchInFileContent: function(path, query, caseSensitive, isRegex, callback) 
    {
        var filePath = this._filePathForPath(path);
        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._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);
        }
    },
    _searchInPath: function(query, progress, callback) 
    {
        var requestId = this._fileSystemWorkspaceBinding.registerCallback(innerCallback.bind(this));
        InspectorFrontendHost.searchInPath(requestId, this._fileSystem.path(), query);
        function innerCallback(files) 
        {
            function trimAndNormalizeFileSystemPath(fullPath) 
            {
                var trimmedPath = fullPath.substr(this._fileSystem.path().length + 1);
                if (WebInspector.isWin())
                    trimmedPath = trimmedPath.replace(/\\/g, "/");
                return trimmedPath;
            }
            files = files.map(trimAndNormalizeFileSystemPath.bind(this));
            progress.worked(1);
            callback(files);
        }
    },
    indexContent: function(progress) 
    {
        progress.setTotalWork(1);
        var requestId = this._fileSystemWorkspaceBinding.registerProgress(progress);
        InspectorFrontendHost.indexPath(requestId, this._fileSystem.path());
    },
    _extensionForPath: function(path) 
    {
        var extensionIndex = path.lastIndexOf(".");
        if (extensionIndex === -1)
            return "";
        return path.substring(extensionIndex + 1).toLowerCase();
    },
    _contentTypeForExtension: function(extension) 
    {
        if (WebInspector.FileSystemWorkspaceBinding._styleSheetExtensions[extension])
            return WebInspector.resourceTypes.Stylesheet;
        if (WebInspector.FileSystemWorkspaceBinding._documentExtensions[extension])
            return WebInspector.resourceTypes.Document;
        return WebInspector.resourceTypes.Script;
    },
    populate: function() 
    {
        this._fileSystem.requestFilesRecursive("", this._addFile.bind(this));
    },
    refresh: function(path, callback) 
    {
        this._fileSystem.requestFilesRecursive(path, this._addFile.bind(this), callback);
    },
    excludeFolder: function(path) 
    {
        this._fileSystemWorkspaceBinding._isolatedFileSystemManager.excludedFolderManager().addExcludedFolder(this._fileSystem.path(), path);
    },
    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() 
        {
            this._addFile(createFilePath);
            callback(createFilePath);
        }
    },
    deleteFile: function(path) 
    {
        this._fileSystem.deleteFile(path);
        this._removeFile(path);
    },
    remove: function() 
    {
        this._fileSystemWorkspaceBinding._isolatedFileSystemManager.removeFileSystem(this._fileSystem.path());
    },
    _addFile: function(filePath) 
    {
        if (!filePath)
            console.assert(false);
        var slash = filePath.lastIndexOf("/");
        var parentPath = filePath.substring(0, slash);
        var name = filePath.substring(slash + 1);
        var url = this._networkMapping.urlForPath(this._fileSystem.path(), filePath);
        var extension = this._extensionForPath(name);
        var contentType = this._contentTypeForExtension(extension);
        var fileDescriptor = new WebInspector.FileDescriptor(parentPath,name,this._fileSystemBaseURL + filePath,url,contentType);
        this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileAdded, fileDescriptor);
    },
    _removeFile: function(path) 
    {
        this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileRemoved, path);
    },
    dispose: function() 
    {
        this._workspace.removeProject(this._projectId);
    },
    __proto__: WebInspector.Object.prototype
}
WebInspector.fileSystemWorkspaceBinding;
;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() || !url)
        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 (url && regex) ? regex.test(url) : false;
}
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.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, 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;
    },
    linkifyMedia: function(media) 
    {
        var location = media.rawLocation();
        if (location)
            return this.linkifyCSSLocation(location);
        return WebInspector.linkifyResourceAsNode(media.sourceURL, undefined, "subtitle", media.sourceURL);
    },
    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();
        if (this._maxLength)
            text = text.trimMiddle(this._maxLength);
        anchor.textContent = text;
        var titleText = uiLocation.uiSourceCode.originURL();
        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.NetworkMapping = function(workspace, fileSystemMapping) 
{
    this._workspace = workspace;
    this._fileSystemMapping = fileSystemMapping;
    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.RevealSourceLine, this._revealSourceLine, this);
}
WebInspector.NetworkMapping.prototype = {
    networkURL: function(uiSourceCode) 
    {
        return uiSourceCode.networkURL();
    },
    hasMappingForURL: function(url) 
    {
        return this._fileSystemMapping.hasMappingForURL(url);
    },
    _networkUISourceCodeForURL: function(url, target) 
    {
        var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(url);
        var projectId = WebInspector.NetworkProject.projectId(target, splitURL[0], false);
        var project = this._workspace.project(projectId);
        return project ? project.uiSourceCode(splitURL.slice(1).join("/")) : null ;
    },
    _contentScriptUISourceCodeForURL: function(url, target) 
    {
        var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(url);
        var projectId = WebInspector.NetworkProject.projectId(target, splitURL[0], true);
        var project = this._workspace.project(projectId);
        return project ? project.uiSourceCode(splitURL.slice(1).join("/")) : null ;
    },
    uiSourceCodeForURL: function(url, target) 
    {
        var file = this._fileSystemMapping.fileForURL(url);
        if (file) {
            var projectId = WebInspector.FileSystemWorkspaceBinding.projectId(file.fileSystemPath);
            var project = this._workspace.project(projectId);
            return project ? project.uiSourceCode(file.filePath) : null ;
        }
        return this._networkUISourceCodeForURL(url, target) || this._contentScriptUISourceCodeForURL(url, target);
    },
    uiSourceCodeForURLForAnyTarget: function(url) 
    {
        for (var target of WebInspector.targetManager.targets()) {
            var result = this.uiSourceCodeForURL(url, target);
            if (result)
                return result;
        }
        return null ;
    },
    urlForPath: function(fileSystemPath, filePath) 
    {
        return this._fileSystemMapping.urlForPath(fileSystemPath, filePath);
    },
    addMapping: function(networkUISourceCode, uiSourceCode, fileSystemWorkspaceBinding) 
    {
        var url = this.networkURL(networkUISourceCode);
        var path = uiSourceCode.path();
        var fileSystemPath = 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);
    },
}
WebInspector.networkMapping;
;WebInspector.NetworkProjectDelegate = function(target, workspace, projectId, projectURL, projectType) 
{
    this._url = projectURL;
    this._target = target;
    this._id = projectId;
    WebInspector.ContentProviderBasedProjectDelegate.call(this, workspace, projectId, projectType);
}
WebInspector.NetworkProjectDelegate.prototype = {
    target: function() 
    {
        return this._target;
    },
    id: function() 
    {
        return this._id;
    },
    displayName: function() 
    {
        if (typeof this._displayName !== "undefined")
            return this._displayName;
        var targetSuffix = this._target.isPage() ? "" : " \u2014 " + this._target.name();
        if (!this._url) {
            this._displayName = WebInspector.UIString("(no domain)") + targetSuffix;
            return this._displayName;
        }
        var parsedURL = new WebInspector.ParsedURL(this._url);
        var prettyURL = parsedURL.isValid ? parsedURL.host + (parsedURL.port ? (":" + parsedURL.port) : "") : "";
        this._displayName = (prettyURL || this._url) + targetSuffix;
        return this._displayName;
    },
    url: function() 
    {
        return this._url;
    },
    addFile: function(parentPath, name, url, contentProvider) 
    {
        return this.addContentProvider(parentPath, name, url, url, contentProvider);
    },
    __proto__: WebInspector.ContentProviderBasedProjectDelegate.prototype
}
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._projectDelegates = {};
    this._processedURLs = {};
    target[WebInspector.NetworkProject._networkProjectSymbol] = this;
    target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, this._resourceAdded, 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);
    }
}
WebInspector.NetworkProject._networkProjectSymbol = Symbol("networkProject");
WebInspector.NetworkProject._contentTypeSymbol = Symbol("networkContentType");
WebInspector.NetworkProject.projectId = function(target, projectURL, isContentScripts) 
{
    return target.id() + ":" + (isContentScripts ? "contentscripts:" : "") + projectURL;
}
WebInspector.NetworkProject._targetForProject = function(project) 
{
    var targetId = parseInt(project.id(), 10);
    return WebInspector.targetManager.targetById(targetId);
}
WebInspector.NetworkProject.forTarget = function(target) 
{
    return target[WebInspector.NetworkProject._networkProjectSymbol];
}
WebInspector.NetworkProject.targetForUISourceCode = function(uiSourceCode) 
{
    if (uiSourceCode.project().type() !== WebInspector.projectTypes.ContentScripts && uiSourceCode.project().type() !== WebInspector.projectTypes.Network)
        return null ;
    return WebInspector.NetworkProject._targetForProject(uiSourceCode.project());
}
WebInspector.NetworkProject.uiSourceCodeContentType = function(uiSourceCode) 
{
    return uiSourceCode[WebInspector.NetworkProject._contentTypeSymbol];
}
WebInspector.NetworkProject.prototype = {
    _projectDelegate: function(projectURL, isContentScripts) 
    {
        var projectId = WebInspector.NetworkProject.projectId(this.target(), projectURL, isContentScripts);
        var projectType = isContentScripts ? WebInspector.projectTypes.ContentScripts : WebInspector.projectTypes.Network;
        if (this._projectDelegates[projectId])
            return this._projectDelegates[projectId];
        var projectDelegate = new WebInspector.NetworkProjectDelegate(this.target(),this._workspace,projectId,projectURL,projectType);
        this._projectDelegates[projectId] = projectDelegate;
        return projectDelegate;
    },
    addFileForURL: function(url, contentProvider, isContentScript) 
    {
        var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(url);
        var projectURL = splitURL[0];
        var parentPath = splitURL.slice(1, -1).join("/");
        var name = splitURL.peekLast() || "";
        var projectDelegate = this._projectDelegate(projectURL, isContentScript || false);
        var path = projectDelegate.addFile(parentPath, name, url, contentProvider);
        var uiSourceCode = (this._workspace.uiSourceCode(projectDelegate.id(), path));
        console.assert(uiSourceCode);
        return uiSourceCode;
    },
    _removeFileForURL: function(url) 
    {
        var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(url);
        var projectURL = splitURL[0];
        var path = splitURL.slice(1).join("/");
        var projectDelegate = this._projectDelegates[WebInspector.NetworkProject.projectId(this.target(), projectURL, false)];
        projectDelegate.removeFile(path);
    },
    _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._addFile(resources[i].url, new WebInspector.NetworkProject.FallbackResource(resources[i]));
        }
        var mainFrame = this.target().resourceTreeModel.mainFrame;
        if (mainFrame)
            populateFrame.call(this, mainFrame);
    },
    _parsedScriptSource: function(event) 
    {
        var script = (event.data);
        if (!script.sourceURL || (script.isInlineScript() && !script.hasSourceURL))
            return;
        if (script.isContentScript() && !script.hasSourceURL) {
            var parsedURL = new WebInspector.ParsedURL(script.sourceURL);
            if (!parsedURL.isValid)
                return;
        }
        this._addFile(script.sourceURL, script, script.isContentScript());
    },
    _styleSheetAdded: function(event) 
    {
        var header = (event.data);
        if (header.isInline && !header.hasSourceURL && header.origin !== "inspector")
            return;
        this._addFile(header.resourceURL(), header, false);
    },
    _styleSheetRemoved: function(event) 
    {
        var header = (event.data);
        if (header.isInline && !header.hasSourceURL && header.origin !== "inspector")
            return;
        this._removeFile(header.resourceURL());
    },
    _resourceAdded: function(event) 
    {
        var resource = (event.data);
        this._addFile(resource.url, new WebInspector.NetworkProject.FallbackResource(resource));
    },
    _mainFrameNavigated: function(event) 
    {
        this._reset();
        this._populate();
    },
    _addFile: function(url, contentProvider, isContentScript) 
    {
        if (this._networkMapping.hasMappingForURL(url))
            return;
        var type = contentProvider.contentType();
        if (type !== WebInspector.resourceTypes.Stylesheet && type !== WebInspector.resourceTypes.Document && type !== WebInspector.resourceTypes.Script)
            return;
        if (this._processedURLs[url])
            return;
        this._processedURLs[url] = true;
        var uiSourceCode = this.addFileForURL(url, contentProvider, isContentScript);
        uiSourceCode[WebInspector.NetworkProject._contentTypeSymbol] = type;
    },
    _removeFile: function(url) 
    {
        if (!this._processedURLs[url])
            return;
        delete this._processedURLs[url];
        this._removeFileForURL(url);
    },
    _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);
        }
    },
    _reset: function() 
    {
        this._processedURLs = {};
        for (var projectId in this._projectDelegates)
            this._projectDelegates[projectId].reset();
        this._projectDelegates = {};
    },
    __proto__: WebInspector.SDKObject.prototype
}
WebInspector.NetworkProject.FallbackResource = function(resource) 
{
    this._resource = resource;
}
WebInspector.NetworkProject.FallbackResource.prototype = {
    contentURL: function() 
    {
        return this._resource.contentURL();
    },
    contentType: function() 
    {
        return this._resource.resourceType();
    },
    requestContent: function(callback) 
    {
        function loadFallbackContent() 
        {
            var debuggerModel = WebInspector.DebuggerModel.fromTarget(this._resource.target());
            if (!debuggerModel) {
                callback(null );
                return;
            }
            var scripts = debuggerModel.scriptsForSourceURL(this._resource.url);
            if (!scripts.length) {
                callback(null );
                return;
            }
            var contentProvider;
            var type = this._resource.resourceType();
            if (type === WebInspector.resourceTypes.Document)
                contentProvider = new WebInspector.ConcatenatedScriptsContentProvider(scripts);
            else if (type === WebInspector.resourceTypes.Script)
                contentProvider = scripts[0];
            console.assert(contentProvider, "Resource content request failed. " + this._resource.url);
            contentProvider.requestContent(callback);
        }
        function requestContentLoaded(content) 
        {
            if (content)
                callback(content)
            else
                loadFallbackContent.call(this);
        }
        this._resource.requestContent(requestContentLoaded.bind(this));
    },
    searchInContent: function(query, caseSensitive, isRegex, callback) 
    {
        function documentContentLoaded(content) 
        {
            if (content === null ) {
                callback([]);
                return;
            }
            var result = WebInspector.ContentProvider.performSearchInContent(content, query, caseSensitive, isRegex);
            callback(result);
        }
        if (this.contentType() === WebInspector.resourceTypes.Document) {
            this.requestContent(documentContentLoaded);
            return;
        }
        this._resource.searchInContent(query, caseSensitive, isRegex, callback);
    }
};
WebInspector.PresentationConsoleMessageHelper = function(workspace) 
{
    this._workspace = workspace;
    this._pendingConsoleMessages = {};
    this._presentationConsoleMessages = [];
    this._uiSourceCodeToMessages = new Map();
    this._uiSourceCodeToEventTarget = new Map();
    workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this);
    workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved, this._projectRemoved, this);
    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.Events = {
    ConsoleMessageAdded: "ConsoleMessageAdded",
    ConsoleMessageRemoved: "ConsoleMessageRemoved",
    ConsoleMessagesCleared: "ConsoleMessagesCleared",
}
WebInspector.PresentationConsoleMessageHelper.prototype = {
    addConsoleMessageEventListener: function(eventType, uiSourceCode, listener, thisObject) 
    {
        var target = this._uiSourceCodeToEventTarget.get(uiSourceCode);
        if (!target) {
            target = new WebInspector.Object();
            this._uiSourceCodeToEventTarget.set(uiSourceCode, target);
        }
        target.addEventListener(eventType, listener, thisObject);
    },
    removeConsoleMessageEventListener: function(eventType, uiSourceCode, listener, thisObject) 
    {
        var target = this._uiSourceCodeToEventTarget.get(uiSourceCode);
        if (!target)
            return;
        target.removeEventListener(eventType, listener, thisObject);
    },
    consoleMessages: function(uiSourceCode) 
    {
        return this._uiSourceCodeToMessages.get(uiSourceCode) || [];
    },
    _dispatchConsoleEvent: function(eventType, uiSourceCode, message) 
    {
        var target = this._uiSourceCodeToEventTarget.get(uiSourceCode);
        if (!target)
            return;
        target.dispatchEventToListeners(eventType, message);
    },
    _uiSourceCodeRemoved: function(event) 
    {
        var uiSourceCode = (event.data);
        this._uiSourceCodeToEventTarget.remove(uiSourceCode);
        this._uiSourceCodeToMessages.remove(uiSourceCode);
    },
    _projectRemoved: function(event) 
    {
        var project = (event.data);
        var uiSourceCodes = project.uiSourceCodes();
        for (var i = 0; i < uiSourceCodes.length; ++i) {
            this._uiSourceCodeToEventTarget.remove(uiSourceCodes[i]);
            this._uiSourceCodeToMessages.remove(uiSourceCodes[i]);
        }
    },
    _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.stackTrace && message.stackTrace[0].columnNumber ? message.stackTrace[0].columnNumber - 1 : 0;
        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];
    },
    _presentationConsoleMessageAdded: function(message) 
    {
        var uiSourceCode = message._uiLocation.uiSourceCode;
        var messages = this._uiSourceCodeToMessages.get(uiSourceCode);
        if (!messages) {
            messages = [];
            this._uiSourceCodeToMessages.set(uiSourceCode, messages);
        }
        messages.push(message);
        this._dispatchConsoleEvent(WebInspector.PresentationConsoleMessageHelper.Events.ConsoleMessageAdded, uiSourceCode, message);
    },
    _presentationConsoleMessageRemoved: function(message) 
    {
        var uiSourceCode = message._uiLocation.uiSourceCode;
        var messages = this._uiSourceCodeToMessages.get(uiSourceCode);
        if (!messages)
            return;
        messages.remove(message);
        this._dispatchConsoleEvent(WebInspector.PresentationConsoleMessageHelper.Events.ConsoleMessageRemoved, uiSourceCode, message);
    },
    _consoleCleared: function() 
    {
        this._pendingConsoleMessages = {};
        for (var i = 0; i < this._presentationConsoleMessages.length; ++i)
            this._presentationConsoleMessages[i].dispose();
        this._presentationConsoleMessages = [];
        var targets = this._uiSourceCodeToEventTarget.valuesArray();
        for (var i = 0; i < targets.length; ++i)
            targets[i].dispatchEventToListeners(WebInspector.PresentationConsoleMessageHelper.Events.ConsoleMessagesCleared);
        this._uiSourceCodeToMessages.clear();
    },
    _debuggerReset: function() 
    {
        this._consoleCleared();
    }
}
WebInspector.PresentationConsoleMessage = function(message, rawLocation) 
{
    this.originalMessage = message;
    this._liveLocation = WebInspector.debuggerWorkspaceBinding.createLiveLocation(rawLocation, this._updateLocation.bind(this));
}
WebInspector.PresentationConsoleMessage.prototype = {
    _updateLocation: function(uiLocation) 
    {
        if (this._uiLocation)
            WebInspector.presentationConsoleMessageHelper._presentationConsoleMessageRemoved(this);
        this._uiLocation = uiLocation;
        WebInspector.presentationConsoleMessageHelper._presentationConsoleMessageAdded(this);
    },
    lineNumber: function() 
    {
        return this._uiLocation.lineNumber;
    },
    columnNumber: function() 
    {
        return this._uiLocation.columnNumber;
    },
    dispose: function() 
    {
        this._liveLocation.dispose();
    }
}
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;
}
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) {
        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 (typeof tooltipText === "undefined")
        a.title = url;
    else if (typeof tooltipText !== "string" || tooltipText.length)
        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://developer.chrome.com/devtools/docs/" + article, title, undefined, true);
}
WebInspector.linkifyResourceAsNode = function(url, lineNumber, 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;
    return anchor;
}
WebInspector.linkifyRequestAsNode = function(request) 
{
    var anchor = WebInspector.linkifyURLAsNode(request.url);
    anchor.requestId = request.requestId;
    return anchor;
}
;
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() 
    {
        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();
    }
}
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.WorkspaceController = function(workspace) 
{
    this._workspace = workspace;
    window.addEventListener("focus", this._windowFocused.bind(this), false);
    this._fileSystemRefreshThrottler = new WebInspector.Throttler(1000);
}
WebInspector.WorkspaceController.prototype = {
    _windowFocused: function(event) 
    {
        this._fileSystemRefreshThrottler.schedule(refreshFileSystems.bind(this));
        function refreshFileSystems(callback) 
        {
            var barrier = new CallbackBarrier();
            var projects = this._workspace.projects();
            for (var i = 0; i < projects.length; ++i)
                projects[i].refresh("/", barrier.createCallback());
            barrier.callWhenDone(callback);
        }
    }
};
WebInspector.ContentScriptProjectDecorator = function() 
{
    WebInspector.targetManager.addModelListener(WebInspector.RuntimeModel, WebInspector.RuntimeModel.Events.ExecutionContextCreated, this._onContextCreated, this);
    WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.ProjectAdded, this._onProjectAdded, this);
}
WebInspector.ContentScriptProjectDecorator._updateProjectWithExtensionName = function(project, context) 
{
    if (project.url().startsWith(context.origin))
        project.setDisplayName(context.name);
}
WebInspector.ContentScriptProjectDecorator.prototype = {
    _onContextCreated: function(event) 
    {
        var context = (event.data);
        if (!context.origin || !context.name)
            return;
        var projects = WebInspector.workspace.projects();
        projects = projects.filter(contentProjectWithName);
        for (var i = 0; i < projects.length; ++i)
            WebInspector.ContentScriptProjectDecorator._updateProjectWithExtensionName(projects[i], context);
        function contentProjectWithName(project) 
        {
            return !!project.url() && project.type() === WebInspector.projectTypes.ContentScripts;
        }
    },
    _onProjectAdded: function(event) 
    {
        var project = (event.data);
        if (project.type() !== WebInspector.projectTypes.ContentScripts)
            return;
        var targets = WebInspector.targetManager.targets();
        var contexts = [];
        for (var i = 0; i < targets.length; ++i)
            contexts = contexts.concat(targets[i].runtimeModel.executionContexts());
        contexts = contexts.filter(contextWithOriginAndName);
        for (var i = 0; i < contexts.length; ++i)
            WebInspector.ContentScriptProjectDecorator._updateProjectWithExtensionName(project, contexts[i]);
        function contextWithOriginAndName(context) 
        {
            return !!context.origin && !!context.name;
        }
    }
};
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);
    this.element.addEventListener("contextmenu", this._contextMenuEventFired.bind(this), false);
    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("components/customPreviewSection.css"));
    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.settings.moduleSetting("disableDataSaverInfobar"));
    this.element.createTextChild(WebInspector.UIString("Consider disabling "));
    this.element.appendChild(WebInspector.linkifyURLAsNode("https://support.google.com/chrome/answer/2392284?hl=en", "Chrome Data Saver", undefined, true));
    this.element.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 = {
    close: function() 
    {
        for (var infobar of WebInspector.DataSaverInfobar._infobars)
            WebInspector.Infobar.prototype.close.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.prototype = {
    _inspectedURLChanged: function(event) 
    {
        this._breakpointElements = {};
        this.reset();
        var url = (event.data);
        this._inspectedURL = url.removeURLFragment();
    },
    populateNodeContextMenu: function(node, contextMenu) 
    {
        if (node.pseudoType())
            return;
        var nodeBreakpoints = {};
        for (var id in this._breakpointElements) {
            var element = this._breakpointElements[id];
            if (element._node === node && element._checkboxElement.checked)
                nodeBreakpoints[element._type] = true;
        }
        function toggleBreakpoint(type) 
        {
            if (!nodeBreakpoints[type])
                this._setBreakpoint(node, type, true);
            else
                this._removeBreakpoint(node, type);
            this._saveBreakpoints();
        }
        var breakPointSubMenu = contextMenu.appendSubMenuItem(WebInspector.UIString("Break on..."));
        for (var key in this._breakpointTypes) {
            var type = this._breakpointTypes[key];
            var label = this._contextMenuLabels[type];
            breakPointSubMenu.appendCheckboxItem(label, toggleBreakpoint.bind(this, type), nodeBreakpoints[type]);
        }
    },
    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);
    },
    _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);
    },
    _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 title = node.nodeNameInCorrectCase();
    var nameElement = createElement("span");
    nameElement.textContent = title;
    parentElement.appendChild(nameElement);
    var idAttribute = node.getAttribute("id");
    if (idAttribute) {
        var idElement = createElement("span");
        parentElement.appendChild(idElement);
        var part = "#" + idAttribute;
        title += part;
        idElement.createTextChild(part);
        nameElement.className = "extra";
    }
    var classAttribute = node.getAttribute("class");
    if (classAttribute) {
        var classes = classAttribute.split(/\s+/);
        var foundClasses = {};
        if (classes.length) {
            var classesElement = createElement("span");
            classesElement.className = "extra";
            parentElement.appendChild(classesElement);
            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;
                }
            }
        }
    }
    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 = createElement("span");
    var shadowRoot = WebInspector.createShadowRootWithCoreStyles(root);
    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("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);
    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("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);
    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("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").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.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._currentDockStateSetting = WebInspector.settings.createSetting("currentDockState", "");
    this._lastDockStateSetting = WebInspector.settings.createSetting("lastDockState", "");
    this._dockToggleButton;
}
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._states = [WebInspector.DockController.State.DockedToRight, WebInspector.DockController.State.DockedToBottom, WebInspector.DockController.State.Undocked];
        this._titles = [WebInspector.UIString("Dock to right"), WebInspector.UIString("Dock to bottom"), WebInspector.UIString("Undock into separate window")];
        var initialState = this._currentDockStateSetting.get();
        initialState = this._states.indexOf(initialState) >= 0 ? initialState : this._states[0];
        this._dockSideChanged(initialState);
    },
    dockSide: function() 
    {
        return this._dockSide;
    },
    canDock: function() 
    {
        return this._canDock;
    },
    isVertical: function() 
    {
        return this._dockSide === WebInspector.DockController.State.DockedToRight;
    },
    _dockSideChanged: function(dockSide) 
    {
        if (this._dockSide === dockSide)
            return;
        if (this._dockToggleButton)
            this._dockToggleButton.setEnabled(false);
        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);
        if (this._dockToggleButton)
            this._dockToggleButton.setEnabled(true);
    },
    _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);
    },
    __proto__: WebInspector.Object.prototype
}
WebInspector.DockController.ButtonProvider = function() 
{}
WebInspector.DockController.ButtonProvider.prototype = {
    item: function() 
    {
        if (!WebInspector.dockController.canDock())
            return null ;
        if (!WebInspector.dockController._dockToggleButton) {
            WebInspector.dockController._dockToggleButton = new WebInspector.ToolbarStatesSettingButton("dock-toolbar-item",WebInspector.dockController._states,WebInspector.dockController._titles,WebInspector.dockController.dockSide(),WebInspector.dockController._currentDockStateSetting,WebInspector.dockController._lastDockStateSetting,WebInspector.dockController._dockSideChanged.bind(WebInspector.dockController));
        }
        return WebInspector.dockController._dockToggleButton;
    }
}
WebInspector.DockController.ToggleDockActionDelegate = function() 
{}
WebInspector.DockController.ToggleDockActionDelegate.prototype = {
    handleAction: function(context, actionId) 
    {
        var toggleButton = new WebInspector.DockController.ButtonProvider().item();
        if (!toggleButton || !toggleButton.enabled())
            return;
        (toggleButton).toggle();
    }
}
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._toggleDrawerButton = new WebInspector.ToolbarButton(WebInspector.UIString("Show drawer"),"console-toolbar-item");
    this._toggleDrawerButton.addEventListener("click", this.toggle, this);
    this._tabbedPane = new WebInspector.TabbedPane();
    this._tabbedPane.element.id = "drawer-tabbed-pane";
    this._tabbedPane.setCloseableTabs(false);
    this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);
    new WebInspector.ExtensibleTabbedPaneController(this._tabbedPane,"drawer-view");
    splitWidget.installResizer(this._tabbedPane.headerElement());
    this._lastSelectedViewSetting = WebInspector.settings.createSetting("WebInspector.Drawer.lastSelectedView", "console");
    this._tabbedPane.show(this.element);
}
WebInspector.Drawer.prototype = {
    toggleButton: function() 
    {
        return this._toggleDrawerButton;
    },
    closeView: function(id) 
    {
        this._tabbedPane.closeTab(id);
    },
    showView: function(id, immediate) 
    {
        if (!this._tabbedPane.hasTab(id)) {
            this._innerShow(immediate);
            return;
        }
        this._innerShow(immediate);
        this._tabbedPane.selectTab(id, true);
        this._lastSelectedViewSetting.set(id);
    },
    showCloseableView: function(id, title, view) 
    {
        if (!this._tabbedPane.hasTab(id)) {
            this._tabbedPane.appendTab(id, title, view, undefined, false, true);
        } else {
            this._tabbedPane.changeTabView(id, view);
            this._tabbedPane.changeTabTitle(id, title);
        }
        this._innerShow();
        this._tabbedPane.selectTab(id, true);
    },
    showDrawer: function() 
    {
        this.showView(this._lastSelectedViewSetting.get());
    },
    wasShown: function() 
    {
        this.showView(this._lastSelectedViewSetting.get());
        this._toggleDrawerButton.setToggled(true);
        this._toggleDrawerButton.setTitle(WebInspector.UIString("Hide drawer"));
    },
    willHide: function() 
    {
        this._toggleDrawerButton.setToggled(false);
        this._toggleDrawerButton.setTitle(WebInspector.UIString("Show drawer"));
    },
    _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) 
    {
        var tabId = this._tabbedPane.selectedTabId;
        if (tabId && event.data["isUserGesture"] && !this._tabbedPane.isTabCloseable(tabId))
            this._lastSelectedViewSetting.set(tabId);
    },
    toggle: function() 
    {
        if (this._toggleDrawerButton.toggled())
            this.closeDrawer();
        else
            this.showDrawer();
    },
    visible: function() 
    {
        return this._toggleDrawerButton.toggled();
    },
    selectedViewId: function() 
    {
        return this._tabbedPane.selectedTabId;
    },
    initialPanelShown: function() 
    {
        this._initialPanelWasShown = true;
    },
    __proto__: WebInspector.VBox.prototype
}
WebInspector.Drawer.ViewFactory = function() 
{}
WebInspector.Drawer.ViewFactory.prototype = {
    createView: function() {}
}
WebInspector.Drawer.SingletonViewFactory = function(constructor) 
{
    this._constructor = constructor;
}
WebInspector.Drawer.SingletonViewFactory.prototype = {
    createView: function() 
    {
        if (!this._instance)
            this._instance = (new this._constructor());
        return this._instance;
    }
};
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, 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, 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;
        var contentType = contentProvider.contentType();
        if (contentType !== WebInspector.resourceTypes.Document && contentType !== WebInspector.resourceTypes.Stylesheet && contentType !== WebInspector.resourceTypes.Script)
            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);
                uiSourceCode.save(forceSaveAs);
                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("Open links in"), handlerSelector.element);
    }
}
WebInspector.openAnchorLocationRegistry;
;WebInspector.InspectElementModeController = function() 
{
    this._toggleSearchButton = new WebInspector.ToolbarButton(WebInspector.UIString("Select an element in the page to inspect it"),"node-search-toolbar-item");
    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.EnterInspectElementMode, this._toggleSearch, this);
    WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged, this._suspendStateChanged, this);
    WebInspector.targetManager.observeTargets(this, WebInspector.Target.Type.Page);
}
WebInspector.InspectElementModeController.createShortcut = function() 
{
    return WebInspector.KeyboardShortcut.makeDescriptor("c", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta | WebInspector.KeyboardShortcut.Modifiers.Shift);
}
WebInspector.InspectElementModeController.prototype = {
    targetAdded: function(target) 
    {
        if (!this.enabled())
            return;
        var domModel = WebInspector.DOMModel.fromTarget(target);
        domModel.setInspectModeEnabled(true, WebInspector.moduleSetting("showUAShadowDOM").get());
    },
    targetRemoved: function(target) 
    {},
    enabled: function() 
    {
        return this._toggleSearchButton.toggled();
    },
    disable: function() 
    {
        if (this.enabled())
            this._toggleSearch();
    },
    _toggleSearch: function() 
    {
        var enabled = !this.enabled();
        this._toggleSearchButton.setToggled(enabled);
        for (var domModel of WebInspector.DOMModel.instances())
            domModel.setInspectModeEnabled(enabled, WebInspector.moduleSetting("showUAShadowDOM").get());
    },
    _suspendStateChanged: function() 
    {
        if (WebInspector.targetManager.allTargetsSuspended())
            this._toggleSearchButton.setToggled(false);
    }
}
WebInspector.InspectElementModeController.ToggleSearchActionDelegate = function() 
{}
WebInspector.InspectElementModeController.ToggleSearchActionDelegate.prototype = {
    handleAction: function(context, actionId) 
    {
        if (!WebInspector.inspectElementModeController)
            return;
        WebInspector.inspectElementModeController._toggleSearch();
    }
}
WebInspector.InspectElementModeController.ToggleButtonProvider = function() 
{}
WebInspector.InspectElementModeController.ToggleButtonProvider.prototype = {
    item: function() 
    {
        if (!WebInspector.inspectElementModeController)
            return null ;
        return WebInspector.inspectElementModeController._toggleSearchButton;
    }
}
WebInspector.inspectElementModeController = null ;
;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.setRetainTabOrder(true);
    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.ShowConsole, showConsole.bind(this));
    this._loadPanelDesciptors();
    function showConsole() 
    {
        this.showPanel("console");
    }
    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() 
    {
        WebInspector.startBatchUpdate();
        self.runtime.extensions(WebInspector.PanelFactory).forEach(processPanelExtensions.bind(this));
        function processPanelExtensions(extension) 
        {
            this.addPanel(new WebInspector.RuntimeExtensionPanelDescriptor(extension));
        }
        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);
    },
    addPanel: function(panelDescriptor) 
    {
        var panelName = panelDescriptor.name();
        this._panelDescriptors[panelName] = panelDescriptor;
        this._tabbedPane.appendTab(panelName, panelDescriptor.title(), new WebInspector.Widget());
        if (this._lastActivePanelSetting.get() === panelName)
            this._tabbedPane.selectTab(panelName);
    },
    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) 
    {
        delete this._panelForShowPromise;
        if (this._currentPanelLocked) {
            console.error("Current panel is locked");
            return this._currentPanel;
        }
        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;
    },
    closeViewInDrawer: function(id) 
    {
        this._drawer.closeView(id);
    },
    showCloseableViewInDrawer: function(id, title, view) 
    {
        this._drawer.showCloseableView(id, title, view);
    },
    showDrawer: function() 
    {
        this._drawer.showDrawer();
    },
    drawerVisible: function() 
    {
        return this._drawer.isShowing();
    },
    showViewInDrawer: function(id, immediate) 
    {
        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.currentInstance() && !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.currentInstance())
                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.currentInstance())
            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();
    },
    __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();
    }
}
WebInspector.InspectorView.ToggleDrawerButtonProvider = function() 
{}
WebInspector.InspectorView.ToggleDrawerButtonProvider.prototype = {
    item: function() 
    {
        return WebInspector.inspectorView._drawer.toggleButton();
    }
};
WebInspector.NetworkConditionsSelector = function(selectElement) 
{
    this._selectElement = selectElement;
    this._selectElement.addEventListener("change", this._optionSelected.bind(this), false);
    this._setting = WebInspector.moduleSetting("networkConditions");
    this._setting.addChangeListener(this._settingChanged, this);
    this._populateOptions();
    this._settingChanged();
}
WebInspector.NetworkConditionsSelector._networkConditionsPresets = [{
    title: "Offline",
    value: {
        throughput: 0 * 1024 / 8,
        latency: 0
    }
}, {
    title: "GPRS",
    value: {
        throughput: 50 * 1024 / 8,
        latency: 500
    }
}, {
    title: "Regular 2G",
    value: {
        throughput: 250 * 1024 / 8,
        latency: 300
    }
}, {
    title: "Good 2G",
    value: {
        throughput: 450 * 1024 / 8,
        latency: 150
    }
}, {
    title: "Regular 3G",
    value: {
        throughput: 750 * 1024 / 8,
        latency: 100
    }
}, {
    title: "Good 3G",
    value: {
        throughput: 1.5 * 1024 * 1024 / 8,
        latency: 40
    }
}, {
    title: "Regular 4G",
    value: {
        throughput: 4 * 1024 * 1024 / 8,
        latency: 20
    }
}, {
    title: "DSL",
    value: {
        throughput: 2 * 1024 * 1024 / 8,
        latency: 5
    }
}, {
    title: "WiFi",
    value: {
        throughput: 30 * 1024 * 1024 / 8,
        latency: 2
    }
}, {
    title: "No throttling",
    value: {
        throughput: -1,
        latency: 0
    }
}];
WebInspector.NetworkConditionsSelector.prototype = {
    _populateOptions: function() 
    {
        var presets = WebInspector.NetworkConditionsSelector._networkConditionsPresets;
        for (var i = 0; i < presets.length; ++i) {
            var preset = presets[i];
            var throughputInKbps = preset.value.throughput / (1024 / 8);
            var isThrottling = (throughputInKbps > 0) || preset.value.latency;
            var option;
            if (!isThrottling) {
                option = new Option(preset.title,preset.title);
            } else {
                var throughputText = (throughputInKbps < 1024) ? WebInspector.UIString("%d Kbps", throughputInKbps) : WebInspector.UIString("%d Mbps", (throughputInKbps / 1024) | 0);
                var title = WebInspector.UIString("%s (%s %dms RTT)", preset.title, throughputText, preset.value.latency);
                option = new Option(title,preset.title);
                option.title = WebInspector.UIString("Maximum download throughput: %s.\r\nMinimum round-trip time: %dms.", throughputText, preset.value.latency);
            }
            option.settingValue = preset.value;
            this._selectElement.appendChild(option);
        }
    },
    _optionSelected: function() 
    {
        this._setting.removeChangeListener(this._settingChanged, this);
        this._setting.set(this._selectElement.options[this._selectElement.selectedIndex].settingValue);
        this._setting.addChangeListener(this._settingChanged, this);
    },
    _settingChanged: function() 
    {
        var value = this._setting.get();
        var options = this._selectElement.options;
        for (var index = 0; index < options.length; ++index) {
            var option = options[index];
            if (option.settingValue.throughput === value.throughput && option.settingValue.latency === value.latency)
                this._selectElement.selectedIndex = index;
        }
    }
};
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, anchorElement, properties, internalProperties) 
        {
            if (internalProperties) {
                for (var i = 0; i < internalProperties.length; i++) {
                    if (internalProperties[i].name === "[[TargetFunction]]") {
                        funcObject = internalProperties[i].value;
                        break;
                    }
                }
            }
            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");
                popoverContentElement.appendChild(WebInspector.Widget.createStyleElement("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")
                    WebInspector.ObjectPropertiesSection.formatObjectAsFunction(result, valueElement, true);
                else
                    valueElement.textContent = description;
                if (result.type === "function") {
                    result.getOwnProperties(didGetFunctionProperties.bind(this, result, popoverContentElement, 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);
    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("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;
}
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;
        WebInspector.ObjectPropertyTreeElement._populate(this, propertyValue, skipProto);
    },
    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();
        if (this.property.value)
            this.setExpandable(!this.property.value.customPreview() && this.property.value.hasChildren && !this.property.wasThrown);
    },
    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.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.setExpandable(this.property.value.hasChildren && !this.property.wasThrown);
        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();
            }
        }
        ;
    },
    propertyPath: function() 
    {
        if (this._cachedPropertyPath)
            return this._cachedPropertyPath;
        var current = this;
        var result;
        do {
            if (current.property) {
                if (result)
                    result = current.property.name + "." + result;
                else
                    result = current.property.name;
            }
            current = current.parent;
        } while (current && !current.root);this._cachedPropertyPath = result;
        return result;
    },
    _onInvokeGetterClick: function(result, wasThrown) 
    {
        if (!result)
            return;
        this.property.value = result;
        this.property.wasThrown = wasThrown;
        this.update();
        this.invalidateChildren();
    },
    __proto__: TreeElement.prototype
}
WebInspector.ObjectPropertyTreeElement._populate = function(treeElement, value, skipProto, emptyPlaceholder, flattenProtoChain, extraProperties) 
{
    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, 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-variable" && !functionName)
                functionName = token;
            doneProcessing = doneProcessing || token === ")";
            if (doneProcessing)
                return;
            if (token === "(") {
                params = [];
                return;
            }
            if (params && tokenType === "js-def")
                params.push(token);
        }
    }
}
;
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("shortcuts", WebInspector.UIString("Full list of 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 = 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.ShortcutsScreen.TimelinePanelShortcuts.StartStopRecording, WebInspector.UIString("Start/stop recording"));
    section.addAlternateKeys(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.RecordPageReload, WebInspector.UIString("Record page reload"));
    section.addAlternateKeys(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.SaveToFile, WebInspector.UIString("Save timeline data"));
    section.addAlternateKeys(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.LoadFromFile, WebInspector.UIString("Load timeline data"));
    section.addRelatedKeys(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.JumpToPreviousFrame.concat(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.JumpToNextFrame), WebInspector.UIString("Jump to previous/next frame"));
    section = WebInspector.shortcutsScreen.section(WebInspector.UIString("Profiles Panel"));
    section.addAlternateKeys(WebInspector.ShortcutsScreen.ProfilesPanelShortcuts.StartStopRecording, 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.TimelinePanelShortcuts = {
    StartStopRecording: [WebInspector.KeyboardShortcut.makeDescriptor("e", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],
    RecordPageReload: [WebInspector.KeyboardShortcut.makeDescriptor("r", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],
    SaveToFile: [WebInspector.KeyboardShortcut.makeDescriptor("s", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],
    LoadFromFile: [WebInspector.KeyboardShortcut.makeDescriptor("o", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],
    JumpToPreviousFrame: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.LeftSquareBracket)],
    JumpToNextFrame: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.RightSquareBracket)]
};
WebInspector.ShortcutsScreen.ProfilesPanelShortcuts = {
    StartStopRecording: [WebInspector.KeyboardShortcut.makeDescriptor("e", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)]
};
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.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) 
    {
        var promises = [];
        for (var i = 0; i < objects.length; ++i)
            promises.push(objects[i].eventListeners());
        return Promise.all(promises).then(listenersCallback.bind(this));
        function listenersCallback(listeners) 
        {
            this.reset();
            for (var i = 0; i < listeners.length; ++i)
                this._addObjectEventListeners(objects[i], listeners[i]);
            this.addEmptyHolderIfNeeded();
            this._eventListenersArrivedForTest();
        }
    },
    _addObjectEventListeners: function(object, eventListeners) 
    {
        if (!eventListeners)
            return;
        for (var eventListener of eventListeners) {
            var treeItem = this._getOrCreateTreeElementForType(eventListener.type());
            treeItem.addObjectEventListener(eventListener, object);
        }
    },
    _getOrCreateTreeElementForType: function(type) 
    {
        var treeItem = this._treeItemMap.get(type);
        if (!treeItem) {
            treeItem = new WebInspector.EventListenersTreeElement(type,this._linkifier);
            this._treeItemMap.set(type, treeItem);
            this._treeOutline.appendChild(treeItem);
            this._emptyHolder.remove();
        }
        return treeItem;
    },
    addEmptyHolderIfNeeded: function() 
    {
        if (!this._treeOutline.firstChild() && !this._emptyHolder.parentNode)
            this._element.appendChild(this._emptyHolder);
    },
    reset: function() 
    {
        this._treeItemMap = new Map();
        this._treeOutline.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.sourceName()));
        title.appendChild(WebInspector.ObjectPropertiesSection.createValueElement(object, false));
    },
    __proto__: TreeElement.prototype
};
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 panelDescriptor = new WebInspector.ExtensionServerPanelDescriptor(id,message.title,new WebInspector.ExtensionPanel(this,id,page));
        this._clientObjects[id] = panelDescriptor;
        WebInspector.inspectorView.addPanel(panelDescriptor);
        return this._status.OK();
    },
    _onShowPanel: function(message) 
    {
        WebInspector.inspectorView.showPanel(message.id);
    },
    _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.uiSourceCodeForOriginURL(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 + "})()";
        var target = WebInspector.targetManager.mainTarget();
        target.resourceTreeModel.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.uiSourceCodeForOriginURL(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.uiSourceCodeForOriginURL(url);
        if (!uiSourceCode) {
            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.UISourceCodeContentCommitted, handler, this);
            WebInspector.workspace.setHasResourceContentTrackingExtensions(true);
        }
        function removeLastEventListener() 
        {
            WebInspector.workspace.setHasResourceContentTrackingExtensions(false);
            WebInspector.workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeContentCommitted, 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.ExtensionPanel = function(server, id, pageURL) 
{
    WebInspector.Panel.call(this, id);
    this._server = server;
    this.setHideOnDetach();
    this._panelToolbar = new WebInspector.Toolbar(this.element);
    this._panelToolbar.element.classList.add("hidden");
    this._searchableView = new WebInspector.SearchableView(this);
    this._searchableView.show(this.element);
    var extensionView = new WebInspector.ExtensionView(server,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.name, 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.name, WebInspector.extensionAPI.panels.SearchAction.PerformSearch, query);
    },
    jumpToNextSearchResult: function() 
    {
        this._server.notifySearchAction(this.name, WebInspector.extensionAPI.panels.SearchAction.NextSearchResult);
    },
    jumpToPreviousSearchResult: function() 
    {
        this._server.notifySearchAction(this.name, 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("","extension");
    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.setHideOnDetach();
    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.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);
    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.overrideGeolocation = WebInspector.settings.createSetting("overrideGeolocation", false);
    this.settings.geolocationOverride = WebInspector.settings.createSetting("geolocationOverride", "");
    this.settings.overrideDeviceOrientation = WebInspector.settings.createSetting("overrideDeviceOrientation", false);
    this.settings.deviceOrientationOverride = WebInspector.settings.createSetting("deviceOrientationOverride", "");
    this.settings.screenOrientationOverride = WebInspector.settings.createSetting("screenOrientationOverride", "");
    this.settings.overrideCSSMedia = WebInspector.settings.createSetting("overrideCSSMedia", false);
    this.settings.emulatedCSSMedia = WebInspector.settings.createSetting("emulatedCSSMedia", "print");
    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) {}
};
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);
                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();
    },
    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();
            this._userAgentChanged();
            this._target.emulationAgent().resetScrollAndPageScaleFactor();
        }
    },
    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.overrideDeviceOrientation.set(false);
        this.settings.screenOrientationOverride.set("");
        this.settings.overrideGeolocation.set(false);
        this.settings.overrideCSSMedia.set(false);
        delete this._deviceMetricsChangedListenerMuted;
        delete this._userAgentChangedListenerMuted;
        if (this._initialized) {
            this._deviceMetricsChanged();
            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, this);
        this.settings.emulateResolution.addChangeListener(this._deviceMetricsChanged, this);
        this.settings.deviceWidth.addChangeListener(this._deviceMetricsChanged, this);
        this.settings.deviceHeight.addChangeListener(this._deviceMetricsChanged, this);
        this.settings.deviceScaleFactor.addChangeListener(this._deviceMetricsChanged, this);
        this.settings.emulateMobile.addChangeListener(this._deviceMetricsChanged, this);
        this.settings.deviceFitWindow.addChangeListener(this._deviceMetricsChanged, this);
        this.settings._emulationEnabled.addChangeListener(this._geolocationPositionChanged, this);
        this.settings.overrideGeolocation.addChangeListener(this._geolocationPositionChanged, this);
        this.settings.geolocationOverride.addChangeListener(this._geolocationPositionChanged, this);
        this.settings._emulationEnabled.addChangeListener(this._deviceOrientationChanged, this);
        this.settings.overrideDeviceOrientation.addChangeListener(this._deviceOrientationChanged, 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._emulationEnabled.addChangeListener(this._cssMediaChanged, this);
        this.settings.overrideCSSMedia.addChangeListener(this._cssMediaChanged, this);
        this.settings.emulatedCSSMedia.addChangeListener(this._cssMediaChanged, 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.overrideDeviceOrientation.get())
                this._deviceOrientationChanged();
            if (this.settings.screenOrientationOverride.get())
                this._screenOrientationChanged();
            if (this.settings.overrideGeolocation.get())
                this._geolocationPositionChanged();
            if (this.settings.emulateTouch.get())
                this._emulateTouchEventsChanged();
            if (this.settings.overrideCSSMedia.get())
                this._cssMediaChanged();
            this._deviceMetricsChanged();
            if (this.settings.emulateResolution.get())
                this._target.emulationAgent().resetScrollAndPageScaleFactor();
            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();
    },
    _onPageResizerInsetsChanged: function(event) 
    {
        this._pageResizerInsets = (event.data);
    },
    _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();
    },
    _deviceMetricsChanged: function() 
    {
        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);
            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);
            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(finishCallback) 
        {
            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, finishCallback));
        }
        function clearDeviceMetricsOverride(finishCallback) 
        {
            this._target.emulationAgent().clearDeviceMetricsOverride(apiCallback.bind(this, finishCallback));
        }
        function apiCallback(finishCallback, error) 
        {
            if (error) {
                this._updateDeviceMetricsWarningMessage(WebInspector.UIString("Screen emulation is not available on this page."));
                this._deviceMetricsOverrideAppliedForTest();
                finishCallback();
                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();
            finishCallback();
        }
    },
    _deviceMetricsOverrideAppliedForTest: function() 
    {},
    _geolocationPositionChanged: function() 
    {
        if (!this.emulationEnabled() || !this.settings.overrideGeolocation.get()) {
            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);
    },
    _deviceOrientationChanged: function() 
    {
        if (!this.emulationEnabled() || !this.settings.overrideDeviceOrientation.get()) {
            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 (emulationEnabled && target[symbol] !== -1) {
            target[symbol] = -1;
            target.pageAgent().addScriptToEvaluateOnLoad("(" + injectedFunction.toString() + ")()", scriptAddedCallback);
        } else {
            if (typeof target[symbol] !== "undefined") {
                target.pageAgent().removeScriptToEvaluateOnLoad(target[symbol]);
                delete target[symbol];
            }
        }
        function scriptAddedCallback(error, scriptId) 
        {
            if (error)
                delete target[symbol];
            else
                target[symbol] = scriptId;
        }
        target.emulationAgent().setTouchEmulationEnabled(emulationEnabled, configuration);
    },
    _cssMediaChanged: function() 
    {
        var enabled = this.emulationEnabled() && this.settings.overrideCSSMedia.get();
        this._target.emulationAgent().setEmulatedMedia(enabled ? this.settings.emulatedCSSMedia.get() : "");
        var cssModel = WebInspector.CSSStyleModel.fromTarget(this._target);
        if (cssModel)
            cssModel.mediaQueryResultChanged();
    },
    _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)) {
            target.pageAgent().setShowViewportSizeOnResize(!this._pageResizerActive(), showRulersValue);
            var domModel = WebInspector.DOMModel.fromTarget(target);
            if (domModel)
                domModel.setHighlightSettings(showRulersValue && !this._pageResizerActive(), showRulersValue);
        }
    },
    _onMainFrameNavigated: function() 
    {
        this._deviceMetricsChanged();
        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 ,
        outlineImages: null 
    };
    this.horizontal = {
        width: 0,
        height: 0,
        outlineInsets: null ,
        outlineImages: 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 parseImages(json) 
        {
            if (!Array.isArray(json))
                throw new Error("Emulated device images is not an array");
            var result = new WebInspector.EmulatedDevice.Images();
            for (var i = 0; i < json.length; ++i) {
                var src = (parseValue(json[i], "src", "string"));
                var scale = (parseValue(json[i], "scale", "number"));
                if (scale <= 0)
                    throw new Error("Emulated device property image scale must be positive");
                result.addSource(src, scale);
            }
            return result;
        }
        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.outlineImages = parseImages(parseValue(json["outline"], "images", "object"));
            }
            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");
            }
            if (modes[i].hasOwnProperty("images"))
                mode.images = parseImages(parseValue(modes[i], "images", "object"));
            result.modes.push(mode);
        }
        result._showByDefault = (parseValue(json, "show-by-default", "boolean", true));
        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.compareByTitle = function(device1, device2) 
{
    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].images)
                mode["images"] = this.modes[i].images._toJSON();
            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"]["images"] = orientation.outlineImages._toJSON();
        }
        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;
    },
    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.EmulatedDevice.Images = function() 
{
    WebInspector.Object.call(this);
    this._sources = [];
    this._scales = [];
}
WebInspector.EmulatedDevice.Images.prototype = {
    _toJSON: function() 
    {
        var result = [];
        for (var i = 0; i < this._sources.length; ++i)
            result.push({
                src: this._sources[i],
                scale: this._scales[i]
            });
        return result;
    },
    addSource: function(src, scale) 
    {
        this._sources.push(src);
        this._scales.push(scale);
    },
    __proto__: WebInspector.Object.prototype
}
WebInspector.EmulatedDevicesList = function() 
{
    WebInspector.Object.call(this);
    WebInspector.settings.createSetting("standardEmulatedDeviceList", []).remove();
    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),
                        images: null 
                    });
                    device.modes.push({
                        title: "",
                        orientation: WebInspector.EmulatedDevice.Vertical,
                        insets: new Insets(0,0,0,0),
                        images: null 
                    });
                }
            }
        }
        return result;
    },
    standard: function() 
    {
        return this._standard;
    },
    custom: function() 
    {
        return this._custom;
    },
    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("Devices"));
    this.containerElement = this.element.createChild("div", "help-container-wrapper").createChild("div", "settings-tab help-content help-container");
    this.containerElement.createChild("div", "devices-title").textContent = WebInspector.UIString("Emulated devices");
    this._devicesList = this.containerElement.createChild("div", "devices-list");
    this._customListSearator = createElementWithClass("div", "devices-custom-separator");
    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._editDevice = null ;
    this._editDeviceListItem = null ;
    this._createEditDeviceElement();
    this._muteUpdate = false;
    WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.CustomDevicesUpdated, this._devicesUpdated, this);
    WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.StandardDevicesUpdated, this._devicesUpdated, this);
}
WebInspector.DevicesSettingsTab.prototype = {
    wasShown: function() 
    {
        WebInspector.VBox.prototype.wasShown.call(this);
        this._devicesUpdated();
        this._stopEditing();
    },
    _devicesUpdated: function() 
    {
        if (this._muteUpdate)
            return;
        this._devicesList.removeChildren();
        var devices = WebInspector.emulatedDevicesList.custom().slice();
        devices.sort(WebInspector.EmulatedDevice.compareByTitle);
        for (var i = 0; i < devices.length; ++i)
            this._devicesList.appendChild(this._createDeviceListItem(devices[i], true));
        this._devicesList.appendChild(this._customListSearator);
        this._updateSeparatorVisibility();
        devices = WebInspector.emulatedDevicesList.standard().slice();
        devices.sort(WebInspector.EmulatedDevice.compareByTitle);
        for (var i = 0; i < devices.length; ++i)
            this._devicesList.appendChild(this._createDeviceListItem(devices[i], false));
    },
    _updateSeparatorVisibility: function() 
    {
        this._customListSearator.classList.toggle("hidden", this._devicesList.firstChild === this._customListSearator);
    },
    _muteAndSaveDeviceList: function(custom) 
    {
        this._muteUpdate = true;
        if (custom)
            WebInspector.emulatedDevicesList.saveCustomDevices();
        else
            WebInspector.emulatedDevicesList.saveStandardDevices();
        this._muteUpdate = false;
    },
    _createDeviceListItem: function(device, custom) 
    {
        var item = createElementWithClass("div", "devices-list-item");
        var checkbox = item.createChild("input", "devices-list-checkbox");
        checkbox.type = "checkbox";
        checkbox.checked = device.show();
        item.createChild("div", "devices-list-title").textContent = device.title;
        item.addEventListener("click", onItemClicked.bind(this), false);
        item.classList.toggle("device-list-item-show", device.show());
        if (custom) {
            var editButton = item.createChild("div", "devices-list-edit");
            editButton.title = WebInspector.UIString("Edit");
            editButton.addEventListener("click", onEditClicked.bind(this), false);
            var removeButton = item.createChild("div", "devices-list-remove");
            removeButton.title = WebInspector.UIString("Remove");
            removeButton.addEventListener("click", onRemoveClicked, false);
        }
        function onItemClicked(event) 
        {
            var show = !checkbox.checked;
            device.setShow(show);
            this._muteAndSaveDeviceList(custom);
            checkbox.checked = show;
            item.classList.toggle("device-list-item-show", show);
            event.consume();
        }
        function onEditClicked(event) 
        {
            event.consume();
            this._startEditing(device, item);
        }
        function onRemoveClicked(event) 
        {
            WebInspector.emulatedDevicesList.removeCustomDevice(device);
            event.consume();
        }
        return item;
    },
    _addCustomDevice: function() 
    {
        this._startEditing(new WebInspector.EmulatedDevice(), null );
    },
    _createEditDeviceElement: function() 
    {
        this._editDeviceElement = createElementWithClass("div", "devices-edit-container");
        this._editDeviceElement.addEventListener("keydown", onKeyDown.bind(null , isEscKey, this._stopEditing.bind(this)), false);
        this._editDeviceElement.addEventListener("keydown", onKeyDown.bind(null , isEnterKey, this._editDeviceCommitClicked.bind(this)), false);
        this._editDeviceCheckbox = this._editDeviceElement.createChild("input", "devices-edit-checkbox");
        this._editDeviceCheckbox.type = "checkbox";
        var fields = this._editDeviceElement.createChild("div", "devices-edit-fields");
        this._editDeviceTitle = this._createInput(WebInspector.UIString("Device name"));
        fields.appendChild(this._editDeviceTitle);
        var screen = fields.createChild("div", "hbox");
        this._editDeviceWidth = this._createInput(WebInspector.UIString("Width"), "120px");
        screen.appendChild(this._editDeviceWidth);
        this._editDeviceHeight = this._createInput(WebInspector.UIString("Height"), "120px");
        screen.appendChild(this._editDeviceHeight);
        this._editDeviceScale = this._createInput(WebInspector.UIString("Device pixel ratio"));
        screen.appendChild(this._editDeviceScale);
        this._editDeviceUserAgent = this._createInput(WebInspector.UIString("User agent string"));
        fields.appendChild(this._editDeviceUserAgent);
        var buttonsRow = fields.createChild("div", "devices-edit-buttons");
        this._editDeviceCommitButton = createTextButton("", this._editDeviceCommitClicked.bind(this));
        buttonsRow.appendChild(this._editDeviceCommitButton);
        this._editDeviceCancelButton = createTextButton(WebInspector.UIString("Cancel"), this._stopEditing.bind(this));
        this._editDeviceCancelButton.addEventListener("keydown", onKeyDown.bind(null , isEnterKey, this._stopEditing.bind(this)), false);
        buttonsRow.appendChild(this._editDeviceCancelButton);
        function onKeyDown(predicate, callback, event) 
        {
            if (predicate(event)) {
                event.consume(true);
                callback();
            }
        }
    },
    _createInput: function(title, width) 
    {
        var input = createElement("input");
        input.type = "text";
        if (width)
            input.style.width = width;
        input.placeholder = title;
        input.addEventListener("input", this._validateInputs.bind(this), false);
        return input;
    },
    _validateInputs: function() 
    {
        var trimmedTitle = this._editDeviceTitle.value.trim();
        var titleValid = trimmedTitle.length > 0 && trimmedTitle.length < 50;
        this._editDeviceTitle.classList.toggle("error-input", !titleValid);
        var widthValid = !WebInspector.OverridesSupport.deviceSizeValidator(this._editDeviceWidth.value);
        this._editDeviceWidth.classList.toggle("error-input", !widthValid);
        var heightValid = !WebInspector.OverridesSupport.deviceSizeValidator(this._editDeviceHeight.value);
        this._editDeviceHeight.classList.toggle("error-input", !heightValid);
        var scaleValid = !WebInspector.OverridesSupport.deviceScaleFactorValidator(this._editDeviceScale.value);
        this._editDeviceScale.classList.toggle("error-input", !scaleValid);
        var allValid = titleValid && widthValid && heightValid && scaleValid;
        this._editDeviceCommitButton.disabled = !allValid;
    },
    _toNumericInputValue: function(value) 
    {
        return value ? String(value) : "";
    },
    _startEditing: function(device, listItem) 
    {
        this._stopEditing();
        this._addCustomButton.disabled = true;
        this._devicesList.classList.add("devices-list-editing");
        this._editDevice = device;
        this._editDeviceListItem = listItem;
        if (listItem)
            listItem.classList.add("hidden");
        this._editDeviceCommitButton.textContent = listItem ? WebInspector.UIString("Save") : WebInspector.UIString("Add device");
        this._editDeviceCheckbox.checked = device.show();
        this._editDeviceTitle.value = device.title;
        this._editDeviceWidth.value = listItem ? this._toNumericInputValue(device.vertical.width) : "";
        this._editDeviceHeight.value = listItem ? this._toNumericInputValue(device.vertical.height) : "";
        this._editDeviceScale.value = listItem ? this._toNumericInputValue(device.deviceScaleFactor) : "";
        this._editDeviceUserAgent.value = device.userAgent;
        this._validateInputs();
        if (listItem && listItem.nextElementSibling)
            this._devicesList.insertBefore(this._editDeviceElement, listItem.nextElementSibling);
        else
            this._devicesList.insertBefore(this._editDeviceElement, this._customListSearator);
        this._editDeviceCommitButton.scrollIntoView();
        this._editDeviceTitle.focus();
    },
    _editDeviceCommitClicked: function() 
    {
        if (this._editDeviceCommitButton.disabled)
            return;
        this._editDevice.setShow(this._editDeviceCheckbox.checked);
        this._editDevice.title = this._editDeviceTitle.value;
        this._editDevice.vertical.width = this._editDeviceWidth.value ? parseInt(this._editDeviceWidth.value, 10) : 0;
        this._editDevice.vertical.height = this._editDeviceHeight.value ? parseInt(this._editDeviceHeight.value, 10) : 0;
        this._editDevice.horizontal.width = this._editDevice.vertical.height;
        this._editDevice.horizontal.height = this._editDevice.vertical.width;
        this._editDevice.deviceScaleFactor = this._editDeviceScale.value ? parseFloat(this._editDeviceScale.value) : 0;
        this._editDevice.userAgent = this._editDeviceUserAgent.value;
        this._editDevice.modes.push({
            title: "",
            orientation: WebInspector.EmulatedDevice.Horizontal,
            insets: new Insets(0,0,0,0),
            images: null 
        });
        this._editDevice.modes.push({
            title: "",
            orientation: WebInspector.EmulatedDevice.Vertical,
            insets: new Insets(0,0,0,0),
            images: null 
        });
        this._stopEditing();
        if (this._editDeviceListItem)
            WebInspector.emulatedDevicesList.saveCustomDevices();
        else
            WebInspector.emulatedDevicesList.addCustomDevice(this._editDevice);
        this._editDevice = null ;
        this._editDeviceListItem = null ;
    },
    _stopEditing: function() 
    {
        this._devicesList.classList.remove("devices-list-editing");
        if (this._editDeviceListItem)
            this._editDeviceListItem.classList.remove("hidden");
        if (this._editDeviceElement.parentElement)
            this._devicesList.removeChild(this._editDeviceElement);
        this._addCustomButton.disabled = false;
        this._addCustomButton.focus();
    },
    __proto__: WebInspector.VBox.prototype
};
WebInspector.DeviceModeButtonProvider = function() 
{
    var button = new WebInspector.ToolbarButton(WebInspector.UIString("Toggle device mode"),"emulation-toolbar-item");
    button.addEventListener("click", toggleEmulationEnabled);
    WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.EmulationStateChanged, emulationEnabledChanged);
    WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.OverridesWarningUpdated, updateWarning);
    emulationEnabledChanged();
    updateWarning();
    function toggleEmulationEnabled() 
    {
        WebInspector.overridesSupport.setEmulationEnabled(!button.toggled());
    }
    function emulationEnabledChanged() 
    {
        button.setToggled(WebInspector.overridesSupport.emulationEnabled());
    }
    function updateWarning() 
    {
        var message = WebInspector.overridesSupport.warningMessage();
        button.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());
    }
};
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.compareByTitle);
        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.OverridesUI.createUserAgentSelectAndInput = function() 
{
    var userAgentSetting = WebInspector.overridesSupport.settings.userAgent;
    const noOverride = {
        title: WebInspector.UIString("No override"),
        value: ""
    };
    const customOverride = {
        title: WebInspector.UIString("Other"),
        value: "Other"
    };
    var userAgents = [noOverride].concat(WebInspector.OverridesUI._userAgents).concat([customOverride]);
    var userAgentSelectElement = createElement("select");
    for (var i = 0; i < userAgents.length; ++i)
        userAgentSelectElement.add(new Option(userAgents[i].title,userAgents[i].value));
    userAgentSelectElement.selectedIndex = 0;
    var otherUserAgentElement = createElement("input");
    otherUserAgentElement.type = "text";
    otherUserAgentElement.value = userAgentSetting.get();
    otherUserAgentElement.title = userAgentSetting.get();
    settingChanged();
    userAgentSetting.addChangeListener(settingChanged);
    userAgentSelectElement.addEventListener("change", userAgentSelected, false);
    otherUserAgentElement.addEventListener("dblclick", textDoubleClicked, true);
    otherUserAgentElement.addEventListener("blur", textChanged, false);
    otherUserAgentElement.addEventListener("keydown", textKeyDown, false);
    function userAgentSelected() 
    {
        var value = userAgentSelectElement.options[userAgentSelectElement.selectedIndex].value;
        if (value !== customOverride.value) {
            userAgentSetting.removeChangeListener(settingChanged);
            userAgentSetting.set(value);
            userAgentSetting.addChangeListener(settingChanged);
            otherUserAgentElement.value = value;
            otherUserAgentElement.title = value;
            otherUserAgentElement.readOnly = true;
        } else {
            otherUserAgentElement.readOnly = false;
            otherUserAgentElement.focus();
        }
    }
    function settingChanged() 
    {
        var value = userAgentSetting.get();
        var options = userAgentSelectElement.options;
        var selectionRestored = false;
        for (var i = 0; i < options.length; ++i) {
            if (options[i].value === value) {
                userAgentSelectElement.selectedIndex = i;
                selectionRestored = true;
                break;
            }
        }
        otherUserAgentElement.readOnly = selectionRestored;
        if (!selectionRestored)
            userAgentSelectElement.selectedIndex = options.length - 1;
        if (otherUserAgentElement.value !== value) {
            otherUserAgentElement.value = value;
            otherUserAgentElement.title = value;
        }
    }
    function textKeyDown(event) 
    {
        if (isEnterKey(event))
            textChanged();
    }
    function textDoubleClicked() 
    {
        userAgentSelectElement.selectedIndex = userAgents.length - 1;
        userAgentSelected();
    }
    function textChanged() 
    {
        if (userAgentSetting.get() !== otherUserAgentElement.value)
            userAgentSetting.set(otherUserAgentElement.value);
    }
    return {
        select: userAgentSelectElement,
        input: otherUserAgentElement
    };
}
WebInspector.OverridesUI._userAgents = [{
    title: "Android 4.0.2 \u2014 Galaxy Nexus",
    value: "Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"
}, {
    title: "Android 2.3 \u2014 Nexus S",
    value: "Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"
}, {
    title: "BlackBerry \u2014 BB10",
    value: "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.1+ (KHTML, like Gecko) Version/10.0.0.1337 Mobile Safari/537.1+"
}, {
    title: "BlackBerry \u2014 PlayBook 2.1",
    value: "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+"
}, {
    title: "BlackBerry \u2014 9900",
    value: "Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.187 Mobile Safari/534.11+"
}, {
    title: "Chrome 31 \u2014 Mac",
    value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"
}, {
    title: "Chrome 31 \u2014 Windows",
    value: "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"
}, {
    title: "Chrome \u2014 Android Tablet",
    value: "Mozilla/5.0 (Linux; Android 4.1.2; Nexus 7 Build/JZ054K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19"
}, {
    title: "Chrome \u2014 Android Mobile",
    value: "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"
}, {
    title: "Chrome \u2014 iPad",
    value: "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A465 Safari/8536.25"
}, {
    title: "Chrome \u2014 iPhone",
    value: "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A501 Safari/8536.25"
}, {
    title: "Firefox 14 \u2014 Android Mobile",
    value: "Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0"
}, {
    title: "Firefox 14 \u2014 Android Tablet",
    value: "Mozilla/5.0 (Android; Tablet; rv:14.0) Gecko/14.0 Firefox/14.0"
}, {
    title: "Firefox 4 \u2014 Mac",
    value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
}, {
    title: "Firefox 4 \u2014 Windows",
    value: "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
}, {
    title: "Firefox 7 \u2014 Mac",
    value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"
}, {
    title: "Firefox 7 \u2014 Windows",
    value: "Mozilla/5.0 (Windows NT 6.1; Intel Mac OS X 10.6; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"
}, {
    title: "Googlebot",
    value: "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
}, {
    title: "Googlebot Smartphone",
    value: "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
}, {
    title: "Internet Explorer 10",
    value: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)"
}, {
    title: "Internet Explorer 7",
    value: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"
}, {
    title: "Internet Explorer 8",
    value: "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"
}, {
    title: "Internet Explorer 9",
    value: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
}, {
    title: "iPad \u2014 iOS 8",
    value: "Mozilla/5.0 (iPad; CPU OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4"
}, {
    title: "iPad \u2014 iOS 7",
    value: "Mozilla/5.0 (iPad; CPU OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A501 Safari/9537.53"
}, {
    title: "iPad \u2014 iOS 6",
    value: "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25"
}, {
    title: "iPhone \u2014 iOS 8",
    value: "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4"
}, {
    title: "iPhone \u2014 iOS 7",
    value: "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A4449d Safari/9537.53"
}, {
    title: "iPhone \u2014 iOS 6",
    value: "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25"
}, {
    title: "MeeGo \u2014 Nokia N9",
    value: "Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13"
}, {
    title: "Opera 18 \u2014 Mac",
    value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"
}, {
    title: "Opera 18 \u2014 Windows",
    value: "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"
}, {
    title: "Opera 12 \u2014 Mac",
    value: "Opera/9.80 (Macintosh; Intel Mac OS X 10.9.1) Presto/2.12.388 Version/12.16"
}, {
    title: "Opera 12 \u2014 Windows",
    value: "Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.16"
}, {
    title: "Silk \u2014 Kindle Fire (Desktop view)",
    value: "Mozilla/5.0 (Linux; U; en-us; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true"
}, {
    title: "Silk \u2014 Kindle Fire (Mobile view)",
    value: "Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Mobile Safari/535.19 Silk-Accelerated=true"
}];
;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() 
{
    WebInspector.Widget.call(this);
    this.element.classList.add("media-inspector-view", "media-inspector-view-empty");
    this.element.addEventListener("click", this._onMediaQueryClicked.bind(this), false);
    this.element.addEventListener("contextmenu", this._onContextMenu.bind(this), false);
    this._mediaThrottler = new WebInspector.Throttler(0);
    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 = {
    HeightUpdated: "HeightUpdated",
    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;
        function setWidth(width) 
        {
            WebInspector.overridesSupport.settings.deviceWidth.set(width);
            WebInspector.overridesSupport.settings.emulateResolution.set(true);
        }
        var model = mediaQueryMarker._model;
        if (model.section() === WebInspector.MediaQueryInspector.Section.Max) {
            setWidth(model.maxWidthExpression().computedLength());
            return;
        }
        if (model.section() === WebInspector.MediaQueryInspector.Section.Min) {
            setWidth(model.minWidthExpression().computedLength());
            return;
        }
        var currentWidth = WebInspector.overridesSupport.settings.deviceWidth.get();
        if (currentWidth !== model.minWidthExpression().computedLength())
            setWidth(model.minWidthExpression().computedLength());
        else
            setWidth(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.uri(), 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(finishCallback) 
    {
        if (!this._enabled || !this._cssModel) {
            finishCallback();
            return;
        }
        this._cssModel.mediaQueriesPromise().then(this._rebuildMediaQueries.bind(this)).then(finishCallback).catch(finishCallback);
    },
    _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.element.children.length;
        var scrollTop = this.element.scrollTop;
        this.element.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.element.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);
        }
        this.element.scrollTop = scrollTop;
        this.element.classList.toggle("media-inspector-view-empty", !this.element.children.length);
        if (this.element.children.length !== oldChildrenCount)
            this.dispatchEventToListeners(WebInspector.MediaQueryInspector.Events.HeightUpdated);
    },
    _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._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");
        this._mediaInspector = new WebInspector.MediaQueryInspector();
        this._updateMediaQueryInspector();
        this._warningInfobar = new WebInspector.Infobar(WebInspector.Infobar.Type.Warning,WebInspector.moduleSetting("disableOverridesWarning"));
        this._warningInfobar.element.classList.add("responsive-design-warning");
        this._warningInfobar.setCloseCallback(WebInspector.overridesSupport.clearWarningMessage.bind(WebInspector.overridesSupport));
        this._canvasContainer.element.appendChild(this._warningInfobar.element);
        this._warningMessage = this._warningInfobar.element.createChild("span");
        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._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("For a simpler way to change the current page scale, hold down Shift and drag with your mouse.");
        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._mediaInspector.addEventListener(WebInspector.MediaQueryInspector.Events.HeightUpdated, this.onResize, 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._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.DeviceModeEnabled.record();
            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) 
    {
        this._scale = scale;
        this._dipWidth = dipWidth ? Math.max(dipWidth, 1) : 0;
        this._dipHeight = dipHeight ? Math.max(dipHeight, 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();
        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, darkLineColor, gridSubStep);
        drawGrid(dipScrollX, dipScrollY, 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.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));
            context.fillRect(0, 0, visibleContentsWidth, visibleContentsHeight);
        }
    },
    _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;
        }
        var cssWidth = (this._dipWidth ? this._dipWidth : availableDip.width) / zoomFactor;
        var cssHeight = (this._dipHeight ? this._dipHeight : 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;
        if (this._cachedCssWidth !== cssWidth || this._cachedCssHeight !== cssHeight || !deviceInsets.isEqual(this._cachedDeviceInsets)) {
            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();
        }
        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;
        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._cachedDeviceInsets = deviceInsets;
        this._cachedZoomFactor = zoomFactor;
        this._cachedViewport = this._viewport;
        this._cachedDrawContentsSize = this._drawContentsSize;
        this._cachedMediaInspectorHeight = mediaInspectorHeight;
    },
    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.ToolbarButton(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 bandwidthElement = networkSection.createChild("div", "responsive-design-suite responsive-design-suite-top").createChild("div");
        var fieldsetElement = bandwidthElement.createChild("fieldset");
        var networkCheckbox = fieldsetElement.createChild("label");
        networkCheckbox.textContent = WebInspector.UIString("Network");
        new WebInspector.NetworkConditionsSelector(fieldsetElement.createChild("select"));
        var userAgentElement = networkSection.createChild("div", "responsive-design-suite").createChild("div");
        fieldsetElement = userAgentElement.createChild("fieldset");
        fieldsetElement.appendChild(WebInspector.SettingsUI.createSettingInputField("UA", WebInspector.overridesSupport.settings.userAgent, false, 0, "", undefined, false, false, WebInspector.UIString("No override")));
    },
    _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();
        this._warningMessage.textContent = message;
        this._warningInfobar.setVisible(!!message);
    },
    _showEmulationInDrawer: function() 
    {
        WebInspector.Revealer.reveal(WebInspector.overridesSupport);
    },
    _deviceModeSelected: function(device, mode) 
    {
        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");
        } 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(finishCallback) 
    {
        this._updateUI();
        finishCallback();
    },
    _pageScaleButtonClicked: function(increase, event) 
    {
        this._pageScaleFactorThrottler.schedule(updatePageScaleFactor.bind(this));
        function updatePageScaleFactor(finishCallback) 
        {
            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);
            }
            finishCallback();
        }
    },
    _resetPageScale: function() 
    {
        this._pageScaleFactorThrottler.schedule(updatePageScaleFactor.bind(this));
        function updatePageScaleFactor(finishCallback) 
        {
            if (this._target && this._viewport && this._viewport.minimumPageScaleFactor <= 1 && this._viewport.maximumPageScaleFactor >= 1)
                this._target.emulationAgent().setPageScaleFactor(1);
            finishCallback();
        }
    },
    __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._tabbedPane = new WebInspector.TabbedPane();
    this._tabbedPane.setShrinkableTabs(false);
    this._tabbedPane.setVerticalTabLayout(true);
    new WebInspector.OverridesView.DeviceTab().appendAsTab(this._tabbedPane);
    new WebInspector.OverridesView.MediaTab().appendAsTab(this._tabbedPane);
    new WebInspector.OverridesView.NetworkTab().appendAsTab(this._tabbedPane);
    new WebInspector.OverridesView.SensorsTab().appendAsTab(this._tabbedPane);
    this._lastSelectedTabSetting = WebInspector.settings.createSetting("lastSelectedEmulateTab", "device");
    this._tabbedPane.selectTab(this._lastSelectedTabSetting.get());
    this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);
    this._tabbedPane.show(this.element);
    var resetButtonElement = createTextButton(WebInspector.UIString("Reset"), WebInspector.overridesSupport.reset.bind(WebInspector.overridesSupport));
    resetButtonElement.id = "overrides-reset-button";
    this._tabbedPane.appendAfterTabStrip(resetButtonElement);
    var disableButtonElement = createTextButton(WebInspector.UIString("Disable"), this._toggleEmulationEnabled.bind(this), "overrides-disable-button");
    disableButtonElement.id = "overrides-disable-button";
    this._tabbedPane.appendAfterTabStrip(disableButtonElement);
    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 = {
    _tabSelected: function(event) 
    {
        this._lastSelectedTabSetting.set(this._tabbedPane.selectedTabId);
    },
    _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._tabbedPane.element.classList.toggle("hidden", !WebInspector.overridesSupport.emulationEnabled());
        this._splashScreenElement.classList.toggle("hidden", WebInspector.overridesSupport.emulationEnabled() || !WebInspector.overridesSupport.canEmulate());
    },
    __proto__: WebInspector.VBox.prototype
}
WebInspector.OverridesView.Tab = function(id, name, settings, predicates) 
{
    WebInspector.VBox.call(this);
    this._id = id;
    this._name = name;
    this._settings = settings;
    this._predicates = predicates || [];
    for (var i = 0; i < settings.length; ++i)
        settings[i].addChangeListener(this.updateActiveState, this);
}
WebInspector.OverridesView.Tab.prototype = {
    appendAsTab: function(tabbedPane) 
    {
        this._tabbedPane = tabbedPane;
        tabbedPane.appendTab(this._id, this._name, this);
        this.updateActiveState();
    },
    updateActiveState: function() 
    {
        if (!this._tabbedPane)
            return;
        var active = false;
        for (var i = 0; !active && i < this._settings.length; ++i)
            active = this._settings[i].get();
        for (var i = 0; !active && i < this._predicates.length; ++i)
            active = this._predicates[i]();
        this._tabbedPane.toggleTabClass(this._id, "overrides-activate", active);
    },
    _createSettingCheckbox: function(name, setting, callback) 
    {
        var checkbox = WebInspector.SettingsUI.createSettingCheckbox(name, setting, true);
        function changeListener(value) 
        {
            callback(setting.get());
        }
        if (callback)
            setting.addChangeListener(changeListener);
        return checkbox;
    },
    __proto__: WebInspector.VBox.prototype
}
WebInspector.OverridesView.DeviceTab = function() 
{
    WebInspector.OverridesView.Tab.call(this, "device", WebInspector.UIString("Device"), [WebInspector.overridesSupport.settings.emulateResolution, WebInspector.overridesSupport.settings.deviceScaleFactor, WebInspector.overridesSupport.settings.emulateMobile]);
    this.element.classList.add("overrides-device");
    this.element.appendChild(this._createDeviceElement());
    var footnote = this.element.createChild("p", "help-footnote");
    footnote.appendChild(WebInspector.linkifyDocumentationURLAsNode("device-mode", WebInspector.UIString("More information about screen emulation")));
}
WebInspector.OverridesView.DeviceTab.prototype = {
    _createDeviceElement: function() 
    {
        var fieldsetElement = createElement("fieldset");
        fieldsetElement.id = "metrics-override-section";
        var deviceModelElement = fieldsetElement.createChild("p", "overrides-device-model-section");
        deviceModelElement.createChild("span").textContent = WebInspector.UIString("Model:");
        var rotateButton = createElement("button");
        rotateButton.textContent = " \u21C4 ";
        var deviceSelect = new WebInspector.DeviceSelect(rotateButton,null );
        deviceModelElement.appendChild(deviceSelect.element);
        var emulateResolutionCheckbox = WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Emulate screen resolution"), WebInspector.overridesSupport.settings.emulateResolution, true);
        fieldsetElement.appendChild(emulateResolutionCheckbox);
        var resolutionFieldset = WebInspector.SettingsUI.createSettingFieldset(WebInspector.overridesSupport.settings.emulateResolution);
        fieldsetElement.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 = this._createSettingCheckbox(WebInspector.UIString("Emulate mobile"), WebInspector.overridesSupport.settings.emulateMobile);
        mobileCheckbox.title = WebInspector.UIString("Enable meta viewport, overlay scrollbars, text autosizing and default 980px body width");
        fieldsetElement.appendChild(mobileCheckbox);
        fieldsetElement.appendChild(this._createSettingCheckbox(WebInspector.UIString("Shrink to fit"), WebInspector.overridesSupport.settings.deviceFitWindow));
        return fieldsetElement;
    },
    __proto__: WebInspector.OverridesView.Tab.prototype
}
WebInspector.OverridesView.MediaTab = function() 
{
    var settings = [WebInspector.overridesSupport.settings.overrideCSSMedia];
    WebInspector.OverridesView.Tab.call(this, "media", WebInspector.UIString("Media"), settings);
    this.element.classList.add("overrides-media");
    this._createMediaEmulationFragment();
}
WebInspector.OverridesView.MediaTab.prototype = {
    _createMediaEmulationFragment: function() 
    {
        var checkbox = WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("CSS media"), WebInspector.overridesSupport.settings.overrideCSSMedia, true);
        var fieldsetElement = WebInspector.SettingsUI.createSettingFieldset(WebInspector.overridesSupport.settings.overrideCSSMedia);
        var mediaSelectElement = fieldsetElement.createChild("select");
        var mediaTypes = WebInspector.CSSStyleModel.MediaTypes;
        var defaultMedia = WebInspector.overridesSupport.settings.emulatedCSSMedia.get();
        for (var i = 0; i < mediaTypes.length; ++i) {
            var mediaType = mediaTypes[i];
            if (mediaType === "all") {
                continue;
            }
            var option = createElement("option");
            option.text = mediaType;
            option.value = mediaType;
            mediaSelectElement.add(option);
            if (mediaType === defaultMedia)
                mediaSelectElement.selectedIndex = mediaSelectElement.options.length - 1;
        }
        mediaSelectElement.addEventListener("change", this._emulateMediaChanged.bind(this, mediaSelectElement), false);
        var fragment = createDocumentFragment();
        fragment.appendChild(checkbox);
        fragment.appendChild(fieldsetElement);
        this.element.appendChild(fragment);
    },
    _emulateMediaChanged: function(select) 
    {
        var media = select.options[select.selectedIndex].value;
        WebInspector.overridesSupport.settings.emulatedCSSMedia.set(media);
    },
    __proto__: WebInspector.OverridesView.Tab.prototype
}
WebInspector.OverridesView.NetworkTab = function() 
{
    WebInspector.OverridesView.Tab.call(this, "network", WebInspector.UIString("Network"), [], [this._userAgentOverrideEnabled.bind(this)]);
    this.element.classList.add("overrides-network");
    this._createUserAgentSection();
}
WebInspector.OverridesView.NetworkTab.prototype = {
    _userAgentOverrideEnabled: function() 
    {
        return !!WebInspector.overridesSupport.settings.userAgent.get();
    },
    _createUserAgentSection: function() 
    {
        var fieldsetElement = this.element.createChild("fieldset");
        fieldsetElement.createChild("label").textContent = WebInspector.UIString("Spoof user agent:");
        var selectAndInput = WebInspector.OverridesUI.createUserAgentSelectAndInput();
        fieldsetElement.appendChild(selectAndInput.select);
        fieldsetElement.appendChild(selectAndInput.input);
        WebInspector.overridesSupport.settings.userAgent.addChangeListener(this.updateActiveState, this);
    },
    __proto__: WebInspector.OverridesView.Tab.prototype
}
WebInspector.OverridesView.SensorsTab = function() 
{
    WebInspector.OverridesView.Tab.call(this, "sensors", WebInspector.UIString("Sensors"), [WebInspector.overridesSupport.settings.overrideGeolocation, WebInspector.overridesSupport.settings.overrideDeviceOrientation, WebInspector.overridesSupport.settings.emulateTouch]);
    this.element.classList.add("overrides-sensors");
    this.registerRequiredCSS("emulation/accelerometer.css");
    this.element.appendChild(this._createSettingCheckbox(WebInspector.UIString("Emulate touch screen"), WebInspector.overridesSupport.settings.emulateTouch, undefined));
    this._appendGeolocationOverrideControl();
    this._apendDeviceOrientationOverrideControl();
}
WebInspector.OverridesView.SensorsTab.prototype = {
    _appendGeolocationOverrideControl: function() 
    {
        const geolocationSetting = WebInspector.overridesSupport.settings.geolocationOverride.get();
        var geolocation = WebInspector.OverridesSupport.GeolocationPosition.parseSetting(geolocationSetting);
        this.element.appendChild(this._createSettingCheckbox(WebInspector.UIString("Emulate geolocation coordinates"), WebInspector.overridesSupport.settings.overrideGeolocation, this._geolocationOverrideCheckboxClicked.bind(this)));
        this.element.appendChild(this._createGeolocationOverrideElement(geolocation));
        this._geolocationOverrideCheckboxClicked(WebInspector.overridesSupport.settings.overrideGeolocation.get());
    },
    _geolocationOverrideCheckboxClicked: function(enabled) 
    {
        if (enabled && !this._latitudeElement.value)
            this._latitudeElement.focus();
    },
    _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 = WebInspector.SettingsUI.createSettingFieldset(WebInspector.overridesSupport.settings.overrideGeolocation);
        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;
    },
    _apendDeviceOrientationOverrideControl: function() 
    {
        const deviceOrientationSetting = WebInspector.overridesSupport.settings.deviceOrientationOverride.get();
        var deviceOrientation = WebInspector.OverridesSupport.DeviceOrientation.parseSetting(deviceOrientationSetting);
        this.element.appendChild(this._createSettingCheckbox(WebInspector.UIString("Accelerometer"), WebInspector.overridesSupport.settings.overrideDeviceOrientation, this._deviceOrientationOverrideCheckboxClicked.bind(this)));
        this.element.appendChild(this._createDeviceOrientationOverrideElement(deviceOrientation));
        this._deviceOrientationOverrideCheckboxClicked(WebInspector.overridesSupport.settings.overrideDeviceOrientation.get());
    },
    _deviceOrientationOverrideCheckboxClicked: function(enabled) 
    {
        if (enabled && !this._alphaElement.value)
            this._alphaElement.focus();
    },
    _applyDeviceOrientationUserInput: function() 
    {
        this._setDeviceOrientation(WebInspector.OverridesSupport.DeviceOrientation.parseUserInput(this._alphaElement.value.trim(), this._betaElement.value.trim(), this._gammaElement.value.trim()), WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource.UserInput);
    },
    _resetDeviceOrientation: function() 
    {
        this._setDeviceOrientation(new WebInspector.OverridesSupport.DeviceOrientation(0,0,0), WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource.ResetButton);
    },
    _setDeviceOrientation: function(deviceOrientation, modificationSource) 
    {
        if (!deviceOrientation)
            return;
        if (modificationSource != WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource.UserInput) {
            this._alphaElement.value = deviceOrientation.alpha;
            this._betaElement.value = deviceOrientation.beta;
            this._gammaElement.value = deviceOrientation.gamma;
        }
        if (modificationSource != WebInspector.OverridesView.SensorsTab.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 = WebInspector.SettingsUI.createSettingFieldset(WebInspector.overridesSupport.settings.overrideDeviceOrientation);
        fieldsetElement.id = "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.OverridesView.SensorsTab.DeviceOrientationModificationSource.UserDrag);
        return false;
    },
    _onBoxDragStart: function(event) 
    {
        if (!WebInspector.overridesSupport.settings.overrideDeviceOrientation.get())
            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.OverridesView.Tab.prototype
}
WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource = {
    UserInput: "userInput",
    UserDrag: "userDrag",
    ResetButton: "resetButton"
}
WebInspector.OverridesView.Revealer = function() 
{}
WebInspector.OverridesView.Revealer.prototype = {
    reveal: function(overridesSupport) 
    {
        WebInspector.inspectorView.showViewInDrawer("emulation");
        return Promise.resolve();
    }
};
WebInspector.HelpScreenUntilReload = function(debuggerModel, title, message) 
{
    WebInspector.HelpScreen.call(this, title);
    this._debuggerModel = debuggerModel;
    var p = this.helpContentElement.createChild("p");
    p.classList.add("help-section");
    p.textContent = message;
    this._debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this.hide, this);
}
WebInspector.HelpScreenUntilReload.prototype = {
    willHide: function() 
    {
        this._debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this.hide, this);
        WebInspector.HelpScreen.prototype.willHide.call(this);
    },
    __proto__: WebInspector.HelpScreen.prototype
};
WebInspector.AdvancedApp = function() 
{
    WebInspector.dockController.addEventListener(WebInspector.DockController.Events.BeforeDockSideChanged, this._openToolboxWindow, this);
}
;
WebInspector.AdvancedApp.prototype = {
    presentUI: function(document) 
    {
        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, false), this);
        this._responsiveDesignView = new WebInspector.ResponsiveDesignView(this._inspectedPagePlaceholder);
        this._rootSplitWidget.setMainWidget(this._responsiveDesignView);
        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();
    },
    _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.defaultView);
        WebInspector.installComponentRootStyles((toolboxDocument.body));
        WebInspector.ContextMenu.installHandler(toolboxDocument);
        var rootView = new WebInspector.RootView();
        var inspectedPagePlaceholder = new WebInspector.InspectedPagePlaceholder();
        inspectedPagePlaceholder.addEventListener(WebInspector.InspectedPagePlaceholder.Events.Update, this._onSetInspectedPageBounds.bind(this, true));
        this._toolboxResponsiveDesignView = new WebInspector.ResponsiveDesignView(inspectedPagePlaceholder);
        this._toolboxResponsiveDesignView.show(rootView.element);
        rootView.attachToDocument(toolboxDocument);
        this._updatePageResizer();
    },
    inspectorFrontendHost: function() 
    {
        return window.InspectorFrontendHost;
    },
    _updatePageResizer: function() 
    {
        if (this._isDocked())
            this._responsiveDesignView.updatePageResizer();
        else if (this._toolboxResponsiveDesignView)
            this._toolboxResponsiveDesignView.updatePageResizer();
    },
    _onBeforeDockSideChange: function(event) 
    {
        if ((event.data.to) === WebInspector.DockController.State.Undocked && this._toolboxResponsiveDesignView) {
            this._rootSplitWidget.hideSidebar();
            this._inspectedPagePlaceholder.update();
        }
        this._changingDockSide = true;
    },
    _onDockSideChange: function(event) 
    {
        this._updatePageResizer();
        var toDockSide = event ? (event.data.to) : WebInspector.dockController.dockSide();
        if (toDockSide === WebInspector.DockController.State.Undocked) {
            this._updateForUndocked();
        } else if (this._toolboxResponsiveDesignView && event && (event.data.from) === WebInspector.DockController.State.Undocked) {
            this._rootSplitWidget.hideSidebar();
        } else {
            this._updateForDocked(toDockSide);
        }
    },
    _onAfterDockSideChange: function(event) 
    {
        if (!this._changingDockSide)
            return;
        this._changingDockSide = false;
        if ((event.data.from) === WebInspector.DockController.State.Undocked) {
            this._updateForDocked((event.data.to));
        }
        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(toolbox, event) 
    {
        if (this._changingDockSide || (this._isDocked() === toolbox))
            return;
        if (!window.innerWidth || !window.innerHeight)
            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.RenderingOptions = function() 
{
    this._setterNames = new Map();
    this._mapSettingToSetter(WebInspector.moduleSetting("showPaintRects"), "setShowPaintRects");
    this._mapSettingToSetter(WebInspector.moduleSetting("showDebugBorders"), "setShowDebugBorders");
    this._mapSettingToSetter(WebInspector.moduleSetting("showFPSCounter"), "setShowFPSCounter");
    this._mapSettingToSetter(WebInspector.moduleSetting("continuousPainting"), "setContinuousPaintingEnabled");
    this._mapSettingToSetter(WebInspector.moduleSetting("showScrollBottleneckRects"), "setShowScrollBottleneckRects");
    WebInspector.targetManager.observeTargets(this, WebInspector.Target.Type.Page);
}
WebInspector.RenderingOptions.prototype = {
    targetAdded: function(target) 
    {
        var settings = this._setterNames.keysArray();
        for (var i = 0; i < settings.length; ++i) {
            var setting = settings[i];
            if (setting.get()) {
                var setterName = this._setterNames.get(setting);
                target.renderingAgent()[setterName](true);
            }
        }
    },
    targetRemoved: function(target) 
    {},
    _mapSettingToSetter: function(setting, setterName) 
    {
        this._setterNames.set(setting, setterName);
        setting.addChangeListener(changeListener);
        function changeListener() 
        {
            var targets = WebInspector.targetManager.targets(WebInspector.Target.Type.Page);
            for (var i = 0; i < targets.length; ++i)
                targets[i].renderingAgent()[setterName](setting.get());
        }
    }
}
WebInspector.RenderingOptions.View = function() 
{
    WebInspector.VBox.call(this);
    this.registerRequiredCSS("ui/helpScreen.css");
    this.element.classList.add("help-indent-labels");
    var div = this.element.createChild("div", "settings-tab help-content help-container help-no-columns");
    div.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show paint rectangles"), WebInspector.moduleSetting("showPaintRects")));
    div.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show composited layer borders"), WebInspector.moduleSetting("showDebugBorders")));
    div.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show FPS meter"), WebInspector.moduleSetting("showFPSCounter")));
    div.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Enable continuous page repainting"), WebInspector.moduleSetting("continuousPainting")));
    var child = WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show potential scroll bottlenecks"), WebInspector.moduleSetting("showScrollBottleneckRects"));
    child.title = 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.");
    div.appendChild(child);
}
WebInspector.RenderingOptions.View.prototype = {
    __proto__: WebInspector.VBox.prototype
};
WebInspector.SimpleApp = function() 
{}
;
WebInspector.SimpleApp.prototype = {
    presentUI: function(document) 
    {
        var rootView = new WebInspector.RootView();
        WebInspector.inspectorView.show(rootView.element);
        WebInspector.inspectorView.showInitialPanel();
        rootView.attachToDocument(document);
    }
};
WebInspector.SimpleAppProvider = function() 
{}
;
WebInspector.SimpleAppProvider.prototype = {
    createApp: function() 
    {
        return new WebInspector.SimpleApp();
    }
};
;WebInspector.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);
        }
    }
    InspectorBackend.connection().runAfterPendingDispatches(invokeMethod);
}
;
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._pauseButton.element.click();
            this._waitForScriptPause(this.releaseControl.bind(this));
        }
        this.takeControl();
    }
    ;
    TestSuite.prototype.testNetworkSize = function() 
    {
        var test = this;
        function finishResource(resource, finishTime) 
        {
            test.assertEquals(219, resource.transferSize, "Incorrect total encoded data length");
            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(219, resource.transferSize, "Incorrect total encoded data length");
            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");
            test.assertEquals(164, resource.responseHeadersText.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.testReattachAfterCrash = function() 
    {
        var target = WebInspector.targetManager.mainTarget();
        target.pageAgent().navigate("about:crash");
        target.pageAgent().navigate("about:blank");
        target.runtimeModel.addEventListener(WebInspector.RuntimeModel.Events.ExecutionContextCreated, this.releaseControl, this);
    }
    ;
    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() 
    {
        function isReady() 
        {
            return WebInspector.targetManager.targets().length == 2;
        }
        if (isReady())
            return;
        this.takeControl();
        this.addSniffer(WebInspector.TargetManager.prototype, "addTarget", targetAdded.bind(this));
        function targetAdded() 
        {
            if (isReady()) {
                this.releaseControl();
                return;
            }
            this.addSniffer(WebInspector.TargetManager.prototype, "addTarget", targetAdded.bind(this));
        }
    }
    ;
    TestSuite.prototype.testPauseInSharedWorkerInitialization2 = function() 
    {
        var debuggerModel = WebInspector.DebuggerModel.fromTarget(WebInspector.targetManager.mainTarget());
        if (debuggerModel.isPaused())
            return;
        this._waitForScriptPause(this.releaseControl.bind(this));
        this.takeControl();
    }
    ;
    TestSuite.prototype.enableTouchEmulation = function() 
    {
        WebInspector.overridesSupport._emulateTouchEventsInTarget(WebInspector.targetManager.mainTarget(), true, "mobile");
    }
    ;
    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 redString = [255, 0, 0, 255].join(",");
            var greenString = [0, 255, 0, 255].join(",");
            var blueString = [0, 0, 255, 255].join(",");
            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 (color === redString)
                    redCount++;
                else if (color === greenString)
                    greenCount++;
                else if (color === blueString)
                    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.toggleTimelineButton.element.click();
        }
        );
        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.toggleTimelineButton.element.click();
        }
        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.project().isServiceProject();
        }
        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.createKeyEvent = function(keyIdentifier) 
    {
        var evt = document.createEvent("KeyboardEvent");
        evt.initKeyboardEvent("keydown", true, true, null , keyIdentifier, "");
        return evt;
    }
    ;
    TestSuite.prototype.runTest = function(name) 
    {
        var test = WebInspector.TestBase.prototype.runTest.bind(this, name);
        if (TestSuite._populatedInterface)
            test();
        else
            TestSuite._pendingTest = test;
    }
    ;
    function runTests() 
    {
        TestSuite._populatedInterface = true;
        var test = TestSuite._pendingTest;
        delete TestSuite._pendingTest;
        if (test)
            test();
    }
    WebInspector.notifications.addEventListener(WebInspector.NotificationService.Events.InspectorAgentEnabledForTests, runTests);
    return new TestSuite();
}
if (window.uiTests)
    window.uiTests.testSuiteReady(createTestSuite, WebInspector.TestBase);
;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.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));
    },
    _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);
        function trackPrefsObject(changes) 
        {
            if (!Object.keys(prefs).length) {
                InspectorFrontendHost.clearPreferences();
                return;
            }
            for (var change of changes) {
                var name = change.name;
                if (name in prefs)
                    InspectorFrontendHost.setPreference(name, prefs[name]);
                else
                    InspectorFrontendHost.removePreference(name);
            }
        }
        Object.observe(prefs, trackPrefsObject);
        WebInspector.settings = new WebInspector.Settings(prefs);
        if (!InspectorFrontendHost.isUnderTest())
            new WebInspector.VersionController().updateVersion();
    },
    _initializeExperiments: function(prefs) 
    {
        Runtime.experiments.register("accessibilityInspection", "Accessibility Inspection");
        Runtime.experiments.register("animationInspection", "Animation Inspection");
        Runtime.experiments.register("applyCustomStylesheet", "Allow custom UI themes");
        Runtime.experiments.register("blackboxJSFramesOnTimeline", "Blackbox JavaScript frames on Timeline", true);
        Runtime.experiments.register("timelineDetailsChart", "Costly functions view in Timeline details", true);
        Runtime.experiments.register("customObjectFormatters", "Custom object formatters", 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("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("securityPanel", "Security panel", true);
        Runtime.experiments.register("serviceWorkersInPageFrontend", "Service workers in DevTools for page");
        Runtime.experiments.register("serviceWorkersInResources", "Service workers in Resources panel", true);
        Runtime.experiments.register("showPrimaryLoadWaterfallInNetworkTimeline", "Show primary load waterfall in Network timeline", true);
        Runtime.experiments.register("stepIntoAsync", "Step into async");
        Runtime.experiments.register("timelineInvalidationTracking", "Timeline invalidation tracking", true);
        Runtime.experiments.register("timelineTracingJSProfile", "Timeline tracing based JS profiler", true);
        Runtime.experiments.register("timelineFlowEvents", "Timeline flow events", true);
        Runtime.experiments.register("inlineVariableValues", "Display variable values inline while debugging");
        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("elements/") !== -1)
                Runtime.experiments.enableForTest("animationInspection");
            if (testPath.indexOf("layers/") !== -1)
                Runtime.experiments.enableForTest("layersPanel");
            if (testPath.indexOf("service-workers/") !== -1)
                Runtime.experiments.enableForTest("serviceWorkersInResources");
            if (testPath.indexOf("timeline/") !== -1 || testPath.indexOf("layers/") !== -1)
                Runtime.experiments.enableForTest("layersPanel");
        }
        Runtime.experiments.setDefaultExperiments(["inlineVariableValues", "serviceWorkersInPageFrontend"]);
    },
    _createAppUI: function() 
    {
        console.timeStamp("Main._createApp");
        WebInspector.initializeUIUtils(window);
        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.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("Console"));
        WebInspector.shortcutsScreen.section(WebInspector.UIString("Elements Panel"));
        WebInspector.fileManager = new WebInspector.FileManager();
        WebInspector.isolatedFileSystemManager = new WebInspector.IsolatedFileSystemManager();
        WebInspector.workspace = new WebInspector.Workspace(WebInspector.isolatedFileSystemManager.mapping());
        WebInspector.networkMapping = new WebInspector.NetworkMapping(WebInspector.workspace,WebInspector.isolatedFileSystemManager.mapping());
        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.fileSystemWorkspaceBinding = new WebInspector.FileSystemWorkspaceBinding(WebInspector.isolatedFileSystemManager,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.ContentScriptProjectDecorator();
        new WebInspector.ExecutionContextSelector(WebInspector.targetManager,WebInspector.context);
        var autoselectPanel = WebInspector.UIString("a panel chosen automatically");
        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.WorkspaceController(WebInspector.workspace);
        new WebInspector.RenderingOptions();
        new WebInspector.Main.PauseListener();
        new WebInspector.Main.InspectedNodeRevealer();
        new WebInspector.ThrottlingIndicator();
        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);
        if (!Runtime.queryParam("isSharedWorker"))
            WebInspector.inspectElementModeController = new WebInspector.InspectElementModeController();
        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));
        }
        setTimeout(this._createConnection.bind(this), 0);
        function handleQueryParam(value, handler) 
        {
            handler.handleQueryParam(value);
        }
    },
    _createConnection: function() 
    {
        console.timeStamp("Main._createConnection");
        InspectorBackend.loadFromJSONIfNeeded("../protocol.json");
        if (Runtime.queryParam("ws")) {
            var ws = "ws://" + Runtime.queryParam("ws");
            InspectorBackendClass.WebSocketConnection.Create(ws, this._connectionEstablished.bind(this));
            return;
        }
        if (!InspectorFrontendHost.isHostedMode()) {
            this._connectionEstablished(new InspectorBackendClass.MainConnection());
            return;
        }
        this._connectionEstablished(new InspectorBackendClass.StubConnection());
    },
    _connectionEstablished: function(connection) 
    {
        console.timeStamp("Main._connectionEstablished");
        connection.addEventListener(InspectorBackendClass.Connection.Events.Disconnected, onDisconnected);
        function onDisconnected(event) 
        {
            if (WebInspector._disconnectedScreenWithReasonWasShown)
                return;
            new WebInspector.RemoteDebuggingTerminatedScreen(event.data.reason).showModal();
        }
        InspectorBackend.setConnection(connection);
        var targetType = Runtime.queryParam("isSharedWorker") ? WebInspector.Target.Type.ServiceWorker : WebInspector.Target.Type.Page;
        WebInspector.targetManager.createTarget(WebInspector.UIString("Main"), targetType, connection, null , this._mainTargetCreated.bind(this));
    },
    _mainTargetCreated: function(target) 
    {
        console.timeStamp("Main._mainTargetCreated");
        this._mainTarget = (target);
        this._registerShortcuts();
        this._mainTarget.registerInspectorDispatcher(this);
        if (this._mainTarget.isServiceWorker())
            this._mainTarget.runtimeAgent().run();
        WebInspector.overridesSupport.init(this._mainTarget, overridesReady);
        function overridesReady() 
        {
            if (!WebInspector.dockController.canDock() && WebInspector.overridesSupport.emulationEnabled())
                WebInspector.inspectorView.showViewInDrawer("emulation", true);
            target.inspectorAgent().enable(inspectorAgentEnableCallback);
        }
        function inspectorAgentEnableCallback() 
        {
            console.timeStamp("Main.inspectorAgentEnableCallback");
            WebInspector.notifications.dispatchEventToListeners(WebInspector.NotificationService.Events.InspectorAgentEnabledForTests);
            setTimeout(function() {
                WebInspector.extensionServer.initializeExtensions();
            }
            , 0);
        }
    },
    _registerForwardedShortcuts: function() 
    {
        var forwardedActions = ["main.reload", "main.hard-reload", "main.toggle-dock"];
        var actionKeys = WebInspector.shortcutRegistry.keysForActions(forwardedActions).map(WebInspector.KeyboardShortcut.keyCodeAndModifiersFromKey);
        actionKeys.push({
            keyCode: WebInspector.KeyboardShortcut.Keys.F8.code
        });
        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 inspectElementModeShortcut = WebInspector.InspectElementModeController.createShortcut();
        section.addKey(inspectElementModeShortcut, 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.currentInstance() && 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);
    },
    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") {
            object.functionDetails(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;
        new WebInspector.RemoteDebuggingTerminatedScreen(reason).showModal();
    },
    targetCrashed: function() 
    {
        var debuggerModel = WebInspector.DebuggerModel.fromTarget(this._mainTarget);
        if (!debuggerModel)
            return;
        (new WebInspector.HelpScreenUntilReload(debuggerModel,WebInspector.UIString("Inspected target disconnected"),WebInspector.UIString("Inspected target disconnected. Once it reloads we will attach to it automatically."))).showModal();
    },
    evaluateForTestInFrontend: function(callId, script) 
    {
        WebInspector.evaluateForTestInFrontend(callId, script);
    }
}
WebInspector.reload = function() 
{
    if (WebInspector.dockController.canDock() && WebInspector.dockController.dockSide() === WebInspector.DockController.State.Undocked)
        InspectorFrontendHost.setIsDocked(true, function() {}
        );
    window.location.reload();
}
WebInspector.Main.ReloadActionDelegate = function() 
{}
WebInspector.Main.ReloadActionDelegate.prototype = {
    handleAction: function(context, actionId) 
    {
        switch (actionId) {
        case "main.reload":
            WebInspector.Main._reloadPage(false);
            break;
        case "main.hard-reload":
            WebInspector.Main._reloadPage(true);
            break;
        case "main.debug-reload":
            WebInspector.reload();
            break;
        }
    }
}
WebInspector.Main.ZoomActionDelegate = function() 
{}
WebInspector.Main.ZoomActionDelegate.prototype = {
    handleAction: function(context, actionId) 
    {
        if (InspectorFrontendHost.isHostedMode())
            return;
        switch (actionId) {
        case "main.zoom-in":
            InspectorFrontendHost.zoomIn();
            break;
        case "main.zoom-out":
            InspectorFrontendHost.zoomOut();
            break;
        case "main.zoom-reset":
            InspectorFrontendHost.resetZoom();
            break;
        }
    }
}
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 InspectorBackendClass.WebSocketConnection(ws,callback);
}
WebInspector.Main.WarningErrorCounter = function() 
{
    this._counter = new WebInspector.ToolbarCounter(["error-icon", "revokedError-icon", "warning-icon"]);
    WebInspector.Main.WarningErrorCounter._instanceForTest = this._counter;
    this._counter.addEventListener("click", showConsole);
    function showConsole() 
    {
        WebInspector.console.show();
    }
    WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared, this._updateErrorAndWarningCounts, this);
    WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded, this._updateErrorAndWarningCounts, this);
}
WebInspector.Main.WarningErrorCounter.prototype = {
    _updateErrorAndWarningCounts: 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._counter.setCounter("error-icon", errors, WebInspector.UIString(errors === 1 ? "%d error" : "%d errors", errors));
        this._counter.setCounter("revokedError-icon", revokedErrors, WebInspector.UIString(revokedErrors === 1 ? "%d handled promise rejection" : "%d handled promise rejections", revokedErrors));
        this._counter.setCounter("warning-icon", warnings, WebInspector.UIString(warnings === 1 ? "%d warning" : "%d warnings", warnings));
        WebInspector.inspectorView.toolbarItemResized();
    },
    item: function() 
    {
        return this._counter;
    }
}
WebInspector.ThrottlingIndicator = function() 
{
    var networkConditionsSetting = WebInspector.moduleSetting("networkConditions");
    networkConditionsSetting.addChangeListener(updateVisibility);
    updateVisibility();
    function updateVisibility() 
    {
        var throttlingEnabled = WebInspector.NetworkManager.IsThrottlingEnabled(networkConditionsSetting.get());
        WebInspector.inspectorView.setPanelIcon("network", throttlingEnabled ? "warning-icon" : "", WebInspector.UIString("Network throttling is enabled"));
    }
}
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.HelpScreen.call(this, WebInspector.UIString("Detached from the target"));
    var p = this.helpContentElement.createChild("p");
    p.classList.add("help-section");
    p.createChild("span").textContent = WebInspector.UIString("Remote debugging has been terminated with reason: ");
    p.createChild("span", "error-message").textContent = reason;
    p.createChild("br");
    p.createChild("span").textContent = WebInspector.UIString("Please re-attach to the new target.");
}
WebInspector.RemoteDebuggingTerminatedScreen.prototype = {
    __proto__: WebInspector.HelpScreen.prototype
}
WebInspector.WorkerTerminatedScreen = function() 
{
    WebInspector.HelpScreen.call(this, WebInspector.UIString("Inspected worker terminated"));
    var p = this.helpContentElement.createChild("p");
    p.classList.add("help-section");
    p.textContent = WebInspector.UIString("Inspected worker has terminated. Once it restarts we will attach to it automatically.");
}
WebInspector.WorkerTerminatedScreen.prototype = {
    __proto__: WebInspector.HelpScreen.prototype
}
new WebInspector.Main();
;applicationDescriptor = [{
    "name": "ui_lazy"
}, {
    "name": "promises"
}, {
    "name": "accessibility"
}, {
    "name": "sources"
}, {
    "type": "remote",
    "name": "emulated_devices"
}, {
    "name": "audits"
}, {
    "type": "autostart",
    "name": "bindings"
}, {
    "name": "snippets"
}, {
    "name": "layers"
}, {
    "name": "console"
}, {
    "name": "network"
}, {
    "name": "components_lazy"
}, {
    "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": "autostart",
    "name": "host"
}, {
    "type": "autostart",
    "name": "emulation"
}, {
    "type": "autostart",
    "name": "ui"
}, {
    "type": "autostart",
    "name": "sdk"
}, {
    "type": "worker",
    "name": "temp_storage_shared_worker"
}, {
    "name": "settings"
}, {
    "type": "worker",
    "name": "heap_snapshot_worker"
}, {
    "name": "profiler"
}, {
    "type": "remote",
    "name": "screencast",
    "condition": "remoteFrontend"
}, {
    "type": "autostart",
    "name": "extensions"
}, {
    "type": "autostart",
    "name": "common"
}, {
    "type": "autostart",
    "name": "components"
}, {
    "name": "security"
}];
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 144px;\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 144px;\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/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 2px 0;\n    flex: none;\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    top: -1px;\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    top: -2px;\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/helpScreen.css"] = ".help-window-outer {\n    position: absolute !important;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    z-index: 2000;\n}\n\n.help-window-main {\n    color: white;\n    background-color: rgba(17, 17, 17, 0.85);\n    display: -webkit-flex;\n    -webkit-flex-direction: column;\n    border-top-width: 0;\n    border-radius: 10px;\n}\n\n.help-window-caption {\n    border-bottom: solid 1px rgb(153, 153, 153);\n    margin: 0 8px;\n    padding: 0 2px;\n    line-height: 28px;\n}\n\n.help-window-title {\n    font-size: 16px;\n    margin: 0;\n    padding-top: 1px;\n    margin-bottom: -1px;\n}\n\n.help-content {\n    overflow-y: auto;\n    overflow-x: hidden;\n    margin: 8px;\n    padding: 0 4px;\n    flex: auto;\n}\n\n.help-footnote {\n    border-top: 1px solid #EEEEEE;\n    margin: 0;\n    padding: 12px;\n}\n\n.help-window-main .help-container-wrapper::-webkit-scrollbar {\n    width: 11px;\n}\n\n.help-window-main .help-container-wrapper::-webkit-scrollbar-corner,\n.help-window-main .help-container-wrapper::-webkit-resizer {\n    display: none;\n}\n\n.help-window-main .help-container-wrapper::-webkit-scrollbar-thumb:vertical {\n    background: linear-gradient(to right, rgb(128, 128, 128), rgb(96, 96, 96) 40%, rgb(128, 128, 128));\n    border-radius: 5px;\n    min-height: 20px;\n}\n\n.help-window-main .help-container-wrapper::-webkit-scrollbar-thumb:vertical:hover,\n.help-window-main .help-container-wrapper::-webkit-scrollbar-thumb:vertical:active {\n    background: linear-gradient(to right, rgb(176, 176, 176), rgb(144, 144, 144) 40%, rgb(176, 176, 176));\n}\n\n.help-window-main .help-container-wrapper::-webkit-scrollbar-track:vertical {\n    background: linear-gradient(to right, rgb(10, 10, 10), rgb(32, 32, 32) 25%, rgb(32, 32, 32));\n    border-radius: 5px;\n}\n\n.help-close-button {\n    position: absolute;\n    top: 8px;\n    right: 8px;\n    z-index: 10;\n}\n\nbody.dock-to-bottom .help-content {\n    margin-bottom: 8px;\n}\n\n.help-container {\n    width: 100%;\n    -webkit-user-select: auto;\n    -webkit-column-width: 470px;\n}\n\n.help-no-columns {\n    -webkit-column-width: initial !important;\n}\n\n.help-block {\n    display: block;\n    padding-bottom: 9px;\n    width: 470px;\n    -webkit-column-break-inside: avoid;\n}\n\n.settings-tab.help-container {\n    -webkit-column-width: 410px;\n}\n\n.settings-tab .help-block {\n    width: 410px;\n    margin-left: 20px;\n}\n\n.settings-tab .field-error-message {\n    color: DarkRed;\n    height: 0; /* Avoid changing element height when content is set. */\n}\n\n.help-line {\n    padding-bottom: 5px;\n    margin-bottom: 5px;\n}\n\n.help-key-cell {\n    display: inline-block;\n    width: 270px;\n    text-align: right;\n}\n\n.help-cell {\n    display: inline-block;\n    width: 200px;\n    vertical-align: middle;\n}\n\n.help-section-title {\n    font-size: 120%;\n}\n\n.help-key {\n    padding: 0.1em 0.6em;\n    border: 1px solid #ccc;\n    font-size: 11px;\n    background-color: #f7f7f7;\n    color: #333;\n    box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px #ffffff inset;\n    border-radius: 3px;\n    display: inline-block;\n    margin: 0 0.1em;\n    text-shadow: 0 1px 0 #fff;\n    line-height: 1.5;\n    white-space: nowrap;\n    font-family: Lucida Grande, sans-serif;\n}\n\n.help-combine-keys,\n.help-key-delimiter {\n    font-size: 9px;\n}\n\n.help-combine-keys {\n    margin: 0 0.3em;\n}\n\n.help-key-delimiter {\n    margin: 0 0.5em;\n}\n\n.help-window-outer fieldset {\n    margin: 0;\n    padding: 0;\n    border: none;\n}\n\n.settings-tab label {\n    padding-right: 4px;\n    display: inline-flex;\n}\n\n#general-tab-content .help-block fieldset legend {\n    font-size: 14px;\n}\n\n.help-block p p {\n    padding-left: 30px;\n}\n\n.help-content p.help-section {\n    margin: 0 0 15px 0;\n}\n\n.settings-experiments-warning-subsection-warning {\n    color: rgb(200, 0, 0);\n}\n\n.settings-experiments-warning-subsection-message {\n    color: inherit;\n}\n\n.help-content input[type=checkbox] {\n    margin: 1px 7px 1px 2px;\n}\n\n.help-content option {\n    background-color: #EEEEEE;\n    color: #222;\n}\n\n#settings-screen .help-window-main{\n    color: rgb(48, 57, 66);\n    background-color: white;\n    border-radius: 0;\n}\n\n#settings-screen .help-window-main {\n    position: absolute;\n    top: 10px;\n    right: 10px;\n    bottom: 10px;\n    left: 10px;\n    height: initial;\n    padding: 11px 0 0 0;\n    box-shadow: 1px 1px 5px 2px rgba(128, 128, 128, 0.7);\n}\n\n#settings-screen .help-window-label {\n    font-size: 18px;\n    color: inherit;\n    padding: 1px 0 15px 17px;\n}\n\n.help-container-wrapper {\n    position: absolute;\n    top: 40px;\n    left: 15px;\n    right: 0;\n    bottom: 0;\n    overflow: auto;\n}\n\n.settings-tab.help-content {\n    margin: 0;\n    padding: 0;\n}\n\n.settings-tab input:not([type]),\n.settings-tab input[type=\"text\"] {\n    border: 1px solid rgb(213, 213, 213);\n    border-radius: 2px;\n    color: #444444;\n    padding: 3px;\n}\n\n.settings-tab input.numeric {\n    text-align: right;\n}\n\n.settings-tab-container {\n    flex: auto;\n    overflow: hidden;\n}\n\n.settings-tab-container header {\n    padding: 0 0 6px;\n    border-bottom: 1px solid #EEEEEE;\n}\n\n#tab-shortcuts {\n    margin-top: 25px !important;\n}\n\n#experiments-tab-content .help-container {\n    -webkit-column-width: 470px;\n}\n\n#experiments-tab-content .help-block {\n    width: 470px;\n}\n\n.settings-tab-container header > h3 {\n    font-size: 18px;\n    font-weight: normal;\n    margin: 0;\n    padding-bottom: 3px;\n}\n\n.settings-tab .help-section-title {\n    margin-left: -20px;\n    color: #222;\n}\n\n.settings-tab .help-block fieldset:disabled label:hover {\n    color: inherit;\n}\n\n.settings-tab .help-block label:hover {\n    color: #222;\n}\n\n.settings-tab p {\n    margin: 12px 0;\n}\n\n.settings-tab select {\n    margin-left: 10px;\n}\n\n#workspace-tab-content .settings-tab.help-content.help-container {\n    -webkit-column-width: initial;\n}\n\n\n#workspace-tab-content .button:hover {\n    opacity: 1.0 !important;\n}\n\n.settings-tab .settings-list-container {\n    background-color: white;\n    margin-bottom: 10px;\n}\n\n.settings-tab .settings-list {\n    border: 1px solid hsl(0, 0%, 85%);\n    border-radius: 2px;\n}\n\n.settings-tab .settings-list .settings-list-item .settings-list-item-contents {\n    width: 100%;\n    height: 40px;\n    -webkit-box-align: center;\n    -webkit-transition: 150ms background-color;\n    display: -webkit-box;\n    padding-right: 3px;\n}\n\n.settings-tab .settings-list .settings-list-item .settings-list-item-contents > :first-child {\n    -webkit-box-align: center;\n    -webkit-box-flex: 1;\n    -webkit-padding-end: 5px;\n    display: -webkit-box;\n}\n\n.settings-tab .settings-list .settings-list-item.selected:not(.editable) {\n    background-color: hsl(0, 0%, 82%);\n}\n\n.settings-tab .settings-list .settings-list-item:hover {\n    background-color: hsl(215, 54%, 93%);\n}\n\n.settings-tab .settings-list .settings-list-item.selected:not(.editable):hover {\n    background-color: hsl(215, 51%, 82%);\n}\n\n.settings-tab .settings-list .settings-list-item .remove-item-button {\n    -webkit-transition: 150ms opacity;\n    background-color: hsla(0, 0%, 0%, 0);\n    background-image: -webkit-image-set(\n        url(Images/settingsListRemove.png) 1x,\n        url(Images/settingsListRemove_2x.png) 2x);\n    background-size: 48px 16px;\n    border: none;\n    display: block;\n    height: 16px;\n    width: 16px;\n    opacity: 0;\n    pointer-events: none;\n}\n\n.settings-tab .settings-list .settings-list-item.selected .remove-item-button,\n.settings-tab .settings-list .settings-list-item:hover .remove-item-button {\n    opacity: 1;\n    pointer-events: auto;\n}\n\n.settings-tab .settings-list .settings-list-item .remove-item-button:hover {\n    background-position-x: -32px;\n}\n\n.settings-tab .settings-list .settings-list-item .remove-item-button:active {\n    background-position-x: -16px;\n}\n\n.settings-list-item-columns {\n    height: 100%;\n}\n\n.settings-tab .settings-list .settings-list-item .list-column {\n    displaY: -webkit-box;\n    -webkit-box-align: center;\n    padding-left: 5px;\n    padding-right: 2px;\n    box-sizing: border-box;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    height: 100%;\n}\n\n.settings-tab .settings-list .settings-list-item .list-column .list-column-editor {\n    width: 100%;\n}\n\n.settings-tab .settings-list .settings-list-item.add-list-item .remove-item-button {\n    visibility: hidden;\n}\n\n.settings-tab .settings-list .settings-list-item.editable .list-column .list-column-editor {\n    display: none;\n}\n\n.settings-tab .settings-list .settings-list-item.editable.item-editing .list-column .list-column-editor {\n    display: block;\n}\n\n.settings-tab .settings-list .settings-list-item.editable.item-editing .list-column .list-column-text {\n    display: none;\n}\n\n.settings-tab .settings-list .settings-list-item.editable.item-editing .list-column .list-column-editor.editable-item-error {\n    background-color: pink;\n}\n\ninput.list-column-editor {\n    border: 1px solid rgb(213, 213, 213);\n    border-radius: 2px;\n    color: #444444;\n    padding: 3px;\n}\nselect.list-column-editor {\n    padding: 2px;\n    margin-left: 0;\n}\n\n.settings-tab .settings-list .settings-list-item .file-system-path {\n    white-space: nowrap;\n    font-size: 12px;\n    padding-left: 6px;\n    padding-right: 5px;\n    -webkit-box-flex: 1;\n    color: hsl(210, 16%, 22%);\n}\n\n.settings-tab .settings-list .settings-list-item .file-system-path-name {\n    padding-right: 6px;\n    font-weight: bold;\n}\n\n.file-systems-list .settings-list-item .list-column.settings-list-column-path {\n    width: 100%;\n}\n\n.file-mappings-list .settings-list-item .list-column.settings-list-column-url {\n    width: 50%;\n}\n\n.file-mappings-list .settings-list-item .list-column.settings-list-column-path {\n    width: 50%;\n}\n\n.blackbox-patterns-list .settings-list-item .list-column.settings-list-column-pattern {\n    width: 50%;\n}\n\n.blackbox-patterns-list .settings-list-item .list-column.settings-list-column-value {\n    width: 50%;\n}\n\n.excluded-folders-list .settings-list-item .list-column.settings-list-column-path {\n    width: 100%;\n}\n\n.settings-tab .settings-list .settings-list-item.disabled .settings-list-column-pattern .list-column-text {\n    color: #666;\n    text-decoration: line-through;\n}\n\n.settings-dialog {\n    border-radius: 3px;\n    box-shadow: 0 4px 23px 5px rgba(0, 0, 0, 0.2), 0 2px 6px rgba(0,0,0,0.15);\n    display: -webkit-flex;\n    -webkit-flex-direction: column;\n    background: white;\n}\n\n.settings-dialog .dialog-contents {\n    display: flex;\n    flex-direction: column;\n}\n\n.settings-dialog .header {\n    flex: 0 0 auto;\n    color: #333;\n    font-size: 14px;\n    margin: 0;\n    padding: 14px 17px 14px;\n}\n\n.settings-dialog .contents {\n    flex: 1 1 auto;\n    padding: 0 17px;\n    overflow-x: hidden;\n    overflow-y: auto;\n}\n\n.settings-dialog .block-header {\n    color: black;\n    font-size: 1.2em;\n    margin-bottom: 0.8em;\n}\n\n.blackbox-dialog .columns-header {\n    color: black;\n    font-weight: bold;\n    margin-bottom: 0.4em;\n    display: -webkit-box;\n    padding: 0;\n}\n\n.blackbox-dialog .columns-header span {\n    width: 50%;\n    display: -webkit-box;\n}\n\n.blackbox-dialog .columns-header span + span {\n    margin-left: -7px\n}\n\n.blackbox-content-scripts {\n    padding: 0 0 14px 0;\n    margin-left: -4px;\n}\n\n.settings-dialog .done-button {\n    float: right;\n}\n\n.settings-glass-pane {\n    -webkit-box-align: center;\n    -webkit-box-orient: vertical;\n    -webkit-box-pack: center;\n    display: -webkit-box;\n    z-index: 2000 !important;\n    padding: 5px;\n    background-color: rgba(255, 255, 255, 0.4) !important;\n}\n\n.help-indent-labels label {\n    padding-left: 10px;\n}\n\n.dialog-contents .section {\n    min-width: 400px;\n}\n\n.settings-experiment-hidden {\n    display: none;\n}\n\n.settings-experiment-hidden label {\n    background-color: #ddd;\n}\n\n.settings-developer-mode .settings-experiment-hidden {\n    display: block;\n}\n\n/*# sourceURL=ui/helpScreen.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    padding: 4px 6px;\n    white-space: nowrap;\n    display: flex;\n    align-items: flex-start;\n    flex: auto;\n    border-bottom: 1px solid rgb(171, 171, 171);\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 .icon {\n    flex: none;\n}\n\n.infobar .content {\n    flex: auto;\n    padding-left: 3px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n\n.infobar .close-button {\n    flex: none;\n}\n\n.infobar .disable-button {\n    flex: none;\n    margin-right: 5px;\n    text-decoration: underline;\n    cursor: pointer;\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-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.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}\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/*# 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    /* 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;\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.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/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 144px;\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-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.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 144px;\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 144px;\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    border-bottom: 1px solid rgba(150, 150, 150, 0.9);\n    padding: 4px 0 4px 0;\n    border-radius: 4px;\n    background-color: white;\n    box-shadow: 0 5px 10px rgba(0, 0, 0, 0.25);\n}\n\n.soft-context-menu-item {\n    width: 100%;\n    line-height: 13px;\n    font-size: 14px;\n    border-top: 1px solid transparent;\n    border-bottom: 1px solid transparent;\n    padding: 2px 7px 2px 6px;\n    margin: 0 13px 0 0;\n    white-space: nowrap;\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(227, 227, 227);\n    pointer-events: none;\n}\n\n.soft-context-menu-item-mouse-over {\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    border-top: 1px solid rgb(90, 131, 236);\n    border-bottom: 1px solid rgb(18, 88, 233);\n    background-image: linear-gradient(to bottom, rgb(100, 140, 243), rgb(36, 101, 243));\n}\n\n.soft-context-menu-item-checkmark {\n    color: rgb(108, 108, 108);\n    pointer-events: none;\n}\n\n.soft-context-menu-item-submenu-arrow {\n    color: #222;\n    float: right;\n    pointer-events: none;\n}\n\n.soft-context-menu-item-mouse-over .soft-context-menu-item-checkmark {\n    color: white;\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 144px;\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.vertical {\n    flex-direction: column;\n    height: auto;\n    width: 26px;\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: 26px;\n    left: -2px;\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-text {\n    white-space: nowrap;\n    overflow: hidden;\n    margin-left: 6px;\n    -webkit-user-select: text;\n}\n\n.toolbar-item:active {\n    position: relative;\n    z-index: 200;\n}\n\n.toolbar-item:hover .toolbar-button-text {\n    color: #333;\n}\n\n.toolbar-item .toolbar-button-text {\n    font-weight: bold;\n    color: #5a5a5a;\n}\n\n.long-click-glyph {\n    background-color: #595959;\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-position: -288px -48px;\n    -webkit-mask-size: 352px 144px;\n    z-index: 1;\n    width: 32px;\n    height: 26px;\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\nbutton.toolbar-item {\n    width: 26px;\n}\n\nbutton.toolbar-item.toggled-on .glyph {\n    background-color: rgb(66, 129, 235) !important;\n}\n\nbutton.toolbar-item:enabled:hover .glyph {\n    background-color: #333;\n}\n\n.toolbar-counter:hover,\n.toolbar-item.checkbox:hover {\n    color: #333;\n}\n\nbutton.toolbar-item:active .glyph {\n    background-color: #5a5a5a !important;\n}\n\nbutton.toolbar-item:disabled {\n    background-position: 0 0 !important;\n}\n\nbutton.toolbar-item:disabled .glyph {\n    opacity: 0.5 !important;\n}\n\nbutton.toolbar-item.extension {\n    background-image: none;\n}\n\n.toolbar-select-container {\n    display: inline-flex;\n    flex-shrink: 0;\n    margin-right: 6px;\n}\n\n.toolbar-select-arrow {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 144px;\n    opacity: 0.7;\n    width: 12px;\n    height: 12px;\n    background-position: -18px -96px;\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-select-arrow {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\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 rgb(216, 216, 216);\n}\n\ninput.toolbar-item:focus,\ninput.toolbar-item:hover {\n    border: solid 1px rgb(202, 202, 202);\n}\n\nselect.toolbar-item {\n    min-width: 48px;\n    color: rgb(48, 48, 48);\n    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;\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    line-height: 22px;\n}\n\n.toolbar-item.checkbox {\n    padding: 0 5px 0 2px;\n}\n\n.toolbar-item > .glyph {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-size: 352px 144px;\n    background-color: #5a5a5a;\n    z-index: 1;\n    width: 32px;\n    height: 24px;\n}\n\n.toolbar-item > .glyph {\n    position: relative;\n    left: -3px;\n}\n\n.toolbar-item > .long-click-glyph {\n    left: -5px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.toolbar-item > .glyph {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.toolbar-item.emulate-active {\n    background-color: rgb(163,163,163);\n}\n\n.toolbar-counter {\n    cursor: pointer;\n    padding: 0 2px;\n    min-width: 26px;\n}\n\n.toolbar-counter-item {\n    margin-left: 6px;\n}\n\n.toolbar-counter-item label {\n    cursor: inherit;\n}\n\n.toolbar-counter-item.toolbar-counter-item-first {\n    margin-left: 0;\n}\n\n.toolbar-counter-item > div {\n    margin-right: 2px;\n}\n\n.toolbar-divider {\n    background-color: #ccc;\n    width: 1px;\n    margin: 2px 4px;\n    height: 17px;\n}\n\n.toolbar-group-label {\n    margin-left: 5px;\n    margin-right: 3px;\n    color: #888;\n}\n\n/* Predefined items */\n\n.dock-toolbar-item.toggled-undocked .glyph {\n    -webkit-mask-position: 0 -48px;\n}\n\n.dock-toolbar-item.toggled-bottom .glyph {\n    -webkit-mask-position: -32px -24px;\n}\n\n.dock-toolbar-item.toggled-right .glyph {\n    -webkit-mask-position: -256px -48px;\n}\n\n.dock-toolbar-item.toggled-left .glyph {\n    -webkit-mask-position: -32px -120px;\n}\n\n.settings-toolbar-item .glyph {\n    -webkit-mask-position: -160px -24px;\n}\n\n.node-search-toolbar-item .glyph {\n    -webkit-mask-position: -224px -24px;\n}\n\n.emulation-toolbar-item .glyph {\n    -webkit-mask-position: -160px 1px;\n}\n\n.emulation-toolbar-item.warning::after {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 144px;\n    width: 10px;\n    height: 12px;\n    content: \"\";\n    position: absolute;\n    right: 3px;\n    bottom: 2px;\n    background-position: -202px -107px;\n    z-index: 1;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.emulation-toolbar-item.warning::before {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.delete-toolbar-item .glyph {\n    -webkit-mask-position: -128px 0;\n}\n\n.clear-toolbar-item .glyph {\n    -webkit-mask-position: -64px 0;\n}\n\n.refresh-toolbar-item .glyph {\n    -webkit-mask-position: 0 0;\n}\n\n.focus-toolbar-item .glyph {\n    -webkit-mask-position: -96px 0;\n}\n\n.console-toolbar-item .glyph {\n    -webkit-mask-position: -64px -24px;\n}\n\n.large-list-toolbar-item .glyph {\n    -webkit-mask-position: -224px 0;\n}\n\n.screencast-toolbar-item .glyph {\n    -webkit-mask-position: -160px 0;\n}\n\n.record-toolbar-item .glyph {\n    -webkit-mask-position: -288px 0;\n}\n\nbutton.record-toolbar-item.toggled-on .glyph {\n    -webkit-mask-position: -288px -24px;\n    background-color: rgb(216, 0, 0) !important;\n}\n\n.camera-toolbar-item .glyph {\n    -webkit-mask-position: -96px -24px;\n}\n\n.last-step-toolbar-item .glyph {\n    -webkit-mask-position: 0 -72px;\n}\n\n.first-step-toolbar-item .glyph {\n    -webkit-mask-position: 0 -72px;\n    transform: rotate(180deg);\n    top: 0;\n    bottom: 0;\n}\n\n.step-in-toolbar-item .glyph {\n    -webkit-mask-position: -64px -72px;\n}\n\n.step-out-toolbar-item .glyph {\n    -webkit-mask-position: -96px -72px;\n}\n\n.step-over-toolbar-item .glyph {\n    -webkit-mask-position: -128px -72px;\n}\n\n.step-backwards-toolbar-item .glyph {\n    -webkit-mask-position: -128px -72px;\n    transform: scaleX(-1);\n}\n\n.play-toolbar-item .glyph {\n    -webkit-mask-position: -64px -48px;\n}\n\n.play-backwards-toolbar-item .glyph {\n    -webkit-mask-position: -64px -48px;\n    transform: scaleX(-1);\n}\n\n.pause-on-exceptions-toolbar-item .glyph {\n    -webkit-mask-position: -256px 0;\n}\n\n.pause-on-exceptions-toolbar-item.toggled-on .glyph {\n    background-color: rgb(66, 129, 235);\n}\n\n.pause-toolbar-item .glyph {\n    -webkit-mask-position: -32px -72px;\n}\n\n.pause-toolbar-item.toggled-on .glyph {\n    -webkit-mask-position: 0 -72px;\n}\n\n.breakpoint-toolbar-item.toggled-on .glyph {\n    -webkit-mask-position: -32px 0;\n}\n\n.breakpoint-toolbar-item .glyph {\n    -webkit-mask-position: 0 -24px;\n}\n\n.format-toolbar-item .glyph {\n    -webkit-mask-position: -256px -24px;\n}\n\n.format-toolbar-item.toggled .glyph {\n    background-color: rgb(66, 129, 235);\n}\n\n.garbage-collect-toolbar-item .glyph {\n    -webkit-mask-position: -128px -24px;\n}\n\n.histogram-toolbar-item .glyph {\n    -webkit-mask-position: -160px -48px;\n}\n\n.flame-chart-toolbar-item .glyph {\n    -webkit-mask-position: -192px -48px;\n}\n\n.filter-toolbar-item > .glyph {\n    -webkit-mask-position: -32px -48px;\n}\n\n.filter-toolbar-item.toggled-shown .glyph {\n    background-color: rgb(66, 129, 235) !important;\n}\n\n.filter-toolbar-item.toggled-shown {\n    background-color: #f3f3f3;\n}\n\n.filter-toolbar-item.toggled-active .glyph {\n    background-color: rgb(216, 0, 0);\n}\n\n.waterfall-toolbar-item .glyph {\n    -webkit-mask-position: -128px -48px;\n}\n\n.pan-toolbar-item .glyph {\n    -webkit-mask-position: -98px -120px;\n}\n\n.center-toolbar-item .glyph {\n    -webkit-mask-position: -128px -120px;\n}\n\n.rotate-toolbar-item .glyph {\n    -webkit-mask-position: -160px -120px;\n}\n\n.pin-toolbar-item .glyph {\n    -webkit-mask-position: -256px -120px;\n}\n\n.pin-toolbar-item.toggled-on,\n.animation-toolbar-item.toggled-on {\n    background-color: #f3f3f3;\n}\n\n.animation-toolbar-item .glyph {\n    -webkit-mask-position: -192px -120px;\n}\n\n.eyedropper-toolbar-item .glyph {\n    -webkit-mask-position: -288px -120px;\n}\n\n.add-toolbar-item .glyph {\n    -webkit-mask-position: -224px -120px;\n}\n\n.pause-outline-toolbar-item .glyph {\n    -webkit-mask-position: -320px 0px;\n}\n\n.replay-outline-toolbar-item .glyph {\n    -webkit-mask-position: -320px -24px;\n}\n\n.play-outline-toolbar-item .glyph {\n    -webkit-mask-position: -320px -48px;\n}\n\n.case-sensitive-search-toolbar-item.toggled-on .toolbar-button-text {\n    color: rgb(94, 146, 233);\n}\n\n.regex-search-toolbar-item.toggled-on {\n    color: rgb(66, 129, 235);\n}\n\n.regex-search-toolbar-item.toggled-on .toolbar-button-text {\n    color: rgb(94, 146, 233);\n}\n\n.playback-rate-button.toggled-on > .toolbar-button-text {\n    color: rgb(66, 129, 235);\n}\n\nbutton.playback-rate-button {\n    width: auto;\n    margin-right: 10px;\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 {\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/*# 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: hidden;\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    color: #333;\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: white;\n    border-top-color: #ccc;\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    padding: 0 7px;\n    cursor: default;\n    height: 25px;\n}\n\n.tabbed-pane-header-tabs-drop-down-container:hover {\n    background-color: rgba(105, 105, 105, 0.1);\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}\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    height: 2px;\n    position: absolute;\n    bottom: -1px;\n    background-color: #3E82F7;\n    left: 0;\n    z-index: 50;\n    transform-origin: 0 0;\n    transition: transform 150ms cubic-bezier(0, 0, 0.2, 1);\n    visibility: hidden;\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/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.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    position: absolute;\n    left: 0;\n    right: 0;\n    height: 17px;\n    z-index: -1;\n    margin-top: -1px;\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    overflow: hidden;\n    min-height: 17px;\n    padding-top: 2px;\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    float: left;\n    -webkit-user-select: none;\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-size: 352px 144px;\n    content: \"a\";\n    color: transparent;\n    text-shadow: none;\n    position: relative;\n    margin-right: 1px;\n    top: 1px;\n    width: 10px;\n    height: 10px;\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\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 144px;\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 144px;\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.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}\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}\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    text-decoration: underline;\n    cursor: pointer;\n    display: inline;\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: 17px;\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 {\n    background-color: #f3f3f3;\n    flex: 0 0 27px;\n    overflow: visible;\n}\n\n.tabbed-pane-header-tab,\n.tabbed-pane-header-tab.selected {\n    height: 26px;\n    margin: 0;\n    background: none;\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 {\n    color: #5a5a5a;\n}\n\n.tabbed-pane-header-tab.selected {\n    color: #333;\n    border-width: 0 2px 0 2px;\n    -webkit-border-image: url(Images/toolbarItemSelected.png) 0 2 0 2;\n}\n\n/*# sourceURL=components/inspectorViewTabbedPane.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}\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}\n\n.object-properties-section li {\n    min-height: inherit;\n    line-height: 12px;\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\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: nowrap;\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/*# sourceURL=components/objectValue.css */";
Runtime.cachedResources["emulation/accelerometer.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.accelerometer-stage {\n    -webkit-perspective: 700px;\n    -webkit-perspective-origin: 50% 50%;\n    width: 200px;\n    height: 130px;\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\n.accelerometer-inputs-cell {\n    vertical-align: top;\n}\n\n.accelerometer-reset-button {\n    width: 100%;\n}\n/*# sourceURL=emulation/accelerometer.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    overflow-y: auto;\n    margin: 10px 0;\n    border: 1px solid rgb(231, 231, 231);\n    flex: auto 0 1;\n}\n\n.devices-settings-tab .devices-custom-separator {\n    background: rgb(231, 231, 231);\n    height: 1px;\n}\n\n.devices-settings-tab .devices-list-item {\n    padding: 3px 0 3px 10px;\n    height: 30px;\n    display: flex;\n    align-items: center;\n    cursor: pointer;\n}\n\n.devices-settings-tab .devices-list-item:hover {\n    background: hsl(0, 0%, 85%);\n}\n\n.devices-settings-tab .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-settings-tab .devices-list-title {\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    flex: auto;\n    -webkit-user-select: none;\n    color: #aaa;\n}\n\n.devices-settings-tab .device-list-item-show .devices-list-title {\n    color: #222;\n}\n\n.devices-settings-tab .devices-list-remove,\n.devices-settings-tab .devices-list-edit {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 144px;\n    width: 32px;\n    height: 24px;\n    opacity: 0.5;\n    cursor: pointer;\n    flex: none;\n    visibility: hidden;\n}\n\n.devices-settings-tab .devices-list:not(.devices-list-editing) .devices-list-item:hover .devices-list-remove,\n.devices-settings-tab .devices-list-item:hover .devices-list-edit {\n    visibility: visible;\n}\n\n.devices-settings-tab .devices-list-remove:hover,\n.devices-settings-tab .devices-list-edit:hover {\n    opacity: 0.7;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.devices-settings-tab .devices-list-remove,\n.devices-settings-tab .devices-list-edit {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.devices-settings-tab .devices-list-remove {\n    background-position: -128px -24px;\n}\n\n.devices-settings-tab .devices-list-edit {\n    background-position: -224px -72px;\n}\n\n.devices-settings-tab .devices-edit-container {\n    display: flex;\n    flex-direction: row;\n    align-items: flex-start;\n    flex: none;\n    padding: 10px 20px 0 10px;\n    background: hsl(0, 0%, 95%);\n}\n\n.devices-settings-tab .devices-edit-checkbox {\n    height: 12px;\n    width: 12px;\n    margin: 3px 5px 2px 2px;\n    flex: none;\n    cursor: pointer;\n}\n\n.devices-settings-tab .devices-edit-fields {\n    flex: auto;\n    display: flex;\n    flex-direction: column;\n    align-items: stretch;\n}\n\n.devices-settings-tab .devices-edit-fields input {\n    margin-right: 10px;\n}\n\n.devices-settings-tab .devices-edit-fields input.error-input {\n    outline: auto 2px red;\n    background-color: white;\n}\n\n.devices-settings-tab .devices-edit-fields > * {\n    flex: none;\n    margin-bottom: 10px;\n}\n\n.devices-settings-tab .devices-edit-buttons > button {\n    margin-right: 10px;\n}\n\n\n/*# sourceURL=emulation/devicesSettingsTab.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-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 select {\n    width: 145px;\n}\n\n.responsive-design-section-network input[type='text'] {\n    width: 182px;\n    margin-left: 5px;\n    text-overflow: ellipsis;\n}\n\n.responsive-design-section-network input[type='text'],\n.responsive-design-section-network input[type='text']::-webkit-input-placeholder,\n.responsive-design-section-network select {\n    color: rgb(65, 175, 255);\n}\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/* 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/* Media query bars */\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    border-radius: 2px;\n}\n\n.media-inspector-marker-inactive {\n    -webkit-filter: brightness(80%);\n}\n\n.media-inspector-marker:hover {\n    top: -1px;\n    bottom: -1px;\n    -webkit-filter: brightness(115%) !important;\n}\n\n.media-inspector-marker-max-width {\n    background: linear-gradient(to left, rgba(255, 255, 255, 0.27), rgba(0,0,0,0) 30px), linear-gradient(to bottom, rgb(72, 139, 249), rgb(26, 113, 233));\n    border-radius: 0 2px 2px 0;\n    border-right: 2px solid rgb(171, 207, 255);\n}\n\n.media-inspector-marker-min-max-width {\n    background: linear-gradient(to right, rgba(255, 255, 255, 0.27), rgba(0,0,0,0) 30px), linear-gradient(to left, rgba(255, 255, 255, 0.27), rgba(0,0,0,0) 30px), linear-gradient(to bottom, rgb(112, 174, 7), rgb(3, 131, 0));\n    border-radius: 2px;\n    border-left: 2px solid rgb(80, 226, 40);\n    border-right: 2px solid rgb(80, 226, 40);\n}\n\n.media-inspector-marker-min-max-width:hover {\n    z-index: 1;\n}\n\n.media-inspector-marker-min-width {\n    background: linear-gradient(to right, rgba(255, 255, 255, 0.27), rgba(0,0,0,0) 30px), linear-gradient(to bottom, rgb(222, 129, 30), rgb(204, 104, 31));\n    border-radius: 2px 0 0 2px;\n    border-left: 2px solid rgb(255, 181, 142);\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}\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: #eee;\n    position: absolute;\n    top: 1px;\n    bottom: 0;\n    font-size: 10px;\n    text-shadow: rgba(0, 0, 0, 0.6) 1px 1px;\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/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    padding: 0 0 5px 15px;\n}\n\n.overrides-view fieldset p {\n    display: inline-block;\n    padding: 0;\n    margin: 0;\n    border: 0;\n}\n\n.overrides-view fieldset 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/* Network tab */\n\n.overrides-network fieldset {\n    padding-top: 5px;\n}\n\n.overrides-network fieldset p {\n    width: 100%;\n    margin-left: 2px;\n}\n\n.overrides-network fieldset select {\n    margin: 5px 0;\n}\n\n.overrides-network fieldset p label {\n    cursor: default;\n    margin-right: 5px;\n}\n\n.overrides-network fieldset input[type='text'] {\n    display: block;\n    width: 100%;\n    max-width: 400px;\n    min-width: 176px;\n    margin: 5px 0;\n}\n\n/* Device tab */\n\n.overrides-device {\n    width: 100%;\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 button {\n    margin: 0 3px;\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    margin-bottom: 15px;\n    white-space: nowrap;\n}\n\n.overrides-device .overrides-device-model-section > span {\n    padding: 0 10px 0 3px;\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/* Media tab */\n\n.overrides-media > label {\n    margin-bottom: 4px;\n}\n\n/* Sensors tab */\n\n.overrides-sensors > label {\n    margin-bottom: 10px;\n}\n\n.overrides-device, .overrides-media, .overrides-network, .overrides-sensors {\n    flex: none !important;\n}\n\n.overrides-sensors input {\n    text-align: right;\n}\n\n.tabbed-pane-header-tab.overrides-activate {\n    opacity: 0.8;\n}\n\n.tabbed-pane-header-tab.overrides-activate .tabbed-pane-header-tab-title::after {\n    padding-left: 3px;\n    content: \"\\2713\";\n    color: rgb(25, 100, 228);\n}\n\n.tabbed-pane-header-tab.overrides-activate.selected {\n    opacity: 1;\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: none;\n    padding: 0 0 1px 3px;\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 144px;\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    padding: 10px 10px;\n    flex: auto;\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-reset-button,\n#overrides-disable-button {\n    margin: 9px 0 0 17px;\n    display: block;\n    width: 60px;\n}\n\n.overrides-enable-button {\n    margin: 4px !important;\n}\n\n/*# sourceURL=emulation/overrides.css */";
Runtime.startApplication("inspector");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值