{"version":3,"file":"chunk.L-7XizlD.js","sources":["../node_modules/intersection-observer/intersection-observer.js"],"sourcesContent":["/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE.\n *\n * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document\n *\n */\n(function() {\n'use strict';\n\n// Exit early if we're not running in a browser.\nif (typeof window !== 'object') {\n return;\n}\n\n// Exit early if all IntersectionObserver and IntersectionObserverEntry\n// features are natively supported.\nif ('IntersectionObserver' in window &&\n 'IntersectionObserverEntry' in window &&\n 'intersectionRatio' in window.IntersectionObserverEntry.prototype) {\n\n // Minimal polyfill for Edge 15's lack of `isIntersecting`\n // See: https://github.com/w3c/IntersectionObserver/issues/211\n if (!('isIntersecting' in window.IntersectionObserverEntry.prototype)) {\n Object.defineProperty(window.IntersectionObserverEntry.prototype,\n 'isIntersecting', {\n get: function () {\n return this.intersectionRatio > 0;\n }\n });\n }\n return;\n}\n\n/**\n * Returns the embedding frame element, if any.\n * @param {!Document} doc\n * @return {!Element}\n */\nfunction getFrameElement(doc) {\n try {\n return doc.defaultView && doc.defaultView.frameElement || null;\n } catch (e) {\n // Ignore the error.\n return null;\n }\n}\n\n/**\n * A local reference to the root document.\n */\nvar document = (function(startDoc) {\n var doc = startDoc;\n var frame = getFrameElement(doc);\n while (frame) {\n doc = frame.ownerDocument;\n frame = getFrameElement(doc);\n }\n return doc;\n})(window.document);\n\n/**\n * An IntersectionObserver registry. This registry exists to hold a strong\n * reference to IntersectionObserver instances currently observing a target\n * element. Without this registry, instances without another reference may be\n * garbage collected.\n */\nvar registry = [];\n\n/**\n * The signal updater for cross-origin intersection. When not null, it means\n * that the polyfill is configured to work in a cross-origin mode.\n * @type {function(DOMRect|ClientRect, DOMRect|ClientRect)}\n */\nvar crossOriginUpdater = null;\n\n/**\n * The current cross-origin intersection. Only used in the cross-origin mode.\n * @type {DOMRect|ClientRect}\n */\nvar crossOriginRect = null;\n\n\n/**\n * Creates the global IntersectionObserverEntry constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-entry\n * @param {Object} entry A dictionary of instance properties.\n * @constructor\n */\nfunction IntersectionObserverEntry(entry) {\n this.time = entry.time;\n this.target = entry.target;\n this.rootBounds = ensureDOMRect(entry.rootBounds);\n this.boundingClientRect = ensureDOMRect(entry.boundingClientRect);\n this.intersectionRect = ensureDOMRect(entry.intersectionRect || getEmptyRect());\n this.isIntersecting = !!entry.intersectionRect;\n\n // Calculates the intersection ratio.\n var targetRect = this.boundingClientRect;\n var targetArea = targetRect.width * targetRect.height;\n var intersectionRect = this.intersectionRect;\n var intersectionArea = intersectionRect.width * intersectionRect.height;\n\n // Sets intersection ratio.\n if (targetArea) {\n // Round the intersection ratio to avoid floating point math issues:\n // https://github.com/w3c/IntersectionObserver/issues/324\n this.intersectionRatio = Number((intersectionArea / targetArea).toFixed(4));\n } else {\n // If area is zero and is intersecting, sets to 1, otherwise to 0\n this.intersectionRatio = this.isIntersecting ? 1 : 0;\n }\n}\n\n\n/**\n * Creates the global IntersectionObserver constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-interface\n * @param {Function} callback The function to be invoked after intersection\n * changes have queued. The function is not invoked if the queue has\n * been emptied by calling the `takeRecords` method.\n * @param {Object=} opt_options Optional configuration options.\n * @constructor\n */\nfunction IntersectionObserver(callback, opt_options) {\n\n var options = opt_options || {};\n\n if (typeof callback != 'function') {\n throw new Error('callback must be a function');\n }\n\n if (\n options.root &&\n options.root.nodeType != 1 &&\n options.root.nodeType != 9\n ) {\n throw new Error('root must be a Document or Element');\n }\n\n // Binds and throttles `this._checkForIntersections`.\n this._checkForIntersections = throttle(\n this._checkForIntersections.bind(this), this.THROTTLE_TIMEOUT);\n\n // Private properties.\n this._callback = callback;\n this._observationTargets = [];\n this._queuedEntries = [];\n this._rootMarginValues = this._parseRootMargin(options.rootMargin);\n\n // Public properties.\n this.thresholds = this._initThresholds(options.threshold);\n this.root = options.root || null;\n this.rootMargin = this._rootMarginValues.map(function(margin) {\n return margin.value + margin.unit;\n }).join(' ');\n\n /** @private @const {!Array} */\n this._monitoringDocuments = [];\n /** @private @const {!Array} */\n this._monitoringUnsubscribes = [];\n}\n\n\n/**\n * The minimum interval within which the document will be checked for\n * intersection changes.\n */\nIntersectionObserver.prototype.THROTTLE_TIMEOUT = 100;\n\n\n/**\n * The frequency in which the polyfill polls for intersection changes.\n * this can be updated on a per instance basis and must be set prior to\n * calling `observe` on the first target.\n */\nIntersectionObserver.prototype.POLL_INTERVAL = null;\n\n/**\n * Use a mutation observer on the root element\n * to detect intersection changes.\n */\nIntersectionObserver.prototype.USE_MUTATION_OBSERVER = true;\n\n\n/**\n * Sets up the polyfill in the cross-origin mode. The result is the\n * updater function that accepts two arguments: `boundingClientRect` and\n * `intersectionRect` - just as these fields would be available to the\n * parent via `IntersectionObserverEntry`. This function should be called\n * each time the iframe receives intersection information from the parent\n * window, e.g. via messaging.\n * @return {function(DOMRect|ClientRect, DOMRect|ClientRect)}\n */\nIntersectionObserver._setupCrossOriginUpdater = function() {\n if (!crossOriginUpdater) {\n /**\n * @param {DOMRect|ClientRect} boundingClientRect\n * @param {DOMRect|ClientRect} intersectionRect\n */\n crossOriginUpdater = function(boundingClientRect, intersectionRect) {\n if (!boundingClientRect || !intersectionRect) {\n crossOriginRect = getEmptyRect();\n } else {\n crossOriginRect = convertFromParentRect(boundingClientRect, intersectionRect);\n }\n registry.forEach(function(observer) {\n observer._checkForIntersections();\n });\n };\n }\n return crossOriginUpdater;\n};\n\n\n/**\n * Resets the cross-origin mode.\n */\nIntersectionObserver._resetCrossOriginUpdater = function() {\n crossOriginUpdater = null;\n crossOriginRect = null;\n};\n\n\n/**\n * Starts observing a target element for intersection changes based on\n * the thresholds values.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.observe = function(target) {\n var isTargetAlreadyObserved = this._observationTargets.some(function(item) {\n return item.element == target;\n });\n\n if (isTargetAlreadyObserved) {\n return;\n }\n\n if (!(target && target.nodeType == 1)) {\n throw new Error('target must be an Element');\n }\n\n this._registerInstance();\n this._observationTargets.push({element: target, entry: null});\n this._monitorIntersections(target.ownerDocument);\n this._checkForIntersections();\n};\n\n\n/**\n * Stops observing a target element for intersection changes.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.unobserve = function(target) {\n this._observationTargets =\n this._observationTargets.filter(function(item) {\n return item.element != target;\n });\n this._unmonitorIntersections(target.ownerDocument);\n if (this._observationTargets.length == 0) {\n this._unregisterInstance();\n }\n};\n\n\n/**\n * Stops observing all target elements for intersection changes.\n */\nIntersectionObserver.prototype.disconnect = function() {\n this._observationTargets = [];\n this._unmonitorAllIntersections();\n this._unregisterInstance();\n};\n\n\n/**\n * Returns any queue entries that have not yet been reported to the\n * callback and clears the queue. This can be used in conjunction with the\n * callback to obtain the absolute most up-to-date intersection information.\n * @return {Array} The currently queued entries.\n */\nIntersectionObserver.prototype.takeRecords = function() {\n var records = this._queuedEntries.slice();\n this._queuedEntries = [];\n return records;\n};\n\n\n/**\n * Accepts the threshold value from the user configuration object and\n * returns a sorted array of unique threshold values. If a value is not\n * between 0 and 1 and error is thrown.\n * @private\n * @param {Array|number=} opt_threshold An optional threshold value or\n * a list of threshold values, defaulting to [0].\n * @return {Array} A sorted list of unique and valid threshold values.\n */\nIntersectionObserver.prototype._initThresholds = function(opt_threshold) {\n var threshold = opt_threshold || [0];\n if (!Array.isArray(threshold)) threshold = [threshold];\n\n return threshold.sort().filter(function(t, i, a) {\n if (typeof t != 'number' || isNaN(t) || t < 0 || t > 1) {\n throw new Error('threshold must be a number between 0 and 1 inclusively');\n }\n return t !== a[i - 1];\n });\n};\n\n\n/**\n * Accepts the rootMargin value from the user configuration object\n * and returns an array of the four margin values as an object containing\n * the value and unit properties. If any of the values are not properly\n * formatted or use a unit other than px or %, and error is thrown.\n * @private\n * @param {string=} opt_rootMargin An optional rootMargin value,\n * defaulting to '0px'.\n * @return {Array} An array of margin objects with the keys\n * value and unit.\n */\nIntersectionObserver.prototype._parseRootMargin = function(opt_rootMargin) {\n var marginString = opt_rootMargin || '0px';\n var margins = marginString.split(/\\s+/).map(function(margin) {\n var parts = /^(-?\\d*\\.?\\d+)(px|%)$/.exec(margin);\n if (!parts) {\n throw new Error('rootMargin must be specified in pixels or percent');\n }\n return {value: parseFloat(parts[1]), unit: parts[2]};\n });\n\n // Handles shorthand.\n margins[1] = margins[1] || margins[0];\n margins[2] = margins[2] || margins[0];\n margins[3] = margins[3] || margins[1];\n\n return margins;\n};\n\n\n/**\n * Starts polling for intersection changes if the polling is not already\n * happening, and if the page's visibility state is visible.\n * @param {!Document} doc\n * @private\n */\nIntersectionObserver.prototype._monitorIntersections = function(doc) {\n var win = doc.defaultView;\n if (!win) {\n // Already destroyed.\n return;\n }\n if (this._monitoringDocuments.indexOf(doc) != -1) {\n // Already monitoring.\n return;\n }\n\n // Private state for monitoring.\n var callback = this._checkForIntersections;\n var monitoringInterval = null;\n var domObserver = null;\n\n // If a poll interval is set, use polling instead of listening to\n // resize and scroll events or DOM mutations.\n if (this.POLL_INTERVAL) {\n monitoringInterval = win.setInterval(callback, this.POLL_INTERVAL);\n } else {\n addEvent(win, 'resize', callback, true);\n addEvent(doc, 'scroll', callback, true);\n if (this.USE_MUTATION_OBSERVER && 'MutationObserver' in win) {\n domObserver = new win.MutationObserver(callback);\n domObserver.observe(doc, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true\n });\n }\n }\n\n this._monitoringDocuments.push(doc);\n this._monitoringUnsubscribes.push(function() {\n // Get the window object again. When a friendly iframe is destroyed, it\n // will be null.\n var win = doc.defaultView;\n\n if (win) {\n if (monitoringInterval) {\n win.clearInterval(monitoringInterval);\n }\n removeEvent(win, 'resize', callback, true);\n }\n\n removeEvent(doc, 'scroll', callback, true);\n if (domObserver) {\n domObserver.disconnect();\n }\n });\n\n // Also monitor the parent.\n var rootDoc =\n (this.root && (this.root.ownerDocument || this.root)) || document;\n if (doc != rootDoc) {\n var frame = getFrameElement(doc);\n if (frame) {\n this._monitorIntersections(frame.ownerDocument);\n }\n }\n};\n\n\n/**\n * Stops polling for intersection changes.\n * @param {!Document} doc\n * @private\n */\nIntersectionObserver.prototype._unmonitorIntersections = function(doc) {\n var index = this._monitoringDocuments.indexOf(doc);\n if (index == -1) {\n return;\n }\n\n var rootDoc =\n (this.root && (this.root.ownerDocument || this.root)) || document;\n\n // Check if any dependent targets are still remaining.\n var hasDependentTargets =\n this._observationTargets.some(function(item) {\n var itemDoc = item.element.ownerDocument;\n // Target is in this context.\n if (itemDoc == doc) {\n return true;\n }\n // Target is nested in this context.\n while (itemDoc && itemDoc != rootDoc) {\n var frame = getFrameElement(itemDoc);\n itemDoc = frame && frame.ownerDocument;\n if (itemDoc == doc) {\n return true;\n }\n }\n return false;\n });\n if (hasDependentTargets) {\n return;\n }\n\n // Unsubscribe.\n var unsubscribe = this._monitoringUnsubscribes[index];\n this._monitoringDocuments.splice(index, 1);\n this._monitoringUnsubscribes.splice(index, 1);\n unsubscribe();\n\n // Also unmonitor the parent.\n if (doc != rootDoc) {\n var frame = getFrameElement(doc);\n if (frame) {\n this._unmonitorIntersections(frame.ownerDocument);\n }\n }\n};\n\n\n/**\n * Stops polling for intersection changes.\n * @param {!Document} doc\n * @private\n */\nIntersectionObserver.prototype._unmonitorAllIntersections = function() {\n var unsubscribes = this._monitoringUnsubscribes.slice(0);\n this._monitoringDocuments.length = 0;\n this._monitoringUnsubscribes.length = 0;\n for (var i = 0; i < unsubscribes.length; i++) {\n unsubscribes[i]();\n }\n};\n\n\n/**\n * Scans each observation target for intersection changes and adds them\n * to the internal entries queue. If new entries are found, it\n * schedules the callback to be invoked.\n * @private\n */\nIntersectionObserver.prototype._checkForIntersections = function() {\n if (!this.root && crossOriginUpdater && !crossOriginRect) {\n // Cross origin monitoring, but no initial data available yet.\n return;\n }\n\n var rootIsInDom = this._rootIsInDom();\n var rootRect = rootIsInDom ? this._getRootRect() : getEmptyRect();\n\n this._observationTargets.forEach(function(item) {\n var target = item.element;\n var targetRect = getBoundingClientRect(target);\n var rootContainsTarget = this._rootContainsTarget(target);\n var oldEntry = item.entry;\n var intersectionRect = rootIsInDom && rootContainsTarget &&\n this._computeTargetAndRootIntersection(target, targetRect, rootRect);\n\n var rootBounds = null;\n if (!this._rootContainsTarget(target)) {\n rootBounds = getEmptyRect();\n } else if (!crossOriginUpdater || this.root) {\n rootBounds = rootRect;\n }\n\n var newEntry = item.entry = new IntersectionObserverEntry({\n time: now(),\n target: target,\n boundingClientRect: targetRect,\n rootBounds: rootBounds,\n intersectionRect: intersectionRect\n });\n\n if (!oldEntry) {\n this._queuedEntries.push(newEntry);\n } else if (rootIsInDom && rootContainsTarget) {\n // If the new entry intersection ratio has crossed any of the\n // thresholds, add a new entry.\n if (this._hasCrossedThreshold(oldEntry, newEntry)) {\n this._queuedEntries.push(newEntry);\n }\n } else {\n // If the root is not in the DOM or target is not contained within\n // root but the previous entry for this target had an intersection,\n // add a new record indicating removal.\n if (oldEntry && oldEntry.isIntersecting) {\n this._queuedEntries.push(newEntry);\n }\n }\n }, this);\n\n if (this._queuedEntries.length) {\n this._callback(this.takeRecords(), this);\n }\n};\n\n\n/**\n * Accepts a target and root rect computes the intersection between then\n * following the algorithm in the spec.\n * TODO(philipwalton): at this time clip-path is not considered.\n * https://w3c.github.io/IntersectionObserver/#calculate-intersection-rect-algo\n * @param {Element} target The target DOM element\n * @param {Object} targetRect The bounding rect of the target.\n * @param {Object} rootRect The bounding rect of the root after being\n * expanded by the rootMargin value.\n * @return {?Object} The final intersection rect object or undefined if no\n * intersection is found.\n * @private\n */\nIntersectionObserver.prototype._computeTargetAndRootIntersection =\n function(target, targetRect, rootRect) {\n // If the element isn't displayed, an intersection can't happen.\n if (window.getComputedStyle(target).display == 'none') return;\n\n var intersectionRect = targetRect;\n var parent = getParentNode(target);\n var atRoot = false;\n\n while (!atRoot && parent) {\n var parentRect = null;\n var parentComputedStyle = parent.nodeType == 1 ?\n window.getComputedStyle(parent) : {};\n\n // If the parent isn't displayed, an intersection can't happen.\n if (parentComputedStyle.display == 'none') return null;\n\n if (parent == this.root || parent.nodeType == /* DOCUMENT */ 9) {\n atRoot = true;\n if (parent == this.root || parent == document) {\n if (crossOriginUpdater && !this.root) {\n if (!crossOriginRect ||\n crossOriginRect.width == 0 && crossOriginRect.height == 0) {\n // A 0-size cross-origin intersection means no-intersection.\n parent = null;\n parentRect = null;\n intersectionRect = null;\n } else {\n parentRect = crossOriginRect;\n }\n } else {\n parentRect = rootRect;\n }\n } else {\n // Check if there's a frame that can be navigated to.\n var frame = getParentNode(parent);\n var frameRect = frame && getBoundingClientRect(frame);\n var frameIntersect =\n frame &&\n this._computeTargetAndRootIntersection(frame, frameRect, rootRect);\n if (frameRect && frameIntersect) {\n parent = frame;\n parentRect = convertFromParentRect(frameRect, frameIntersect);\n } else {\n parent = null;\n intersectionRect = null;\n }\n }\n } else {\n // If the element has a non-visible overflow, and it's not the \n // or element, update the intersection rect.\n // Note: and cannot be clipped to a rect that's not also\n // the document rect, so no need to compute a new intersection.\n var doc = parent.ownerDocument;\n if (parent != doc.body &&\n parent != doc.documentElement &&\n parentComputedStyle.overflow != 'visible') {\n parentRect = getBoundingClientRect(parent);\n }\n }\n\n // If either of the above conditionals set a new parentRect,\n // calculate new intersection data.\n if (parentRect) {\n intersectionRect = computeRectIntersection(parentRect, intersectionRect);\n }\n if (!intersectionRect) break;\n parent = parent && getParentNode(parent);\n }\n return intersectionRect;\n};\n\n\n/**\n * Returns the root rect after being expanded by the rootMargin value.\n * @return {ClientRect} The expanded root rect.\n * @private\n */\nIntersectionObserver.prototype._getRootRect = function() {\n var rootRect;\n if (this.root && !isDoc(this.root)) {\n rootRect = getBoundingClientRect(this.root);\n } else {\n // Use / instead of window since scroll bars affect size.\n var doc = isDoc(this.root) ? this.root : document;\n var html = doc.documentElement;\n var body = doc.body;\n rootRect = {\n top: 0,\n left: 0,\n right: html.clientWidth || body.clientWidth,\n width: html.clientWidth || body.clientWidth,\n bottom: html.clientHeight || body.clientHeight,\n height: html.clientHeight || body.clientHeight\n };\n }\n return this._expandRectByRootMargin(rootRect);\n};\n\n\n/**\n * Accepts a rect and expands it by the rootMargin value.\n * @param {DOMRect|ClientRect} rect The rect object to expand.\n * @return {ClientRect} The expanded rect.\n * @private\n */\nIntersectionObserver.prototype._expandRectByRootMargin = function(rect) {\n var margins = this._rootMarginValues.map(function(margin, i) {\n return margin.unit == 'px' ? margin.value :\n margin.value * (i % 2 ? rect.width : rect.height) / 100;\n });\n var newRect = {\n top: rect.top - margins[0],\n right: rect.right + margins[1],\n bottom: rect.bottom + margins[2],\n left: rect.left - margins[3]\n };\n newRect.width = newRect.right - newRect.left;\n newRect.height = newRect.bottom - newRect.top;\n\n return newRect;\n};\n\n\n/**\n * Accepts an old and new entry and returns true if at least one of the\n * threshold values has been crossed.\n * @param {?IntersectionObserverEntry} oldEntry The previous entry for a\n * particular target element or null if no previous entry exists.\n * @param {IntersectionObserverEntry} newEntry The current entry for a\n * particular target element.\n * @return {boolean} Returns true if a any threshold has been crossed.\n * @private\n */\nIntersectionObserver.prototype._hasCrossedThreshold =\n function(oldEntry, newEntry) {\n\n // To make comparing easier, an entry that has a ratio of 0\n // but does not actually intersect is given a value of -1\n var oldRatio = oldEntry && oldEntry.isIntersecting ?\n oldEntry.intersectionRatio || 0 : -1;\n var newRatio = newEntry.isIntersecting ?\n newEntry.intersectionRatio || 0 : -1;\n\n // Ignore unchanged ratios\n if (oldRatio === newRatio) return;\n\n for (var i = 0; i < this.thresholds.length; i++) {\n var threshold = this.thresholds[i];\n\n // Return true if an entry matches a threshold or if the new ratio\n // and the old ratio are on the opposite sides of a threshold.\n if (threshold == oldRatio || threshold == newRatio ||\n threshold < oldRatio !== threshold < newRatio) {\n return true;\n }\n }\n};\n\n\n/**\n * Returns whether or not the root element is an element and is in the DOM.\n * @return {boolean} True if the root element is an element and is in the DOM.\n * @private\n */\nIntersectionObserver.prototype._rootIsInDom = function() {\n return !this.root || containsDeep(document, this.root);\n};\n\n\n/**\n * Returns whether or not the target element is a child of root.\n * @param {Element} target The target element to check.\n * @return {boolean} True if the target element is a child of root.\n * @private\n */\nIntersectionObserver.prototype._rootContainsTarget = function(target) {\n var rootDoc =\n (this.root && (this.root.ownerDocument || this.root)) || document;\n return (\n containsDeep(rootDoc, target) &&\n (!this.root || rootDoc == target.ownerDocument)\n );\n};\n\n\n/**\n * Adds the instance to the global IntersectionObserver registry if it isn't\n * already present.\n * @private\n */\nIntersectionObserver.prototype._registerInstance = function() {\n if (registry.indexOf(this) < 0) {\n registry.push(this);\n }\n};\n\n\n/**\n * Removes the instance from the global IntersectionObserver registry.\n * @private\n */\nIntersectionObserver.prototype._unregisterInstance = function() {\n var index = registry.indexOf(this);\n if (index != -1) registry.splice(index, 1);\n};\n\n\n/**\n * Returns the result of the performance.now() method or null in browsers\n * that don't support the API.\n * @return {number} The elapsed time since the page was requested.\n */\nfunction now() {\n return window.performance && performance.now && performance.now();\n}\n\n\n/**\n * Throttles a function and delays its execution, so it's only called at most\n * once within a given time period.\n * @param {Function} fn The function to throttle.\n * @param {number} timeout The amount of time that must pass before the\n * function can be called again.\n * @return {Function} The throttled function.\n */\nfunction throttle(fn, timeout) {\n var timer = null;\n return function () {\n if (!timer) {\n timer = setTimeout(function() {\n fn();\n timer = null;\n }, timeout);\n }\n };\n}\n\n\n/**\n * Adds an event handler to a DOM node ensuring cross-browser compatibility.\n * @param {Node} node The DOM node to add the event handler to.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to add.\n * @param {boolean} opt_useCapture Optionally adds the even to the capture\n * phase. Note: this only works in modern browsers.\n */\nfunction addEvent(node, event, fn, opt_useCapture) {\n if (typeof node.addEventListener == 'function') {\n node.addEventListener(event, fn, opt_useCapture || false);\n }\n else if (typeof node.attachEvent == 'function') {\n node.attachEvent('on' + event, fn);\n }\n}\n\n\n/**\n * Removes a previously added event handler from a DOM node.\n * @param {Node} node The DOM node to remove the event handler from.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to remove.\n * @param {boolean} opt_useCapture If the event handler was added with this\n * flag set to true, it should be set to true here in order to remove it.\n */\nfunction removeEvent(node, event, fn, opt_useCapture) {\n if (typeof node.removeEventListener == 'function') {\n node.removeEventListener(event, fn, opt_useCapture || false);\n }\n else if (typeof node.detachEvent == 'function') {\n node.detachEvent('on' + event, fn);\n }\n}\n\n\n/**\n * Returns the intersection between two rect objects.\n * @param {Object} rect1 The first rect.\n * @param {Object} rect2 The second rect.\n * @return {?Object|?ClientRect} The intersection rect or undefined if no\n * intersection is found.\n */\nfunction computeRectIntersection(rect1, rect2) {\n var top = Math.max(rect1.top, rect2.top);\n var bottom = Math.min(rect1.bottom, rect2.bottom);\n var left = Math.max(rect1.left, rect2.left);\n var right = Math.min(rect1.right, rect2.right);\n var width = right - left;\n var height = bottom - top;\n\n return (width >= 0 && height >= 0) && {\n top: top,\n bottom: bottom,\n left: left,\n right: right,\n width: width,\n height: height\n } || null;\n}\n\n\n/**\n * Shims the native getBoundingClientRect for compatibility with older IE.\n * @param {Element} el The element whose bounding rect to get.\n * @return {DOMRect|ClientRect} The (possibly shimmed) rect of the element.\n */\nfunction getBoundingClientRect(el) {\n var rect;\n\n try {\n rect = el.getBoundingClientRect();\n } catch (err) {\n // Ignore Windows 7 IE11 \"Unspecified error\"\n // https://github.com/w3c/IntersectionObserver/pull/205\n }\n\n if (!rect) return getEmptyRect();\n\n // Older IE\n if (!(rect.width && rect.height)) {\n rect = {\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n }\n return rect;\n}\n\n\n/**\n * Returns an empty rect object. An empty rect is returned when an element\n * is not in the DOM.\n * @return {ClientRect} The empty rect.\n */\nfunction getEmptyRect() {\n return {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n width: 0,\n height: 0\n };\n}\n\n\n/**\n * Ensure that the result has all of the necessary fields of the DOMRect.\n * Specifically this ensures that `x` and `y` fields are set.\n *\n * @param {?DOMRect|?ClientRect} rect\n * @return {?DOMRect}\n */\nfunction ensureDOMRect(rect) {\n // A `DOMRect` object has `x` and `y` fields.\n if (!rect || 'x' in rect) {\n return rect;\n }\n // A IE's `ClientRect` type does not have `x` and `y`. The same is the case\n // for internally calculated Rect objects. For the purposes of\n // `IntersectionObserver`, it's sufficient to simply mirror `left` and `top`\n // for these fields.\n return {\n top: rect.top,\n y: rect.top,\n bottom: rect.bottom,\n left: rect.left,\n x: rect.left,\n right: rect.right,\n width: rect.width,\n height: rect.height\n };\n}\n\n\n/**\n * Inverts the intersection and bounding rect from the parent (frame) BCR to\n * the local BCR space.\n * @param {DOMRect|ClientRect} parentBoundingRect The parent's bound client rect.\n * @param {DOMRect|ClientRect} parentIntersectionRect The parent's own intersection rect.\n * @return {ClientRect} The local root bounding rect for the parent's children.\n */\nfunction convertFromParentRect(parentBoundingRect, parentIntersectionRect) {\n var top = parentIntersectionRect.top - parentBoundingRect.top;\n var left = parentIntersectionRect.left - parentBoundingRect.left;\n return {\n top: top,\n left: left,\n height: parentIntersectionRect.height,\n width: parentIntersectionRect.width,\n bottom: top + parentIntersectionRect.height,\n right: left + parentIntersectionRect.width\n };\n}\n\n\n/**\n * Checks to see if a parent element contains a child element (including inside\n * shadow DOM).\n * @param {Node} parent The parent element.\n * @param {Node} child The child element.\n * @return {boolean} True if the parent node contains the child node.\n */\nfunction containsDeep(parent, child) {\n var node = child;\n while (node) {\n if (node == parent) return true;\n\n node = getParentNode(node);\n }\n return false;\n}\n\n\n/**\n * Gets the parent node of an element or its host element if the parent node\n * is a shadow root.\n * @param {Node} node The node whose parent to get.\n * @return {Node|null} The parent node or null if no parent exists.\n */\nfunction getParentNode(node) {\n var parent = node.parentNode;\n\n if (node.nodeType == /* DOCUMENT */ 9 && node != document) {\n // If this node is a document node, look for the embedding frame.\n return getFrameElement(node);\n }\n\n // If the parent has element that is assigned through shadow root slot\n if (parent && parent.assignedSlot) {\n parent = parent.assignedSlot.parentNode\n }\n\n if (parent && parent.nodeType == 11 && parent.host) {\n // If the parent is a shadow root, return the host element.\n return parent.host;\n }\n\n return parent;\n}\n\n/**\n * Returns true if `node` is a Document.\n * @param {!Node} node\n * @returns {boolean}\n */\nfunction isDoc(node) {\n return node && node.nodeType === 9;\n}\n\n\n// Exposes the constructors globally.\nwindow.IntersectionObserver = IntersectionObserver;\nwindow.IntersectionObserverEntry = IntersectionObserverEntry;\n\n}());\n"],"names":["getFrameElement","doc","document","startDoc","frame","registry","crossOriginUpdater","crossOriginRect","IntersectionObserverEntry","entry","ensureDOMRect","getEmptyRect","targetRect","targetArea","intersectionRect","intersectionArea","IntersectionObserver","callback","opt_options","options","throttle","margin","boundingClientRect","convertFromParentRect","observer","target","isTargetAlreadyObserved","item","records","opt_threshold","threshold","t","i","a","opt_rootMargin","marginString","margins","parts","win","monitoringInterval","domObserver","addEvent","removeEvent","rootDoc","index","hasDependentTargets","itemDoc","unsubscribe","unsubscribes","rootIsInDom","rootRect","getBoundingClientRect","rootContainsTarget","oldEntry","rootBounds","newEntry","now","parent","getParentNode","atRoot","parentRect","parentComputedStyle","frameRect","frameIntersect","computeRectIntersection","isDoc","html","body","rect","newRect","oldRatio","newRatio","containsDeep","fn","timeout","timer","node","event","opt_useCapture","rect1","rect2","top","bottom","left","right","width","height","el","parentBoundingRect","parentIntersectionRect","child"],"mappings":"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","x_google_ignoreList":[0]}