{"version":3,"sources":["packages/platform-browser/platform-browser-testing.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","platformBrowser","testing","core","common","this","BrowserDetection","ua","_overrideUa","Object","defineProperty","prototype","get","ɵgetDOM","getUserAgent","enumerable","configurable","setup","_ua","indexOf","isAndroid","isIE","isIOS7","ɵglobal","customElements","document","registerElement","RegExp","hasOwnProperty","createElement","attachShadow","createShadowRoot","createNgZone","NgZone","enableLongStackTrace","shouldCoalesceEventChangeDetection","BrowserTestingModule","platformBrowserTesting","createPlatformFactory","platformCore","provide","PLATFORM_INITIALIZER","useValue","initBrowserTests","ɵBrowserDomAdapter","makeCurrent","multi","ɵ0","decorators","type","NgModule","args","BrowserModule","providers","APP_ID","ɵELEMENT_PROBE_PROVIDERS","useFactory","ɵangular_packages_platform_browser_testing_testing_a","value"],"mappings":"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","sourcesContent":["/**\n * @license Angular v11.2.14\n * (c) 2010-2021 Google LLC. https://angular.io/\n * License: MIT\n */\n\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/platform-browser'), require('@angular/common')) :\n    typeof define === 'function' && define.amd ? define('@angular/platform-browser/testing', ['exports', '@angular/core', '@angular/platform-browser', '@angular/common'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.platformBrowser = global.ng.platformBrowser || {}, global.ng.platformBrowser.testing = {}), global.ng.core, global.ng.platformBrowser, global.ng.common));\n}(this, (function (exports, core, platformBrowser, common) { 'use strict';\n\n    /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n    /* global Reflect, Promise */\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b)\n                if (b.hasOwnProperty(p))\n                    d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    function __extends(d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    }\n    var __assign = function () {\n        __assign = Object.assign || function __assign(t) {\n            for (var s, i = 1, n = arguments.length; i < n; i++) {\n                s = arguments[i];\n                for (var p in s)\n                    if (Object.prototype.hasOwnProperty.call(s, p))\n                        t[p] = s[p];\n            }\n            return t;\n        };\n        return __assign.apply(this, arguments);\n    };\n    function __rest(s, e) {\n        var t = {};\n        for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n                t[p] = s[p];\n        if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                    t[p[i]] = s[p[i]];\n            }\n        return t;\n    }\n    function __decorate(decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\")\n            r = Reflect.decorate(decorators, target, key, desc);\n        else\n            for (var i = decorators.length - 1; i >= 0; i--)\n                if (d = decorators[i])\n                    r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    }\n    function __param(paramIndex, decorator) {\n        return function (target, key) { decorator(target, key, paramIndex); };\n    }\n    function __metadata(metadataKey, metadataValue) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\")\n            return Reflect.metadata(metadataKey, metadataValue);\n    }\n    function __awaiter(thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try {\n                step(generator.next(value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function rejected(value) { try {\n                step(generator[\"throw\"](value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    }\n    function __generator(thisArg, body) {\n        var _ = { label: 0, sent: function () { if (t[0] & 1)\n                throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n        return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () { return this; }), g;\n        function verb(n) { return function (v) { return step([n, v]); }; }\n        function step(op) {\n            if (f)\n                throw new TypeError(\"Generator is already executing.\");\n            while (_)\n                try {\n                    if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)\n                        return t;\n                    if (y = 0, t)\n                        op = [op[0] & 2, t.value];\n                    switch (op[0]) {\n                        case 0:\n                        case 1:\n                            t = op;\n                            break;\n                        case 4:\n                            _.label++;\n                            return { value: op[1], done: false };\n                        case 5:\n                            _.label++;\n                            y = op[1];\n                            op = [0];\n                            continue;\n                        case 7:\n                            op = _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                        default:\n                            if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                                _ = 0;\n                                continue;\n                            }\n                            if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {\n                                _.label = op[1];\n                                break;\n                            }\n                            if (op[0] === 6 && _.label < t[1]) {\n                                _.label = t[1];\n                                t = op;\n                                break;\n                            }\n                            if (t && _.label < t[2]) {\n                                _.label = t[2];\n                                _.ops.push(op);\n                                break;\n                            }\n                            if (t[2])\n                                _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                    }\n                    op = body.call(thisArg, _);\n                }\n                catch (e) {\n                    op = [6, e];\n                    y = 0;\n                }\n                finally {\n                    f = t = 0;\n                }\n            if (op[0] & 5)\n                throw op[1];\n            return { value: op[0] ? op[1] : void 0, done: true };\n        }\n    }\n    var __createBinding = Object.create ? (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });\n    }) : (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        o[k2] = m[k];\n    });\n    function __exportStar(m, exports) {\n        for (var p in m)\n            if (p !== \"default\" && !exports.hasOwnProperty(p))\n                __createBinding(exports, m, p);\n    }\n    function __values(o) {\n        var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n        if (m)\n            return m.call(o);\n        if (o && typeof o.length === \"number\")\n            return {\n                next: function () {\n                    if (o && i >= o.length)\n                        o = void 0;\n                    return { value: o && o[i++], done: !o };\n                }\n            };\n        throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n    }\n    function __read(o, n) {\n        var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n        if (!m)\n            return o;\n        var i = m.call(o), r, ar = [], e;\n        try {\n            while ((n === void 0 || n-- > 0) && !(r = i.next()).done)\n                ar.push(r.value);\n        }\n        catch (error) {\n            e = { error: error };\n        }\n        finally {\n            try {\n                if (r && !r.done && (m = i[\"return\"]))\n                    m.call(i);\n            }\n            finally {\n                if (e)\n                    throw e.error;\n            }\n        }\n        return ar;\n    }\n    function __spread() {\n        for (var ar = [], i = 0; i < arguments.length; i++)\n            ar = ar.concat(__read(arguments[i]));\n        return ar;\n    }\n    function __spreadArrays() {\n        for (var s = 0, i = 0, il = arguments.length; i < il; i++)\n            s += arguments[i].length;\n        for (var r = Array(s), k = 0, i = 0; i < il; i++)\n            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n                r[k] = a[j];\n        return r;\n    }\n    ;\n    function __await(v) {\n        return this instanceof __await ? (this.v = v, this) : new __await(v);\n    }\n    function __asyncGenerator(thisArg, _arguments, generator) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var g = generator.apply(thisArg, _arguments || []), i, q = [];\n        return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n        function verb(n) { if (g[n])\n            i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n        function resume(n, v) { try {\n            step(g[n](v));\n        }\n        catch (e) {\n            settle(q[0][3], e);\n        } }\n        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n        function fulfill(value) { resume(\"next\", value); }\n        function reject(value) { resume(\"throw\", value); }\n        function settle(f, v) { if (f(v), q.shift(), q.length)\n            resume(q[0][0], q[0][1]); }\n    }\n    function __asyncDelegator(o) {\n        var i, p;\n        return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n        function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\n    }\n    function __asyncValues(o) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var m = o[Symbol.asyncIterator], i;\n        return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }\n    }\n    function __makeTemplateObject(cooked, raw) {\n        if (Object.defineProperty) {\n            Object.defineProperty(cooked, \"raw\", { value: raw });\n        }\n        else {\n            cooked.raw = raw;\n        }\n        return cooked;\n    }\n    ;\n    var __setModuleDefault = Object.create ? (function (o, v) {\n        Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    }) : function (o, v) {\n        o[\"default\"] = v;\n    };\n    function __importStar(mod) {\n        if (mod && mod.__esModule)\n            return mod;\n        var result = {};\n        if (mod != null)\n            for (var k in mod)\n                if (Object.hasOwnProperty.call(mod, k))\n                    __createBinding(result, mod, k);\n        __setModuleDefault(result, mod);\n        return result;\n    }\n    function __importDefault(mod) {\n        return (mod && mod.__esModule) ? mod : { default: mod };\n    }\n    function __classPrivateFieldGet(receiver, privateMap) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to get private field on non-instance\");\n        }\n        return privateMap.get(receiver);\n    }\n    function __classPrivateFieldSet(receiver, privateMap, value) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to set private field on non-instance\");\n        }\n        privateMap.set(receiver, value);\n        return value;\n    }\n\n    var BrowserDetection = /** @class */ (function () {\n        function BrowserDetection(ua) {\n            this._overrideUa = ua;\n        }\n        Object.defineProperty(BrowserDetection.prototype, \"_ua\", {\n            get: function () {\n                if (typeof this._overrideUa === 'string') {\n                    return this._overrideUa;\n                }\n                return common.ɵgetDOM() ? common.ɵgetDOM().getUserAgent() : '';\n            },\n            enumerable: false,\n            configurable: true\n        });\n        BrowserDetection.setup = function () {\n            return new BrowserDetection(null);\n        };\n        Object.defineProperty(BrowserDetection.prototype, \"isFirefox\", {\n            get: function () {\n                return this._ua.indexOf('Firefox') > -1;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(BrowserDetection.prototype, \"isAndroid\", {\n            get: function () {\n                return this._ua.indexOf('Mozilla/5.0') > -1 && this._ua.indexOf('Android') > -1 &&\n                    this._ua.indexOf('AppleWebKit') > -1 && this._ua.indexOf('Chrome') == -1 &&\n                    this._ua.indexOf('IEMobile') == -1;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(BrowserDetection.prototype, \"isEdge\", {\n            get: function () {\n                return this._ua.indexOf('Edge') > -1;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(BrowserDetection.prototype, \"isIE\", {\n            get: function () {\n                return this._ua.indexOf('Trident') > -1;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(BrowserDetection.prototype, \"isWebkit\", {\n            get: function () {\n                return this._ua.indexOf('AppleWebKit') > -1 && this._ua.indexOf('Edge') == -1 &&\n                    this._ua.indexOf('IEMobile') == -1;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(BrowserDetection.prototype, \"isIOS7\", {\n            get: function () {\n                return (this._ua.indexOf('iPhone OS 7') > -1 || this._ua.indexOf('iPad OS 7') > -1) &&\n                    this._ua.indexOf('IEMobile') == -1;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(BrowserDetection.prototype, \"isSlow\", {\n            get: function () {\n                return this.isAndroid || this.isIE || this.isIOS7;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(BrowserDetection.prototype, \"isChromeDesktop\", {\n            get: function () {\n                return this._ua.indexOf('Chrome') > -1 && this._ua.indexOf('Mobile Safari') == -1 &&\n                    this._ua.indexOf('Edge') == -1;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(BrowserDetection.prototype, \"isOldChrome\", {\n            // \"Old Chrome\" means Chrome 3X, where there are some discrepancies in the Intl API.\n            // Android 4.4 and 5.X have such browsers by default (respectively 30 and 39).\n            get: function () {\n                return this._ua.indexOf('Chrome') > -1 && this._ua.indexOf('Chrome/3') > -1 &&\n                    this._ua.indexOf('Edge') == -1;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(BrowserDetection.prototype, \"supportsCustomElements\", {\n            get: function () {\n                return (typeof core.ɵglobal.customElements !== 'undefined');\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(BrowserDetection.prototype, \"supportsDeprecatedCustomCustomElementsV0\", {\n            get: function () {\n                return (typeof document.registerElement !== 'undefined');\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(BrowserDetection.prototype, \"supportsRegExUnicodeFlag\", {\n            get: function () {\n                return RegExp.prototype.hasOwnProperty('unicode');\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(BrowserDetection.prototype, \"supportsShadowDom\", {\n            get: function () {\n                var testEl = document.createElement('div');\n                return (typeof testEl.attachShadow !== 'undefined');\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(BrowserDetection.prototype, \"supportsDeprecatedShadowDomV0\", {\n            get: function () {\n                var testEl = document.createElement('div');\n                return (typeof testEl.createShadowRoot !== 'undefined');\n            },\n            enumerable: false,\n            configurable: true\n        });\n        return BrowserDetection;\n    }());\n    var browserDetection = BrowserDetection.setup();\n    function dispatchEvent(element, eventType) {\n        var evt = common.ɵgetDOM().getDefaultDocument().createEvent('Event');\n        evt.initEvent(eventType, true, true);\n        common.ɵgetDOM().dispatchEvent(element, evt);\n    }\n    function createMouseEvent(eventType) {\n        var evt = common.ɵgetDOM().getDefaultDocument().createEvent('MouseEvent');\n        evt.initEvent(eventType, true, true);\n        return evt;\n    }\n    function el(html) {\n        return getContent(createTemplate(html)).firstChild;\n    }\n    function normalizeCSS(css) {\n        return css.replace(/\\s+/g, ' ')\n            .replace(/:\\s/g, ':')\n            .replace(/'/g, '\"')\n            .replace(/ }/g, '}')\n            .replace(/url\\((\\\"|\\s)(.+)(\\\"|\\s)\\)(\\s*)/g, function () {\n            var match = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                match[_i] = arguments[_i];\n            }\n            return \"url(\\\"\" + match[2] + \"\\\")\";\n        })\n            .replace(/\\[(.+)=([^\"\\]]+)\\]/g, function () {\n            var match = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                match[_i] = arguments[_i];\n            }\n            return \"[\" + match[1] + \"=\\\"\" + match[2] + \"\\\"]\";\n        });\n    }\n    function getAttributeMap(element) {\n        var res = new Map();\n        var elAttrs = element.attributes;\n        for (var i = 0; i < elAttrs.length; i++) {\n            var attrib = elAttrs.item(i);\n            res.set(attrib.name, attrib.value);\n        }\n        return res;\n    }\n    var _selfClosingTags = ['br', 'hr', 'input'];\n    function stringifyElement(el /** TODO #9100 */) {\n        var e_1, _a;\n        var result = '';\n        if (common.ɵgetDOM().isElementNode(el)) {\n            var tagName = el.tagName.toLowerCase();\n            // Opening tag\n            result += \"<\" + tagName;\n            // Attributes in an ordered way\n            var attributeMap = getAttributeMap(el);\n            var sortedKeys = Array.from(attributeMap.keys()).sort();\n            try {\n                for (var sortedKeys_1 = __values(sortedKeys), sortedKeys_1_1 = sortedKeys_1.next(); !sortedKeys_1_1.done; sortedKeys_1_1 = sortedKeys_1.next()) {\n                    var key = sortedKeys_1_1.value;\n                    var lowerCaseKey = key.toLowerCase();\n                    var attValue = attributeMap.get(key);\n                    if (typeof attValue !== 'string') {\n                        result += \" \" + lowerCaseKey;\n                    }\n                    else {\n                        // Browsers order style rules differently. Order them alphabetically for consistency.\n                        if (lowerCaseKey === 'style') {\n                            attValue = attValue.split(/; ?/).filter(function (s) { return !!s; }).sort().map(function (s) { return s + \";\"; }).join(' ');\n                        }\n                        result += \" \" + lowerCaseKey + \"=\\\"\" + attValue + \"\\\"\";\n                    }\n                }\n            }\n            catch (e_1_1) { e_1 = { error: e_1_1 }; }\n            finally {\n                try {\n                    if (sortedKeys_1_1 && !sortedKeys_1_1.done && (_a = sortedKeys_1.return)) _a.call(sortedKeys_1);\n                }\n                finally { if (e_1) throw e_1.error; }\n            }\n            result += '>';\n            // Children\n            var childrenRoot = templateAwareRoot(el);\n            var children = childrenRoot ? childrenRoot.childNodes : [];\n            for (var j = 0; j < children.length; j++) {\n                result += stringifyElement(children[j]);\n            }\n            // Closing tag\n            if (_selfClosingTags.indexOf(tagName) == -1) {\n                result += \"</\" + tagName + \">\";\n            }\n        }\n        else if (isCommentNode(el)) {\n            result += \"<!--\" + el.nodeValue + \"-->\";\n        }\n        else {\n            result += el.textContent;\n        }\n        return result;\n    }\n    function createNgZone() {\n        return new core.NgZone({ enableLongStackTrace: true, shouldCoalesceEventChangeDetection: false });\n    }\n    function isCommentNode(node) {\n        return node.nodeType === Node.COMMENT_NODE;\n    }\n    function isTextNode(node) {\n        return node.nodeType === Node.TEXT_NODE;\n    }\n    function getContent(node) {\n        if ('content' in node) {\n            return node.content;\n        }\n        else {\n            return node;\n        }\n    }\n    function templateAwareRoot(el) {\n        return common.ɵgetDOM().isElementNode(el) && el.nodeName === 'TEMPLATE' ? getContent(el) : el;\n    }\n    function setCookie(name, value) {\n        // document.cookie is magical, assigning into it assigns/overrides one cookie value, but does\n        // not clear other cookies.\n        document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value);\n    }\n    function supportsWebAnimation() {\n        return typeof Element.prototype['animate'] === 'function';\n    }\n    function hasStyle(element, styleName, styleValue) {\n        var value = element.style[styleName] || '';\n        return styleValue ? value == styleValue : value.length > 0;\n    }\n    function hasClass(element, className) {\n        return element.classList.contains(className);\n    }\n    function sortedClassList(element) {\n        return Array.prototype.slice.call(element.classList, 0).sort();\n    }\n    function createTemplate(html) {\n        var t = common.ɵgetDOM().getDefaultDocument().createElement('template');\n        t.innerHTML = html;\n        return t;\n    }\n    function childNodesAsList(el) {\n        var childNodes = el.childNodes;\n        var res = [];\n        for (var i = 0; i < childNodes.length; i++) {\n            res[i] = childNodes[i];\n        }\n        return res;\n    }\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    function initBrowserTests() {\n        platformBrowser.ɵBrowserDomAdapter.makeCurrent();\n        BrowserDetection.setup();\n    }\n    var _TEST_BROWSER_PLATFORM_PROVIDERS = [{ provide: core.PLATFORM_INITIALIZER, useValue: initBrowserTests, multi: true }];\n    /**\n     * Platform for testing\n     *\n     * @publicApi\n     */\n    var platformBrowserTesting = core.createPlatformFactory(core.platformCore, 'browserTesting', _TEST_BROWSER_PLATFORM_PROVIDERS);\n    var ɵ0 = createNgZone;\n    /**\n     * NgModule for testing.\n     *\n     * @publicApi\n     */\n    var BrowserTestingModule = /** @class */ (function () {\n        function BrowserTestingModule() {\n        }\n        return BrowserTestingModule;\n    }());\n    BrowserTestingModule.decorators = [\n        { type: core.NgModule, args: [{\n                    exports: [platformBrowser.BrowserModule],\n                    providers: [\n                        { provide: core.APP_ID, useValue: 'a' },\n                        platformBrowser.ɵELEMENT_PROBE_PROVIDERS,\n                        { provide: core.NgZone, useFactory: ɵ0 },\n                    ]\n                },] }\n    ];\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * Generated bundle index. Do not edit.\n     */\n\n    exports.BrowserTestingModule = BrowserTestingModule;\n    exports.platformBrowserTesting = platformBrowserTesting;\n    exports.ɵ0 = ɵ0;\n    exports.ɵangular_packages_platform_browser_testing_testing_a = createNgZone;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=platform-browser-testing.umd.js.map\n"]}