We couldn\'t find any results for ${state.query}.
\nTry a more general term or use fewer keywords.
\n `;\n },\n },\n };\n }\n // Start listening for keyboard events.\n const keyEventsState = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.listenForEvents)();\n // Activate the autocomplete control. See the Algolia docs for configuration details.\n // https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-js/autocomplete\n (0,_algolia_autocomplete_js__WEBPACK_IMPORTED_MODULE_4__.autocomplete)({\n container: el,\n placeholder: "Search (⌘/ctrl-k)",\n // Whether to open the panel when the input gets focus (i.e., before a query is submitted).\n openOnFocus: false,\n // Whether to render the control as a modal dialog or drop-down. Empty string means modal.\n detachedMediaQuery: "",\n // The (zero-based) item that should be selected by default.\n defaultActiveItemId: 0,\n // Handler for any change that occurs on the state of the autocomplete control.\n onStateChange: ({ state, prevState, setCollections }) => {\n // When a query is "cleared out" by the user, reset the list of facets to "all" and drop\n // any existing results to start fresh.\n if (prevState.query !== "" && state.query === "") {\n setCollections([]);\n (0,_utils__WEBPACK_IMPORTED_MODULE_0__.setTags)(state, baseTags);\n }\n // When there\'s an active item, and an arrow key was just pressed, scroll the active\n // item into view.\n if (state.activeItemId >= 0) {\n const items = document.querySelectorAll(`.aa-Item`);\n if (items) {\n const item = items.item(state.activeItemId);\n if (item && keyEventsState.upDownPressed) {\n item.scrollIntoView({ behavior: "smooth", block: "nearest" });\n }\n }\n // Reset the arrow-key flag.\n keyEventsState.upDownPressed = false;\n }\n },\n // Returns the list of autocomplete sources to use for each query. Our control uses two\n // sources: one for obtaining query result counts by facet, another for obtaining actual\n // query results.\n getSources: ({ query, state, refresh, setContext }) => {\n const sources = [];\n sources.push(getFacetsSource(query, state, setContext));\n sources.push(getResultsSource(query, state, refresh));\n // Debounce requests to keep from sending too many queries to Algolia.\n return (0,_utils__WEBPACK_IMPORTED_MODULE_0__.debounce)(sources);\n },\n // Enable Algolia insights.\n // https://www.algolia.com/doc/guides/building-search-ui/events/js/\n insights: true,\n // https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/plugins/\n plugins: [\n (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getTagsPlugin)(baseTags),\n ],\n });\n}\n// Wait until the DOM is ready before looking for any autocomplete controls on the page.\nwindow.addEventListener("DOMContentLoaded", () => {\n const el = document.querySelector(autocompleteContainer);\n if (el) {\n initAutocomplete(el);\n }\n});\n\n\n//# sourceURL=webpack://theme/./src/ts/algolia/autocomplete.ts?')},"./src/ts/algolia/utils.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "debounce": () => (/* binding */ debounce),\n/* harmony export */ "formatCount": () => (/* binding */ formatCount),\n/* harmony export */ "getTags": () => (/* binding */ getTags),\n/* harmony export */ "getTagsPlugin": () => (/* binding */ getTagsPlugin),\n/* harmony export */ "groupBy": () => (/* binding */ groupBy),\n/* harmony export */ "iconForTag": () => (/* binding */ iconForTag),\n/* harmony export */ "labelForTag": () => (/* binding */ labelForTag),\n/* harmony export */ "listenForEvents": () => (/* binding */ listenForEvents),\n/* harmony export */ "mapTagsToFilters": () => (/* binding */ mapTagsToFilters),\n/* harmony export */ "setTags": () => (/* binding */ setTags)\n/* harmony export */ });\n/* harmony import */ var _algolia_autocomplete_plugin_tags__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @algolia/autocomplete-plugin-tags */ "./node_modules/@algolia/autocomplete-plugin-tags/dist/esm/createTagsPlugin.js");\n\n// Converts a list of tags into an Algolia filter query.\n// https://www.algolia.com/doc/guides/managing-results/refine-results/filtering/in-depth/filters-and-facetfilters/\nfunction mapTagsToFilters(tagsByFacet, operator = "AND") {\n const result = Object\n .keys(tagsByFacet)\n .map(facet => {\n return `(${tagsByFacet[facet]\n .map(({ label }) => `${facet}:"${label}"`)\n .join(\' OR \')})`;\n })\n .join(` ${operator} `);\n return result;\n}\n// Groups a collection of items by key.\nfunction groupBy(items, predicate) {\n return items.reduce((acc, item) => {\n const key = predicate(item);\n if (!acc.hasOwnProperty(key)) {\n acc[key] = [];\n }\n acc[key].push(item);\n return acc;\n }, {});\n}\n// Creates a "tags plugin" for use with the autocomplete control. This plugin maps a set of tags to\n// Algolia "facets" for filtering results.\n// https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-plugin-tags/createTagsPlugin/\nfunction getTagsPlugin(baseTags) {\n return (0,_algolia_autocomplete_plugin_tags__WEBPACK_IMPORTED_MODULE_0__.createTagsPlugin)({\n initialTags: baseTags,\n transformSource: ({ source }) => {\n return undefined;\n },\n getTagsSubscribers: () => {\n return [\n {\n sourceId: "section",\n getTag: ({ item }) => {\n return item;\n },\n },\n ];\n },\n });\n}\n// Sets the list of tags to use for autocomplete filtering.\nfunction setTags(state, tags) {\n var _a, _b;\n (_b = (_a = state.context) === null || _a === void 0 ? void 0 : _a.tagsPlugin) === null || _b === void 0 ? void 0 : _b.setTags(tags);\n}\n// Returns the list of currently applied tags.\nfunction getTags(state) {\n var _a, _b;\n return ((_b = (_a = state.context) === null || _a === void 0 ? void 0 : _a.tagsPlugin) === null || _b === void 0 ? void 0 : _b.tags) || [];\n}\n// Returns a function that returns a promise to be resolved after some delay.\nfunction debouncePromise(fn, time) {\n let timerId = undefined;\n return (...args) => {\n if (timerId) {\n clearTimeout(timerId);\n }\n return new Promise((resolve) => {\n timerId = setTimeout(() => resolve(fn(...args)), time);\n });\n };\n}\n// Delays sending queries to Algolia by the specified number of milliseconds. (Without this, we\'d\n// send a query on every keystroke, which is snappy but expensive.)\nconst debounce = debouncePromise(items => Promise.resolve(items), 220);\n// Listens for search-relevant events.\nfunction listenForEvents() {\n // Tiny object make it easier to share data between event handlers and the autocomplete instance.\n const sharedData = {\n // Whether an up or down arrow key was just pressed. The control uses this to decide whether\n // to scroll the active item into view.\n upDownPressed: false,\n };\n // Handle command/control-k events by triggering the search button directly.\n window.addEventListener("keydown", (event) => {\n if ((event.key.toLowerCase() === "k" && (event.metaKey || event.ctrlKey))) {\n event.preventDefault();\n const searchButton = document.querySelector(`.aa-DetachedSearchButton`);\n searchButton.click();\n }\n });\n // Handle arrow up/down. It\'s a bit odd that we have to do this manually, as it *should* be\n // handled by the Algolia control itself, but there\'s a bug in that control that prevents the\n // code from locating the item to scroll to, so we have to do it ourselves. Note that we use the\n // capture phase to be sure we get notified *before* the control\'s state changes; if we didn\'t,\n // we wouldn\'t be notified of the keypress until afterward, at which point it\'d be too late to\n // know whether the state change had resulted from a keypress (and to scroll accordingly).\n window.addEventListener("keydown", (event) => {\n if ((event.key === "ArrowUp" || event.key === "ArrowDown") && event.target === document.querySelector(`.aa-DetachedFormContainer .aa-Input`)) {\n sharedData.upDownPressed = true;\n }\n }, { capture: true });\n // When the clear button is clicked, don\'t close the modal; instead, clear the value and leave\n // the modal open. To do this, we have to listen for clicks on the `body` element, because the\n // modal doesn\'t exist when the page is rendered -- and could be created and destroyed many\n // times within a given pageview.\n document.body.addEventListener("click", (event) => {\n var _a;\n const clickedElement = event.target;\n // If the thing clicked was a clear button or one of its descendants, stop the event and\n // clear the input field.\n if (clickedElement === null || clickedElement === void 0 ? void 0 : clickedElement.closest(".aa-ClearButton")) {\n event.stopPropagation();\n event.preventDefault();\n const input = (_a = clickedElement.closest(".aa-Form")) === null || _a === void 0 ? void 0 : _a.querySelector(".aa-Input");\n if (input) {\n input.value = "";\n input.focus();\n input.dispatchEvent(new Event("input"));\n }\n ;\n }\n });\n // Return the shared-data object.\n return sharedData;\n}\n// Formats numbers greater than 1000 by rounding them up and rendering as "1K".\nfunction formatCount(count) {\n return count > 1000 ? `${Math.ceil(count / 1000)}K` : count.toString();\n}\n// Returns the label to use for a given tag.\nfunction labelForTag(facet) {\n if (facet === "Registry") {\n return "Packages";\n }\n return facet;\n}\n// Returns the icon to use for a given tag.\nfunction iconForTag(label) {\n switch (label) {\n case "Docs":\n return "/icons/docs.svg";\n case "Registry":\n return "/icons/registry.svg";\n case "Tutorials":\n return "/icons/graduation-cap.svg";\n }\n return "/icons/list.svg";\n}\n\n\n//# sourceURL=webpack://theme/./src/ts/algolia/utils.ts?')},"./src/ts/carousel.ts":()=>{eval('(function ($) {\n // The home-page carousel. Items cycle every four seconds. Clicking a label stops the\n // cycling and shows the selected item.\n var carouselItem = 1;\n var carouselInterval = window.setInterval(function () {\n showCarouselItem(carouselItem);\n carouselItem++;\n if (carouselItem > 2) {\n carouselItem = 0;\n }\n }, 11000);\n showCarouselItem(0);\n $(".carousel-item-label").click(function () {\n clearInterval(carouselInterval);\n var i = $(".carousel-item-label").index(this);\n showCarouselItem(i);\n });\n function showCarouselItem(i) {\n // On some pages we might want to show all the carousel animations at\n // once, so if this element is available we show everything and return.\n if ($(".carousel-always-visible").length) {\n showIDE();\n showCLI();\n showConsole();\n return;\n }\n if ($(".carousel-always-visible-cli-only").length) {\n showCLIOnly();\n return;\n }\n $(".carousel-item").css("opacity", 0).css("pointer-events", "none").eq(i).css("opacity", 1).css("pointer-events", "auto");\n $(".carousel-item-description").css("opacity", 0).css("pointer-events", "none").eq(i).css("opacity", 1).css("pointer-events", "auto");\n $(".carousel-item-label")\n .removeClass("border-purple-700")\n .removeClass("text-purple-700")\n .removeClass("hover:text-purple-700")\n .addClass("text-purple-200")\n .addClass("hover:text-purple-300")\n .eq(i)\n .addClass("border-purple-700")\n .addClass("text-purple-700")\n .addClass("hover:text-purple-700");\n if (i === 0) {\n showIDE();\n }\n else if (i === 1) {\n showCLI();\n }\n else if (i === 2) {\n showConsole();\n }\n }\n function showIDE() {\n // Hide the windows.\n $(".menu").css("opacity", 0);\n // Restore the selection state of the first menu.\n $(".menu").find(".row").removeClass("bg-gray-600").eq(0).addClass("bg-gray-600");\n // Start typing. On completion, show the menus.\n startTyping(0, function () {\n $(".menu").each(function (i, el) {\n var delay = parseInt($(el).attr("data-delay")) || 0;\n // Animate the selection indicator of the first menu when it\'s shown.\n if (i === 0) {\n setTimeout(function () {\n $(el).find(".row").removeClass("bg-gray-600").eq(1).addClass("bg-gray-600");\n }, 600);\n }\n setTimeout(function () {\n $(el).css("opacity", 1);\n }, delay);\n });\n });\n }\n function showCLI() {\n startTyping(1);\n showLines(1);\n }\n function showCLIOnly() {\n startTyping(0);\n showLines(0);\n }\n function showConsole() {\n var tabs = $("#carousel-console .tab");\n tabs.css("opacity", 0).eq(0).css("opacity", 1);\n setTimeout(function () {\n tabs.eq(0).css("opacity", 0);\n tabs.eq(1).css("opacity", 1);\n }, 5000);\n }\n function startTyping(i, onComplete) {\n var spans = $(".carousel-item").eq(i).find(".line.typed span");\n var offset = 500; /* ms */\n var delay = 75; /* ms */\n // Wrap every character in a span to make it individually selectable.\n spans.each(function (i, span) {\n var chars = span.textContent.split("");\n $(span)\n .addClass("typing")\n .html(chars\n .map(char => {\n return "" + char + "";\n })\n .join("")\n .toString());\n });\n // Create an element to represent the cursor.\n var cursor = $("");\n var chars = $(".carousel-item").eq(i).find(".char");\n chars.map(function (j, el) {\n offset += Math.ceil(Math.random() * delay);\n // Position the cursor in relation to the character. If a line break is\n // encountered, show the cursor before the line break (as we pause for\n // line breaks); otherwise, show it after the character.\n setTimeout(function () {\n if (el.textContent === "\\n") {\n $(el).css("opacity", 1).prepend(cursor);\n }\n else {\n $(el).css("opacity", 1).append(cursor);\n }\n // If we\'ve reached end of the input in the current view, remove the cursor.\n if (j === chars.length - 1) {\n setTimeout(function () {\n cursor.remove();\n if (typeof onComplete === "function") {\n onComplete();\n }\n }, 600);\n }\n }, offset);\n // Wait a bit at the end of each line, just to give the viewer a moment to note\n // what was expressed.\n if (el.textContent === "\\n" || el.textContent === ";") {\n offset += 1000 /* ms */;\n }\n });\n }\n function showLines(i) {\n var lines = $(".carousel-item").eq(i).find(".line.full");\n lines.css("opacity", 0);\n var offset = 2000; /* ms */\n var delay = 75; /* ms */\n lines.each(function (i, el) {\n var d = parseInt($(el).attr("data-delay")) || delay;\n offset += Math.ceil(Math.random() * d);\n setTimeout(function () {\n $(el).css("opacity", 1);\n }, offset);\n });\n }\n})(jQuery);\n\n\n//# sourceURL=webpack://theme/./src/ts/carousel.ts?')},"./src/ts/chooser.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/ts/util.ts");\n\nfunction getElemClasses(e) {\n return ($(e).attr("class") || "").split(/\\s+/);\n}\n// selectChoice will remember a given choice -- such as language or operating system -- as a preferred setting using\n// a cookie and walk the DOM enabling all code tabs and snippets for that choice, and disabling those for others.\nfunction selectChoice(kind, choice, extra) {\n // Explicitly set `path` to `/` so the saved selection is available across all pages, and\n // set `max-age` to one year (31536000 is one year in seconds) so the saved selection does\n // not expire when the browser session ends.\n document.cookie = "pulumi_" + kind + "=" + choice + "; max-age=31536000; path=/";\n // Change the active tab.\n var choiceTabs = 0;\n $("a." + kind + "-tab").each(function (i, e) {\n choiceTabs++;\n var $e = $(e);\n var currentTabChoice = $e.attr("data-choice") || e.innerText.toLowerCase();\n if (currentTabChoice === choice) {\n $e.addClass("is-active");\n }\n else {\n $e.removeClass("is-active");\n }\n });\n // If and only if we found tabs, show and hide divs for the relevant choices.\n if (choiceTabs > 0) {\n $("div,span").each(function (i, e) {\n var classes = getElemClasses(e);\n for (var i = 0; i < classes.length; i++) {\n if (classes[i].startsWith(kind + "-prologue-")) {\n var next = $(e).next();\n if (next) {\n if (classes[i] === kind + "-prologue-" + choice) {\n $(next).show();\n }\n else {\n $(next).hide();\n }\n }\n break;\n }\n }\n });\n if (extra) {\n extra();\n }\n }\n}\n// selectLanguage chooses a language.\nfunction selectLanguage(lang) {\n selectChoice("language", lang, function () {\n var shellLanguages = ["bat", "batch", "batchfile", "powershell", "posh", "pwsh", "bash", "sh", "shell", "zsh", "diff"].map(function (l) {\n return "language-" + l;\n });\n // In addition to the basic showing/hiding, highlight the right code blocks:\n $("code").each(function (i, e) {\n var classes = getElemClasses(e);\n for (var i = 0; i < classes.length; i++) {\n if (classes[i].startsWith("language-") && shellLanguages.indexOf(classes[i]) === -1) {\n var parents = $(e).parents("div.highlight");\n if (!parents.length) {\n parents = $(e).parents("span.highlight");\n }\n // Our Node reference docs contain examples written in TypeScript, and\n // don\'t currently have JavaScript examples above.\n // Ensure these TypeScript examples are always visible, even when\n // JavaScript is the selected language.\n if (lang === "javascript" && (classes[i] === "language-typescript" || classes[i] === "language-ts")) {\n // If the previous element doesn\'t have a highlight, show it.\n var prev = parents.prev();\n if (prev && !prev.hasClass("highlight")) {\n parents.show();\n break;\n }\n }\n if (classes[i] === "language-" + lang ||\n (lang === "typescript" && classes[i] === "language-ts") ||\n (lang === "javascript" && classes[i] === "language-js") ||\n (lang === "visualbasic" && classes[i] === "language-vb")) {\n parents.show();\n }\n else {\n parents.hide();\n }\n break;\n }\n }\n });\n });\n}\n// selectOs chooses an operating system.\nfunction selectOs(os) {\n selectChoice("os", os);\n}\n// selectCloud chooses a cloud provider.\nfunction selectCloud(cloud) {\n selectChoice("cloud", cloud);\n}\n// selectCloud chooses a kubernetes language syntax.\nfunction selectK8sLang(syntax) {\n selectChoice("k8s-language", syntax);\n}\n// Hides and shows choices based on previous preferences.\nfunction hideShowChoices(kind, selector, defaultChoice) {\n var tabsOnPage = {};\n $("a." + kind + "-tab").each(function (i, e) {\n var choice = $(e).attr("data-choice") || e.innerText.toLowerCase();\n // Save the languages we\'ve seen.\n tabsOnPage[choice] = true;\n // For every language tab, inject a handler and make the correct one hidden.\n e.addEventListener("click", function () {\n // Choosing a tab currently affects the selection state of all of the other\n // tabs on the page, which can cause unpredictable reflows, so we note the\n // current position of the clicked element relative to the upper edge of the\n // viewport, do the selection, then scroll to the same relative location once\n // the reflow is complete.\n var el = $(this).get(0);\n var distanctFromViewportTop = el.getBoundingClientRect().top;\n selector(choice, e);\n requestAnimationFrame(function () {\n window.scroll(0, el.offsetTop - distanctFromViewportTop);\n });\n });\n });\n var tabsOnPageKeys = Object.keys(tabsOnPage);\n // If we didn\'t find any tabs, there\'s nothing else to do.\n if (tabsOnPageKeys.length === 0) {\n return;\n }\n // Now select the right choice based on whether there\'s a cookie, defaulting as appropriate.\n var choiceCookie = decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;\\\\s*)pulumi_" + kind + "\\\\=\\\\s*([^;]*).*$)|^.*$"), "$1"));\n if (choiceCookie && tabsOnPage.hasOwnProperty(choiceCookie)) {\n selector(choiceCookie);\n }\n else if (defaultChoice && tabsOnPage.hasOwnProperty(defaultChoice)) {\n selector(defaultChoice);\n }\n else if (tabsOnPageKeys.length > 0) {\n selector(tabsOnPageKeys[0]);\n }\n}\n// The first time the DOM is finished loading, select the right language and OS.\n$(document).on("rendered", function () {\n // If a query param\'s been provided for a tab category, honor that.\n ["language", "os", "cloud", "k8s-language", "input-kind"].forEach(function (kind) {\n var val = (0,_util__WEBPACK_IMPORTED_MODULE_0__.getQueryVariable)(kind);\n if (val) {\n selectChoice(kind, val);\n }\n });\n // If no language is chosen yet, default to TypeScript.\n hideShowChoices("language", selectLanguage, "typescript");\n // If no OS is chosen yet, do our best to detect it using the browser.\n var defaultOsChoice;\n if (navigator.appVersion.indexOf("Win") !== -1) {\n defaultOsChoice = "windows";\n }\n else if (navigator.appVersion.indexOf("Mac") !== -1) {\n defaultOsChoice = "macos";\n }\n else if (navigator.appVersion.indexOf("Linux") !== -1) {\n defaultOsChoice = "linux";\n }\n hideShowChoices("os", selectOs, defaultOsChoice);\n hideShowChoices("cloud", selectCloud, "aws");\n hideShowChoices("k8s-language", selectK8sLang, "typescript");\n});\n\n\n//# sourceURL=webpack://theme/./src/ts/chooser.ts?')},"./src/ts/code-tabbed.ts":()=>{eval('(function ($) {\n var languageItem = 1;\n var languageInterval = window.setInterval(function () {\n showLanguageItem(languageItem);\n languageItem++;\n if (languageItem > 3) {\n languageItem = 0;\n }\n }, 5000);\n showLanguageItem(0);\n $(".code-tabbed-tab").click(function () {\n clearInterval(languageInterval);\n var i = $(".code-tabbed-tab").index(this);\n showLanguageItem(i);\n });\n function showLanguageItem(i) {\n $(".code-tabbed-content").scrollTop(0).scrollLeft(0);\n $(".code-tabbed-tab").removeClass("active").eq(i).addClass("active");\n $(".code-tabbed-content-item").removeClass("active").eq(i).addClass("active");\n }\n})(jQuery);\n\n\n//# sourceURL=webpack://theme/./src/ts/code-tabbed.ts?')},"./src/ts/copybutton.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var clipboard_polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! clipboard-polyfill */ "./node_modules/clipboard-polyfill/dist/main/clipboard-polyfill.esm.js");\n\n("use strict");\n// Used to "normalize" code snippet text that will be written to the clipboard.\nfunction normalizeText(lang, text) {\n if (!text) {\n return "";\n }\n // Replace all "\\r\\n" with "\\n" to ensure consistent newlines.\n text = text.replace("\\r\\n", "\\n");\n // Trim whitespace.\n text = text.trim();\n // For command line code snippets:\n // 1. Strip the prompt from any lines that are prefixed with it\n // 2. Discard subsequent lines that don\'t start with the prompt (i.e. output),\n // making sure to respect line continuation characters.\n // 3. Combine multiple lines that start with a prompt into a single line, e.g.\n // "$ mkdir mydir && mydir\\n$ pulumi new typescript" =>\n // "mkdir mydir && mydir && pulumi new typescript"\n var prompt;\n var comment;\n var trailingCommentRE;\n var trailingContinuationChar;\n var combinator;\n switch (lang) {\n case "bash":\n case "sh":\n case "shell":\n case "zsh":\n prompt = "$ ";\n comment = "#";\n trailingCommentRE = /\\s+#.*$/m;\n trailingContinuationChar = "\\\\";\n combinator = " && ";\n break;\n case "bat":\n case "batch":\n case "batchfile":\n prompt = "> ";\n comment = "::";\n trailingCommentRE = /\\s+::.*$/m;\n trailingContinuationChar = "^";\n combinator = " && ";\n break;\n case "powershell":\n case "posh":\n case "pwsh":\n prompt = "> ";\n comment = "#";\n trailingCommentRE = /\\s+#.*$/m;\n trailingContinuationChar = "`";\n combinator = "; ";\n break;\n }\n if (prompt) {\n var results = [];\n var lines = text.split("\\n");\n var priorLineContinued = false;\n for (var i = 0; i < lines.length; i++) {\n var line = lines[i].trim();\n // If the first line doesn\'t start with a prompt, break out of the loop to avoid any\n // further processing, so the whole thing is returned.\n if (i === 0 && !line.startsWith(prompt)) {\n break;\n }\n // Skip empty lines and comments.\n if (line.length === 0 || line.startsWith(comment)) {\n priorLineContinued = false;\n continue;\n }\n // Include all initial lines that start with a prompt and discard subsequent lines after\n // a line is reached that doesn\'t start with a prompt.\n if (line.startsWith(prompt) || priorLineContinued) {\n // Removing trailing comments.\n line = line.replace(trailingCommentRE, "");\n // Remember and remove line continuations.\n var wasContinued = priorLineContinued;\n if (line.endsWith(trailingContinuationChar)) {\n priorLineContinued = true;\n line = line.substring(0, line.length - trailingContinuationChar.length);\n }\n else {\n priorLineContinued = false;\n }\n // Continue the prior line, or add a new one, as appropriate.\n if (wasContinued) {\n results.push(results.pop() + line);\n }\n else {\n results.push(line.substring(2));\n }\n }\n else {\n break;\n }\n }\n // If we have results, combine into a single line, with commands separated by the combinator.\n if (results.length > 0) {\n text = results.join(combinator);\n }\n }\n // If on Windows, ensure the appropriate line endings are applied.\n if (navigator.appVersion.indexOf("Win") !== -1) {\n text = text.replace("\\n", "\\r\\n");\n }\n return text;\n}\nfunction addCopyButton(e) {\n var tooltipText = "Copy";\n var buttonHtml = \' ";\n e.append(buttonHtml).on("click", "button.copy-button", function () {\n var $b = $(this);\n var $code = $b.parent().parent().parent().siblings("pre").children("code");\n // Get the lang and code.\n var lang = $code.attr("data-lang");\n var text = $code.text();\n // Write the text to the clipboard.\n var normalized = normalizeText(lang, text);\n if (normalized && normalized.length > 0) {\n clipboard_polyfill__WEBPACK_IMPORTED_MODULE_0__.writeText(normalized);\n }\n // Remove focus from the button.\n $b.blur();\n // Show a "Copied!" tooltip for a second.\n var $tooltip = $b.closest("pulumi-tooltip");\n var $tooltipContent = $tooltip.find("[slot=\'content\']");\n var tooltipEl = $tooltip.get(0);\n $tooltipContent.text("Copied!");\n tooltipEl.show().then(() => {\n setTimeout(function () {\n tooltipEl.hide().then(() => $tooltipContent.text(tooltipText));\n }, 1000);\n });\n // Track analytics if data-track is present\n const analytics = window.analytics;\n const analyticsAvailable = analytics && analytics.track && typeof analytics.track === "function";\n var codeBlockName = $code.attr("data-track");\n if (analyticsAvailable && codeBlockName) { // Don\'t track empty email addresses\n const trackData = {\n codeBlockName: codeBlockName\n };\n analytics.track("copy-code-block", trackData);\n }\n });\n}\n// When the DOM is ready, add copy buttons to code snippets.\n$(function () {\n addCopyButton($(":not(.no-copy) > div.highlight"));\n});\n\n\n//# sourceURL=webpack://theme/./src/ts/copybutton.ts?')},"./src/ts/developer-advocates.ts":()=>{eval('$(function () {\n $("#upcoming-talks-select").on("click", function () {\n $("#upcoming-talks").removeClass("hidden");\n $("#past-talks").addClass("hidden");\n $("#upcoming-talks-select").addClass("is-selected");\n $("#past-talks-select").removeClass("is-selected");\n });\n $("#past-talks-select").on("click", function () {\n $("#upcoming-talks").addClass("hidden");\n $("#past-talks").removeClass("hidden");\n $("#upcoming-talks-select").removeClass("is-selected");\n $("#past-talks-select").addClass("is-selected");\n });\n});\n\n\n//# sourceURL=webpack://theme/./src/ts/developer-advocates.ts?')},"./src/ts/docs-feedback.ts":()=>{eval('$(function () {\n // Check that the analytics track function is available.\n var analyticsAvailable = window["analytics"] && window["analytics"].track && typeof window["analytics"].track === "function";\n // Show the docs feedback container.\n $("#docsFeedbackContainer").removeClass("hidden");\n // For each of the button ids attach a click handler that shows\n // the additional comment section.\n ["#docsFeedbackYes", "#docsFeedbackNo"].forEach(function (key) {\n var answer = key === "#docsFeedbackYes" ? "Yes" : "No";\n $(key).on("click", function () {\n $("#feedbackLongForm").removeClass("hidden");\n // Show the additional comment section.\n showAdditionalCommentSection(answer);\n });\n });\n /**\n * Submit the documentation feedback to Segment.\n *\n * @param {string} answer The value of the button the user clicked when giving feedback.\n * @param {string} comments The value of the text area in the comment section. Defaults to an empty string\n * @param {string} email The value of the email input in the comment section. Defaults to an empty string\n */\n function sendFeedbackToSegment(answer, comments, email) {\n var trackingObj = {\n answer: answer,\n comments: comments || "",\n email: email || "",\n url: window.location.pathname,\n category: "Documentation Feedback",\n label: answer,\n };\n if (analyticsAvailable) {\n window["analytics"].track("docs-feedback", trackingObj);\n }\n else {\n console.log("Skipped call to analytics.track:", "docs-feedback", trackingObj);\n }\n }\n /**\n * Show the additional comments section and inject the user\'s feedback\n * answer into the submission click handler and form abandonment handler.\n *\n * @param {string} answer The value of the button the user clicked when giving feedback.\n */\n function showAdditionalCommentSection(answer) {\n // Temporarily reparent the overlay and dialog (to the end of the body), so it\n // doesn\'t have to compete for proper z-index positioning.\n // TODO: Make a proper dialog component for this.\n var feedbackLongForm = $("#feedbackLongForm");\n var feedbackLongFormParent = feedbackLongForm.parent();\n $("body").append(feedbackLongForm);\n // Add a click handler to the submit button.\n $("#docsSubmitFeedback").on("click", function () {\n // Grab the values of the comments and email inputs.\n var comments = $("#feedbackAdditionalComments").val().toString().trim();\n var email = $("#feedbackEmail").val().toString().trim();\n // Send to Segment.\n sendFeedbackToSegment(answer, comments, email);\n // Clear the form\n $("#feedbackAdditionalComments").val("");\n $("#feedbackEmail").val("");\n // Show the thank you section.\n $("#feedbackButtons").addClass("hidden");\n $("#feedbackLongForm").addClass("hidden");\n $("#feedbackThankYou").removeClass("hidden");\n });\n $("#docsCloseFeedbackLongForm").on("click", function () {\n // Send to Segment.\n sendFeedbackToSegment(answer, "", "");\n // Clear the form\n $("#feedbackAdditionalComments").val("");\n $("#feedbackEmail").val("");\n // Show the thank you section.\n $("#feedbackButtons").addClass("hidden");\n $("#feedbackLongForm").addClass("hidden");\n $("#feedbackThankYou").removeClass("hidden");\n // Return the overlay to its original position.\n feedbackLongFormParent.append(feedbackLongForm);\n });\n $(window).on("beforeunload", function () {\n // When page unloads send the answer if it has not already been sent.\n var feedbackSent = $("#feedbackLongForm").hasClass("hidden");\n if (!feedbackSent) {\n sendFeedbackToSegment(answer, "", "");\n }\n });\n }\n});\n\n\n//# sourceURL=webpack://theme/./src/ts/docs-feedback.ts?')},"./src/ts/docs-main.ts":()=>{eval('let docsMainNavToggleWrapper = $(".docs-main-nav-toggle-wrapper");\nlet docsNavToggleIcon = $(".docs-nav-toggle-icon");\n$(window).on("resize", function () {\n setDocsMainNavPosition();\n setTableOfContentsVisibility();\n setMainNavHeight();\n}).trigger(\'resize\');\n$(window).on("scroll", function () {\n setDocsMainNavPosition();\n}).trigger(\'resize\');\n$(window).on("load", function () {\n setDocsMainNavPosition();\n setTableOfContentsVisibility();\n setMainNavHeight();\n});\n(function (document, $) {\n let docsToggle = $(".docs-nav-toggle");\n docsToggle.on("click", function () {\n docsMainNavToggleWrapper.toggleClass("docs-nav-show");\n docsMainNavToggleWrapper.toggleClass("docs-nav-hide");\n docsNavToggleIcon.toggleClass("close-docs-main-nav");\n docsNavToggleIcon.toggleClass("open-docs-main-nav");\n setTableOfContentsVisibility();\n });\n let packageCardCheckbox = $("#accordion-checkbox-package-card");\n let packageCardBackground = $("#accordion-package-card");\n packageCardCheckbox.on("change", function () {\n if (packageCardCheckbox.is(":checked")) {\n packageCardBackground.css("background", "#fff");\n }\n else {\n packageCardBackground.css("background", "#f9f9f9");\n }\n });\n function loadContentWidthState() {\n const contentWidthState = window.localStorage.getItem("content-width-state");\n if (contentWidthState === "expanded") {\n expandContentWidth();\n }\n else {\n collapseContentWidth();\n }\n }\n let collapseContentButton = $("#collapse-content-button");\n let expandContentButton = $("#expand-content-button");\n function expandContentWidth() {\n $(".docs-main-content").addClass("docs-content-width-expanded");\n if (window.location.pathname.startsWith("/registry")) {\n $(".docs-main-content").addClass("expand-registry");\n }\n collapseContentButton.removeClass("hide");\n expandContentButton.addClass("hide");\n window.localStorage.setItem("content-width-state", "expanded");\n }\n function collapseContentWidth() {\n $(".docs-main-content").removeClass("docs-content-width-expanded");\n collapseContentButton.addClass("hide");\n expandContentButton.removeClass("hide");\n window.localStorage.setItem("content-width-state", "collapsed");\n }\n expandContentButton.on("click", expandContentWidth);\n collapseContentButton.on("click", collapseContentWidth);\n loadContentWidthState();\n})(document, jQuery);\nfunction setDocsMainNavPosition() {\n if ($(this).width() <= 1280) {\n if (docsMainNavToggleWrapper.hasClass("docs-nav-show")) {\n docsNavToggleIcon.removeClass("open-docs-main-nav");\n docsNavToggleIcon.addClass("close-docs-main-nav");\n }\n else if (docsMainNavToggleWrapper.hasClass("docs-nav-hide")) {\n docsNavToggleIcon.removeClass("close-docs-main-nav");\n docsNavToggleIcon.addClass("open-docs-main-nav");\n }\n }\n let mainNav = $(".main-nav");\n let mainNavToggle = $(".docs-nav-toggle");\n let docsTypeNavSearch = $(".docs-type-nav-search");\n let docsToggleOffset = 94;\n if ($(".section-docs .docs-list-main").length > 0) {\n if ($(".section-docs .docs-list-main").get(0).getBoundingClientRect().y <= 0) {\n mainNav.css("margin-top", docsTypeNavSearch.height() - Math.max($(".top-nav-container").get(0).getBoundingClientRect().y, 0));\n mainNavToggle.css("top", docsToggleOffset + docsTypeNavSearch.height() - Math.max($(".top-nav-container").get(0).getBoundingClientRect().y, 0));\n }\n else {\n mainNav.css("margin-top", 0);\n }\n }\n if ($(this).width() > 1280) {\n docsMainNavToggleWrapper.removeClass("docs-nav-show");\n docsMainNavToggleWrapper.removeClass("docs-nav-hide");\n }\n else if (!docsMainNavToggleWrapper.hasClass("docs-nav-hide") && !docsMainNavToggleWrapper.hasClass("docs-nav-show")) {\n docsMainNavToggleWrapper.addClass("docs-nav-hide");\n }\n}\nfunction setTableOfContentsVisibility() {\n let docsTableOfContents = $(".docs-toc-desktop");\n if (window.innerWidth > 1024 && window.innerWidth <= 1280) {\n if (docsMainNavToggleWrapper.hasClass("docs-nav-show")) {\n docsTableOfContents.hide();\n }\n else {\n docsTableOfContents.show();\n }\n }\n else if (window.innerWidth > 1280) {\n docsTableOfContents.show();\n }\n else {\n docsTableOfContents.hide();\n }\n}\nfunction setMainNavHeight() {\n $(".docs-main-nav").css("height", $(".docs-footer").height() + window.innerHeight);\n}\n\n\n//# sourceURL=webpack://theme/./src/ts/docs-main.ts?')},"./src/ts/event-filtering.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/ts/util.ts");\n\n$(function () {\n /**\n * This function creates a checkbox from a given text string.\n * It will set the label and the value to whatever the input string is.\n *\n * @param {string} text The label and value of the checkbox\n */\n function createCheckbox(text) {\n var filterValue = (0,_util__WEBPACK_IMPORTED_MODULE_0__.getQueryVariable)("filter");\n var container = document.createElement("div");\n container.className = "my-2 uppercase flex items-center";\n var checkbox = document.createElement("input");\n checkbox.id = "checkbox-" + text;\n checkbox.type = "checkbox";\n checkbox.className = "mr-2 cursor-pointer";\n checkbox.value = text.toLowerCase();\n // If the filter query parameter is available use it to determine\n // what checkboxes should initially be checked. If the query param\n // is not set, check all the boxes.\n if (filterValue !== undefined) {\n var shouldBeChecked = filterValue.toLowerCase().split(",").indexOf(checkbox.value) > -1;\n if (shouldBeChecked) {\n checkbox.checked = true;\n }\n }\n else {\n checkbox.checked = true;\n }\n var label = document.createElement("label");\n label.innerText = text + "s";\n label.className = "cursor-pointer";\n label.setAttribute("for", checkbox.id);\n container.appendChild(checkbox);\n container.appendChild(label);\n return container;\n }\n // This function grabs the filter checkboxes, loops through them to\n // determine what is checked, and then filters the events.\n function getFilterValuesAndFilterList() {\n var inputs = $("input[type=\'checkbox\']");\n var chosenInputs = [];\n for (var i = 0; i < inputs.length; i++) {\n var input = inputs[i];\n var isChecked = $(input).prop("checked");\n if (isChecked) {\n chosenInputs.push($(input).val());\n }\n }\n filterEventList(chosenInputs);\n }\n /**\n * This function checks to see if two arrays have any value in common. This\n * function can return false for arrays of objects becasue the objects\n * in each array can have different references.\n *\n * @param {*[]} arr1 An array of non object values\n * @param {*[]} arr2 An array of non object values\n */\n function checkForIntersection(arr1, arr2) {\n for (var i = 0; i < arr1.length; i++) {\n var val = arr1[i];\n if (arr2.indexOf(val) > -1) {\n return true;\n }\n }\n return false;\n }\n /**\n * This function will fitler the event list and hide/show specific items\n * based on the select checkboxes. If no checkboxes are selected we will show all\n * the events.\n *\n * @param {string[]} tags An array of tags that should appear in the event list.\n */\n function filterEventList(tags) {\n var events = $("#event-list li");\n var visibleEvents = 0;\n for (var i = 0; i < events.length; i++) {\n var event = $(events[i]);\n var dataEventType = event.attr("data-event-type").split(",");\n var shouldBeVisible = tags.length === 0 ? true : checkForIntersection(tags, dataEventType);\n if (shouldBeVisible) {\n visibleEvents += 1;\n event.removeClass("hidden");\n }\n else {\n event.addClass("hidden");\n }\n }\n if (visibleEvents === events.length) {\n $("#event-list-heading").text("All Upcoming Events");\n }\n else {\n $("#event-list-heading").text(visibleEvents + " Upcoming Events");\n }\n }\n // This is the start of the code that is executed on page load.\n var eventsElements = $(".event-tags span");\n var eventFilterParent = $("#eventFilter");\n // Check to see if the event elements exists.\n if (!eventsElements.length) {\n // Stop the script as there are no tags to filter.\n return;\n }\n if (!eventFilterParent.length) {\n // Stop the script because the event filter element does not exist.\n return;\n }\n var tags = [];\n // Loop through the tags and create a unique array of tag names and\n // append a checkbox to the event filter for each unique tag.\n for (var i = 0; i < eventsElements.length; i++) {\n var elem = eventsElements[i];\n // Grab the text of the element. We use the .text method because\n // it will grab the string value of the text.\n //\n // See: https://api.jquery.com/text/\n var text = $(elem).text();\n if (tags.indexOf(text) === -1) {\n tags.push(text);\n const input = createCheckbox(text);\n eventFilterParent.append(input);\n }\n }\n // Filter the events based on the filter query parameter.\n getFilterValuesAndFilterList();\n // This click handler will determine which checkboxes are selected\n // and then provide them to the filter event function to filter the events.\n $("#eventFilter input[type=\'checkbox\']").click(function () {\n getFilterValuesAndFilterList();\n });\n});\n\n\n//# sourceURL=webpack://theme/./src/ts/event-filtering.ts?')},"./src/ts/main.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _stencil_dist__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../stencil/dist */ "./stencil/dist/index.js");\n/* harmony import */ var _scss_main_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../scss/main.scss */ "./src/scss/main.scss");\n/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./misc */ "./src/ts/misc.ts");\n/* harmony import */ var _nav__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nav */ "./src/ts/nav.ts");\n/* harmony import */ var _carousel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./carousel */ "./src/ts/carousel.ts");\n/* harmony import */ var _carousel__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_carousel__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _chooser__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./chooser */ "./src/ts/chooser.ts");\n/* harmony import */ var _price_toggle__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./price-toggle */ "./src/ts/price-toggle.ts");\n/* harmony import */ var _price_toggle__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_price_toggle__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _noselect__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./noselect */ "./src/ts/noselect.ts");\n/* harmony import */ var _noselect__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_noselect__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _tracking__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tracking */ "./src/ts/tracking.ts");\n/* harmony import */ var _tracking__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_tracking__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _docs_feedback__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./docs-feedback */ "./src/ts/docs-feedback.ts");\n/* harmony import */ var _docs_feedback__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_docs_feedback__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _event_filtering__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./event-filtering */ "./src/ts/event-filtering.ts");\n/* harmony import */ var _copybutton__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./copybutton */ "./src/ts/copybutton.ts");\n/* harmony import */ var _code_tabbed__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./code-tabbed */ "./src/ts/code-tabbed.ts");\n/* harmony import */ var _code_tabbed__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_code_tabbed__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _resources__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./resources */ "./src/ts/resources.ts");\n/* harmony import */ var _resources__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_resources__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _packages__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./packages */ "./src/ts/packages.ts");\n/* harmony import */ var _packages__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_packages__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _pricing_trial__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./pricing-trial */ "./src/ts/pricing-trial.ts");\n/* harmony import */ var _pricing_trial__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(_pricing_trial__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _pricing__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./pricing */ "./src/ts/pricing.ts");\n/* harmony import */ var _pricing__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(_pricing__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _pulumi_cloud__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./pulumi-cloud */ "./src/ts/pulumi-cloud.ts");\n/* harmony import */ var _pulumi_cloud__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(_pulumi_cloud__WEBPACK_IMPORTED_MODULE_17__);\n/* harmony import */ var _developer_advocates__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./developer-advocates */ "./src/ts/developer-advocates.ts");\n/* harmony import */ var _developer_advocates__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(_developer_advocates__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var _toc__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./toc */ "./src/ts/toc.ts");\n/* harmony import */ var _toc__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(_toc__WEBPACK_IMPORTED_MODULE_19__);\n/* harmony import */ var _docs_main__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./docs-main */ "./src/ts/docs-main.ts");\n/* harmony import */ var _docs_main__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(_docs_main__WEBPACK_IMPORTED_MODULE_20__);\n/* harmony import */ var _redirects__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./redirects */ "./src/ts/redirects.ts");\n/* harmony import */ var _redirects__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(_redirects__WEBPACK_IMPORTED_MODULE_21__);\n/* harmony import */ var _algolia_autocomplete__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./algolia/autocomplete */ "./src/ts/algolia/autocomplete.ts");\n/* harmony import */ var _terraform_compare__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./terraform-compare */ "./src/ts/terraform-compare.ts");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Register all Stencil components.\n(0,_stencil_dist__WEBPACK_IMPORTED_MODULE_0__.defineCustomElements)();\n\n\n//# sourceURL=webpack://theme/./src/ts/main.ts?')},"./src/ts/misc.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "generateOnThisPage": () => (/* binding */ generateOnThisPage)\n/* harmony export */ });\n/* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./state */ "./src/ts/state.ts");\n\nconst navigationState = new _state__WEBPACK_IMPORTED_MODULE_0__.LocalStorageService("navigation-toggle-state");\nloadToggleStates();\nfunction bindToggle(el) {\n $(".toggleButton", el).click(function () {\n if ($(this).closest(".toggle, .toggleVisible")[0] != el) {\n // Only trigger the closest toggle header.\n return;\n }\n if ($(el).is(".toggle")) {\n $(el).addClass("toggleVisible").removeClass("toggle");\n }\n else {\n $(el).addClass("toggle").removeClass("toggleVisible");\n }\n });\n}\nfunction loadToggleStates() {\n // checks whether the menu item refers to the current page the\n // user is on.\n const isCurrentPage = (el) => {\n const browserUrl = window.location.href;\n const anchorRef = $(el).find(\'a\').attr(\'href\');\n return browserUrl.includes(anchorRef);\n };\n $(".toggle-topLevel, .toggleVisible-topLevel").each(function (i, el) {\n if (navigationState.getKey(el.id) == "expanded" || isCurrentPage(el)) {\n $(el).addClass("toggleVisible").removeClass("toggle");\n }\n else if (navigationState.getKey(el.id) == "collapsed") {\n $(el).addClass("toggle").removeClass("toggleVisible");\n }\n // Control open/closed folder icons if they exist as a subelement of the parent toggle-able item.\n $(el).click(function () {\n const folderOpenIcon = $(el).find(".folder-open");\n const folderClosedIcon = $(el).find(".folder");\n if (folderOpenIcon.length > 0) {\n folderOpenIcon.addClass("folder").removeClass("folder-open");\n }\n else if (folderClosedIcon.length > 0) {\n folderClosedIcon.addClass("folder-open").removeClass("folder");\n }\n });\n });\n $(".toggleVisible, .toggleVisible-topLevel").each(function (i, el) {\n // Scroll to active item in list.\n if (isCurrentPage(el)) {\n $("#left-nav").animate({\n scrollTop: $(el).offset().top - 145\n }, 0);\n }\n });\n}\nfunction updateToggleState(el, toggleState) {\n navigationState.updateKey(el.id, toggleState);\n}\nfunction bindTopLevelToggle(el) {\n $(".toggleButton-topLevel", el).click(function () {\n if ($(this).closest(".toggle-topLevel, .toggleVisible-topLevel")[0] != el) {\n // Only trigger the closest toggle header.\n return;\n }\n if ($(el).is(".toggle")) {\n $(el).addClass("toggleVisible").removeClass("toggle");\n updateToggleState(el, "expanded");\n }\n else {\n $(el).addClass("toggle").removeClass("toggleVisible");\n updateToggleState(el, "collapsed");\n }\n });\n}\nfunction bindTopLevelToggles(selector) {\n $(selector).each(function (i, el) {\n bindTopLevelToggle(el);\n });\n}\nfunction bindToggles(selector) {\n $(selector).each(function (i, el) {\n bindToggle(el);\n });\n}\nfunction generateOnThisPage() {\n // Hide the table of contents by default. We explicitly decide when to show it\n // below based on if elements exist to display.\n $(".table-of-contents").hide();\n var $ul = $(".table-of-contents .content ul.table-of-contents-list");\n if ($ul) {\n var found = false;\n var headings = [];\n $("h2, h3").each(function () {\n var $el = $(this);\n // Skip if this heading is inside a hidden element\n if ($el.closest(\'.hidden\').length > 0) {\n return;\n }\n var id = $el.attr("id");\n var text = $el.text();\n var linkTitle = $el.data("link-title");\n var tag = $el.prop("tagName").toLowerCase();\n if (id && text) {\n found = true;\n var li = $("' + func(text) + '
';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles
'\n */\n function wrap(value, wrapper) {\n return partial(castFunction(wrapper), value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Casts `value` as an array if it's not one.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Lang\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast array.\n * @example\n *\n * _.castArray(1);\n * // => [1]\n *\n * _.castArray({ 'a': 1 });\n * // => [{ 'a': 1 }]\n *\n * _.castArray('abc');\n * // => ['abc']\n *\n * _.castArray(null);\n * // => [null]\n *\n * _.castArray(undefined);\n * // => [undefined]\n *\n * _.castArray();\n * // => []\n *\n * var array = [1, 2, 3];\n * console.log(_.castArray(array) === array);\n * // => true\n */\n function castArray() {\n if (!arguments.length) {\n return [];\n }\n var value = arguments[0];\n return isArray(value) ? value : [value];\n }\n\n /**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\n function clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.clone` except that it accepts `customizer` which\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n * cloning is handled by the method instead. The `customizer` is invoked with\n * up to four arguments; (value [, index|key, object, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeepWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * }\n *\n * var el = _.cloneWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 0\n */\n function cloneWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined$1;\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\n function cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.cloneWith` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the deep cloned value.\n * @see _.cloneWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(true);\n * }\n * }\n *\n * var el = _.cloneDeepWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 20\n */\n function cloneDeepWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined$1;\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * Checks if `object` conforms to `source` by invoking the predicate\n * properties of `source` with the corresponding property values of `object`.\n *\n * **Note:** This method is equivalent to `_.conforms` when `source` is\n * partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n * // => true\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n * // => false\n */\n function conformsTo(object, source) {\n return source == null || baseConformsTo(object, source, keys(source));\n }\n\n /**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\n function eq(value, other) {\n return value === other || (value !== value && other !== other);\n }\n\n /**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n * @see _.lt\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */\n var gt = createRelationalOperation(baseGt);\n\n /**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\n * `other`, else `false`.\n * @see _.lte\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */\n var gte = createRelationalOperation(function(value, other) {\n return value >= other;\n });\n\n /**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n };\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\n var isArray = Array.isArray;\n\n /**\n * Checks if `value` is classified as an `ArrayBuffer` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n * @example\n *\n * _.isArrayBuffer(new ArrayBuffer(2));\n * // => true\n *\n * _.isArrayBuffer(new Array(2));\n * // => false\n */\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n /**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n function isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n }\n\n /**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\n function isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n }\n\n /**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\n function isBoolean(value) {\n return value === true || value === false ||\n (isObjectLike(value) && baseGetTag(value) == boolTag);\n }\n\n /**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\n var isBuffer = nativeIsBuffer || stubFalse;\n\n /**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n /**\n * Checks if `value` is likely a DOM element.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('');\n * // => false\n */\n function isElement(value) {\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n }\n\n /**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\n function isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\n function isEqual(value, other) {\n return baseIsEqual(value, other);\n }\n\n /**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */\n function isEqualWith(value, other, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined$1;\n var result = customizer ? customizer(value, other) : undefined$1;\n return result === undefined$1 ? baseIsEqual(value, other, undefined$1, customizer) : !!result;\n }\n\n /**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\n function isError(value) {\n if (!isObjectLike(value)) {\n return false;\n }\n var tag = baseGetTag(value);\n return tag == errorTag || tag == domExcTag ||\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n }\n\n /**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */\n function isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n }\n\n /**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */\n function isInteger(value) {\n return typeof value == 'number' && value == toInteger(value);\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\n function isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n }\n\n /**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n function isObjectLike(value) {\n return value != null && typeof value == 'object';\n }\n\n /**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n /**\n * Performs a partial deep comparison between `object` and `source` to\n * determine if `object` contains equivalent property values.\n *\n * **Note:** This method is equivalent to `_.matches` when `source` is\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.isMatch(object, { 'b': 2 });\n * // => true\n *\n * _.isMatch(object, { 'b': 1 });\n * // => false\n */\n function isMatch(object, source) {\n return object === source || baseIsMatch(object, source, getMatchData(source));\n }\n\n /**\n * This method is like `_.isMatch` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with five\n * arguments: (objValue, srcValue, index|key, object, source).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, srcValue) {\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\n * return true;\n * }\n * }\n *\n * var object = { 'greeting': 'hello' };\n * var source = { 'greeting': 'hi' };\n *\n * _.isMatchWith(object, source, customizer);\n * // => true\n */\n function isMatchWith(object, source, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined$1;\n return baseIsMatch(object, source, getMatchData(source), customizer);\n }\n\n /**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is based on\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n * `undefined` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\n function isNaN(value) {\n // An `NaN` primitive is the only value that is not equal to itself.\n // Perform the `toStringTag` check first to avoid errors with some\n // ActiveX objects in IE.\n return isNumber(value) && value != +value;\n }\n\n /**\n * Checks if `value` is a pristine native function.\n *\n * **Note:** This method can't reliably detect native functions in the presence\n * of the core-js package because core-js circumvents this kind of detection.\n * Despite multiple requests, the core-js maintainer has made it clear: any\n * attempt to fix the detection will be obstructed. As a result, we're left\n * with little choice but to throw an error. Unfortunately, this also affects\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n * which rely on core-js.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\n function isNative(value) {\n if (isMaskable(value)) {\n throw new Error(CORE_ERROR_TEXT);\n }\n return baseIsNative(value);\n }\n\n /**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */\n function isNull(value) {\n return value === null;\n }\n\n /**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\n function isNil(value) {\n return value == null;\n }\n\n /**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\n function isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n }\n\n /**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\n function isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n }\n\n /**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n /**\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n * double precision number which isn't the result of a rounded unsafe integer.\n *\n * **Note:** This method is based on\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n * @example\n *\n * _.isSafeInteger(3);\n * // => true\n *\n * _.isSafeInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isSafeInteger(Infinity);\n * // => false\n *\n * _.isSafeInteger('3');\n * // => false\n */\n function isSafeInteger(value) {\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n /**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\n function isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n }\n\n /**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\n function isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n }\n\n /**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n /**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\n function isUndefined(value) {\n return value === undefined$1;\n }\n\n /**\n * Checks if `value` is classified as a `WeakMap` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n * @example\n *\n * _.isWeakMap(new WeakMap);\n * // => true\n *\n * _.isWeakMap(new Map);\n * // => false\n */\n function isWeakMap(value) {\n return isObjectLike(value) && getTag(value) == weakMapTag;\n }\n\n /**\n * Checks if `value` is classified as a `WeakSet` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n * @example\n *\n * _.isWeakSet(new WeakSet);\n * // => true\n *\n * _.isWeakSet(new Set);\n * // => false\n */\n function isWeakSet(value) {\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n }\n\n /**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n * @see _.gt\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */\n var lt = createRelationalOperation(baseLt);\n\n /**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to\n * `other`, else `false`.\n * @see _.gte\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */\n var lte = createRelationalOperation(function(value, other) {\n return value <= other;\n });\n\n /**\n * Converts `value` to an array.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * _.toArray({ 'a': 1, 'b': 2 });\n * // => [1, 2]\n *\n * _.toArray('abc');\n * // => ['a', 'b', 'c']\n *\n * _.toArray(1);\n * // => []\n *\n * _.toArray(null);\n * // => []\n */\n function toArray(value) {\n if (!value) {\n return [];\n }\n if (isArrayLike(value)) {\n return isString(value) ? stringToArray(value) : copyArray(value);\n }\n if (symIterator && value[symIterator]) {\n return iteratorToArray(value[symIterator]());\n }\n var tag = getTag(value),\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n return func(value);\n }\n\n /**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\n function toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n }\n\n /**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\n function toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n }\n\n /**\n * Converts `value` to an integer suitable for use as the length of an\n * array-like object.\n *\n * **Note:** This method is based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toLength(3.2);\n * // => 3\n *\n * _.toLength(Number.MIN_VALUE);\n * // => 0\n *\n * _.toLength(Infinity);\n * // => 4294967295\n *\n * _.toLength('3.2');\n * // => 3\n */\n function toLength(value) {\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n }\n\n /**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\n function toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n }\n\n /**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\n function toPlainObject(value) {\n return copyObject(value, keysIn(value));\n }\n\n /**\n * Converts `value` to a safe integer. A safe integer can be compared and\n * represented correctly.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toSafeInteger(3.2);\n * // => 3\n *\n * _.toSafeInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toSafeInteger(Infinity);\n * // => 9007199254740991\n *\n * _.toSafeInteger('3.2');\n * // => 3\n */\n function toSafeInteger(value) {\n return value\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n : (value === 0 ? value : 0);\n }\n\n /**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\n function toString(value) {\n return value == null ? '' : baseToString(value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\n var assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n });\n\n /**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n */\n var assignIn = createAssigner(function(object, source) {\n copyObject(source, keysIn(source), object);\n });\n\n /**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n });\n\n /**\n * This method is like `_.assign` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignInWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keys(source), object, customizer);\n });\n\n /**\n * Creates an array of values corresponding to `paths` of `object`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Array} Returns the picked values.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _.at(object, ['a[0].b.c', 'a[1]']);\n * // => [3, 4]\n */\n var at = flatRest(baseAt);\n\n /**\n * Creates an object that inherits from the `prototype` object. If a\n * `properties` object is given, its own enumerable string keyed properties\n * are assigned to the created object.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n * 'constructor': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */\n function create(prototype, properties) {\n var result = baseCreate(prototype);\n return properties == null ? result : baseAssign(result, properties);\n }\n\n /**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined$1;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined$1 ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n });\n\n /**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaults\n * @example\n *\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n * // => { 'a': { 'b': 2, 'c': 3 } }\n */\n var defaultsDeep = baseRest(function(args) {\n args.push(undefined$1, customDefaultsMerge);\n return apply(mergeWith, undefined$1, args);\n });\n\n /**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findKey(users, function(o) { return o.age < 40; });\n * // => 'barney' (iteration order is not guaranteed)\n *\n * // The `_.matches` iteratee shorthand.\n * _.findKey(users, { 'age': 1, 'active': true });\n * // => 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findKey(users, 'active');\n * // => 'barney'\n */\n function findKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n }\n\n /**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findLastKey(users, function(o) { return o.age < 40; });\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastKey(users, { 'age': 36, 'active': true });\n * // => 'barney'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastKey(users, 'active');\n * // => 'pebbles'\n */\n function findLastKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n }\n\n /**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */\n function forIn(object, iteratee) {\n return object == null\n ? object\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n */\n function forInRight(object, iteratee) {\n return object == null\n ? object\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forOwn(object, iteratee) {\n return object && baseForOwn(object, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n */\n function forOwnRight(object, iteratee) {\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an array of function property names from own enumerable properties\n * of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functionsIn\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functions(new Foo);\n * // => ['a', 'b']\n */\n function functions(object) {\n return object == null ? [] : baseFunctions(object, keys(object));\n }\n\n /**\n * Creates an array of function property names from own and inherited\n * enumerable properties of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functions\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functionsIn(new Foo);\n * // => ['a', 'b', 'c']\n */\n function functionsIn(object) {\n return object == null ? [] : baseFunctions(object, keysIn(object));\n }\n\n /**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined$1 : baseGet(object, path);\n return result === undefined$1 ? defaultValue : result;\n }\n\n /**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\n function has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n }\n\n /**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\n function hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n }\n\n /**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n */\n var invert = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n result[value] = key;\n }, constant(identity));\n\n /**\n * This method is like `_.invert` except that the inverted object is generated\n * from the results of running each element of `object` thru `iteratee`. The\n * corresponding inverted value of each inverted key is an array of keys\n * responsible for generating the inverted value. The iteratee is invoked\n * with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Object\n * @param {Object} object The object to invert.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invertBy(object);\n * // => { '1': ['a', 'c'], '2': ['b'] }\n *\n * _.invertBy(object, function(value) {\n * return 'group' + value;\n * });\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n */\n var invertBy = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n if (hasOwnProperty.call(result, value)) {\n result[value].push(key);\n } else {\n result[value] = [key];\n }\n }, getIteratee);\n\n /**\n * Invokes the method at `path` of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n *\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n * // => [2, 3]\n */\n var invoke = baseRest(baseInvoke);\n\n /**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\n function keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n }\n\n /**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\n function keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n }\n\n /**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n * with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapValues\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */\n function mapKeys(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, iteratee(value, key, object), value);\n });\n return result;\n }\n\n /**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\n function mapValues(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n }\n\n /**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\n var merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n });\n\n /**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n * if (_.isArray(objValue)) {\n * return objValue.concat(srcValue);\n * }\n * }\n *\n * var object = { 'a': [1], 'b': [2] };\n * var other = { 'a': [3], 'b': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { 'a': [1, 3], 'b': [2, 4] }\n */\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n baseMerge(object, source, srcIndex, customizer);\n });\n\n /**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */\n var omit = flatRest(function(object, paths) {\n var result = {};\n if (object == null) {\n return result;\n }\n var isDeep = false;\n paths = arrayMap(paths, function(path) {\n path = castPath(path, object);\n isDeep || (isDeep = path.length > 1);\n return path;\n });\n copyObject(object, getAllKeysIn(object), result);\n if (isDeep) {\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n }\n var length = paths.length;\n while (length--) {\n baseUnset(result, paths[length]);\n }\n return result;\n });\n\n /**\n * The opposite of `_.pickBy`; this method creates an object composed of\n * the own and inherited enumerable string keyed properties of `object` that\n * `predicate` doesn't return truthy for. The predicate is invoked with two\n * arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omitBy(object, _.isNumber);\n * // => { 'b': '2' }\n */\n function omitBy(object, predicate) {\n return pickBy(object, negate(getIteratee(predicate)));\n }\n\n /**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\n var pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n });\n\n /**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */\n function pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\n var props = arrayMap(getAllKeysIn(object), function(prop) {\n return [prop];\n });\n predicate = getIteratee(predicate);\n return basePickBy(object, props, function(value, path) {\n return predicate(value, path[0]);\n });\n }\n\n /**\n * This method is like `_.get` except that if the resolved value is a\n * function it's invoked with the `this` binding of its parent object and\n * its result is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n *\n * _.result(object, 'a[0].b.c1');\n * // => 3\n *\n * _.result(object, 'a[0].b.c2');\n * // => 4\n *\n * _.result(object, 'a[0].b.c3', 'default');\n * // => 'default'\n *\n * _.result(object, 'a[0].b.c3', _.constant('default'));\n * // => 'default'\n */\n function result(object, path, defaultValue) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length;\n\n // Ensure the loop is entered when path is empty.\n if (!length) {\n length = 1;\n object = undefined$1;\n }\n while (++index < length) {\n var value = object == null ? undefined$1 : object[toKey(path[index])];\n if (value === undefined$1) {\n index = length;\n value = defaultValue;\n }\n object = isFunction(value) ? value.call(object) : value;\n }\n return object;\n }\n\n /**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\n function set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n }\n\n /**\n * This method is like `_.set` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.setWith(object, '[0][1]', 'a', Object);\n * // => { '0': { '1': 'a' } }\n */\n function setWith(object, path, value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined$1;\n return object == null ? object : baseSet(object, path, value, customizer);\n }\n\n /**\n * Creates an array of own enumerable string keyed-value pairs for `object`\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n * entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entries\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairs(new Foo);\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n */\n var toPairs = createToPairs(keys);\n\n /**\n * Creates an array of own and inherited enumerable string keyed-value pairs\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n * or set, its entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entriesIn\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairsIn(new Foo);\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n */\n var toPairsIn = createToPairs(keysIn);\n\n /**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\n function transform(object, iteratee, accumulator) {\n var isArr = isArray(object),\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n iteratee = getIteratee(iteratee, 4);\n if (accumulator == null) {\n var Ctor = object && object.constructor;\n if (isArrLike) {\n accumulator = isArr ? new Ctor : [];\n }\n else if (isObject(object)) {\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n }\n else {\n accumulator = {};\n }\n }\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n return iteratee(accumulator, value, index, object);\n });\n return accumulator;\n }\n\n /**\n * Removes the property at `path` of `object`.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n * _.unset(object, 'a[0].b.c');\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n *\n * _.unset(object, ['a', '0', 'b', 'c']);\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n */\n function unset(object, path) {\n return object == null ? true : baseUnset(object, path);\n }\n\n /**\n * This method is like `_.set` except that accepts `updater` to produce the\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n * is invoked with one argument: (value).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n * console.log(object.a[0].b.c);\n * // => 9\n *\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n * console.log(object.x[0].y.z);\n * // => 0\n */\n function update(object, path, updater) {\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\n }\n\n /**\n * This method is like `_.update` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n * // => { '0': { '1': 'a' } }\n */\n function updateWith(object, path, updater, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined$1;\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n }\n\n /**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\n function values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n }\n\n /**\n * Creates an array of the own and inherited enumerable string keyed property\n * values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */\n function valuesIn(object) {\n return object == null ? [] : baseValues(object, keysIn(object));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */\n function clamp(number, lower, upper) {\n if (upper === undefined$1) {\n upper = lower;\n lower = undefined$1;\n }\n if (upper !== undefined$1) {\n upper = toNumber(upper);\n upper = upper === upper ? upper : 0;\n }\n if (lower !== undefined$1) {\n lower = toNumber(lower);\n lower = lower === lower ? lower : 0;\n }\n return baseClamp(toNumber(number), lower, upper);\n }\n\n /**\n * Checks if `n` is between `start` and up to, but not including, `end`. If\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\n * If `start` is greater than `end` the params are swapped to support\n * negative ranges.\n *\n * @static\n * @memberOf _\n * @since 3.3.0\n * @category Number\n * @param {number} number The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n * @see _.range, _.rangeRight\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n *\n * _.inRange(-3, -2, -6);\n * // => true\n */\n function inRange(number, start, end) {\n start = toFinite(start);\n if (end === undefined$1) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n number = toNumber(number);\n return baseInRange(number, start, end);\n }\n\n /**\n * Produces a random number between the inclusive `lower` and `upper` bounds.\n * If only one argument is provided a number between `0` and the given number\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\n * floats, a floating-point number is returned instead of an integer.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Number\n * @param {number} [lower=0] The lower bound.\n * @param {number} [upper=1] The upper bound.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\n function random(lower, upper, floating) {\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n upper = floating = undefined$1;\n }\n if (floating === undefined$1) {\n if (typeof upper == 'boolean') {\n floating = upper;\n upper = undefined$1;\n }\n else if (typeof lower == 'boolean') {\n floating = lower;\n lower = undefined$1;\n }\n }\n if (lower === undefined$1 && upper === undefined$1) {\n lower = 0;\n upper = 1;\n }\n else {\n lower = toFinite(lower);\n if (upper === undefined$1) {\n upper = lower;\n lower = 0;\n } else {\n upper = toFinite(upper);\n }\n }\n if (lower > upper) {\n var temp = lower;\n lower = upper;\n upper = temp;\n }\n if (floating || lower % 1 || upper % 1) {\n var rand = nativeRandom();\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n }\n return baseRandom(lower, upper);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\n var camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n });\n\n /**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\n function capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n }\n\n /**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\n function deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n }\n\n /**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search up to.\n * @returns {boolean} Returns `true` if `string` ends with `target`,\n * else `false`.\n * @example\n *\n * _.endsWith('abc', 'c');\n * // => true\n *\n * _.endsWith('abc', 'b');\n * // => false\n *\n * _.endsWith('abc', 'b', 2);\n * // => true\n */\n function endsWith(string, target, position) {\n string = toString(string);\n target = baseToString(target);\n\n var length = string.length;\n position = position === undefined$1\n ? length\n : baseClamp(toInteger(position), 0, length);\n\n var end = position;\n position -= target.length;\n return position >= 0 && string.slice(position, end) == target;\n }\n\n /**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */\n function escape(string) {\n string = toString(string);\n return (string && reHasUnescapedHtml.test(string))\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\n : string;\n }\n\n /**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\n function escapeRegExp(string) {\n string = toString(string);\n return (string && reHasRegExpChar.test(string))\n ? string.replace(reRegExpChar, '\\\\$&')\n : string;\n }\n\n /**\n * Converts `string` to\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase('Foo Bar');\n * // => 'foo-bar'\n *\n * _.kebabCase('fooBar');\n * // => 'foo-bar'\n *\n * _.kebabCase('__FOO_BAR__');\n * // => 'foo-bar'\n */\n var kebabCase = createCompounder(function(result, word, index) {\n return result + (index ? '-' : '') + word.toLowerCase();\n });\n\n /**\n * Converts `string`, as space separated words, to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.lowerCase('--Foo-Bar--');\n * // => 'foo bar'\n *\n * _.lowerCase('fooBar');\n * // => 'foo bar'\n *\n * _.lowerCase('__FOO_BAR__');\n * // => 'foo bar'\n */\n var lowerCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + word.toLowerCase();\n });\n\n /**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst('Fred');\n * // => 'fred'\n *\n * _.lowerFirst('FRED');\n * // => 'fRED'\n */\n var lowerFirst = createCaseFirst('toLowerCase');\n\n /**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => ' abc '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */\n function pad(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n if (!length || strLength >= length) {\n return string;\n }\n var mid = (length - strLength) / 2;\n return (\n createPadding(nativeFloor(mid), chars) +\n string +\n createPadding(nativeCeil(mid), chars)\n );\n }\n\n /**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd('abc', 6);\n * // => 'abc '\n *\n * _.padEnd('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padEnd('abc', 3);\n * // => 'abc'\n */\n function padEnd(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (string + createPadding(length - strLength, chars))\n : string;\n }\n\n /**\n * Pads `string` on the left side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padStart('abc', 6);\n * // => ' abc'\n *\n * _.padStart('abc', 6, '_-');\n * // => '_-_abc'\n *\n * _.padStart('abc', 3);\n * // => 'abc'\n */\n function padStart(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (createPadding(length - strLength, chars) + string)\n : string;\n }\n\n /**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n * hexadecimal, in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix=10] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */\n function parseInt(string, radix, guard) {\n if (guard || radix == null) {\n radix = 0;\n } else if (radix) {\n radix = +radix;\n }\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n }\n\n /**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=1] The number of times to repeat the string.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */\n function repeat(string, n, guard) {\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined$1)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n return baseRepeat(toString(string), n);\n }\n\n /**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace('Hi Fred', 'Fred', 'Barney');\n * // => 'Hi Barney'\n */\n function replace() {\n var args = arguments,\n string = toString(args[0]);\n\n return args.length < 3 ? string : string.replace(args[1], args[2]);\n }\n\n /**\n * Converts `string` to\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase('Foo Bar');\n * // => 'foo_bar'\n *\n * _.snakeCase('fooBar');\n * // => 'foo_bar'\n *\n * _.snakeCase('--FOO-BAR--');\n * // => 'foo_bar'\n */\n var snakeCase = createCompounder(function(result, word, index) {\n return result + (index ? '_' : '') + word.toLowerCase();\n });\n\n /**\n * Splits `string` by `separator`.\n *\n * **Note:** This method is based on\n * [`String#split`](https://mdn.io/String/split).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to split.\n * @param {RegExp|string} separator The separator pattern to split by.\n * @param {number} [limit] The length to truncate results to.\n * @returns {Array} Returns the string segments.\n * @example\n *\n * _.split('a-b-c', '-', 2);\n * // => ['a', 'b']\n */\n function split(string, separator, limit) {\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n separator = limit = undefined$1;\n }\n limit = limit === undefined$1 ? MAX_ARRAY_LENGTH : limit >>> 0;\n if (!limit) {\n return [];\n }\n string = toString(string);\n if (string && (\n typeof separator == 'string' ||\n (separator != null && !isRegExp(separator))\n )) {\n separator = baseToString(separator);\n if (!separator && hasUnicode(string)) {\n return castSlice(stringToArray(string), 0, limit);\n }\n }\n return string.split(separator, limit);\n }\n\n /**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar--');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__FOO_BAR__');\n * // => 'FOO BAR'\n */\n var startCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + upperFirst(word);\n });\n\n /**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`,\n * else `false`.\n * @example\n *\n * _.startsWith('abc', 'a');\n * // => true\n *\n * _.startsWith('abc', 'b');\n * // => false\n *\n * _.startsWith('abc', 'b', 1);\n * // => true\n */\n function startsWith(string, target, position) {\n string = toString(string);\n position = position == null\n ? 0\n : baseClamp(toInteger(position), 0, string.length);\n\n target = baseToString(target);\n return string.slice(position, position + target.length) == target;\n }\n\n /**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n * The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n * The \"evaluate\" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n * An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n * The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\n * The sourceURL of the compiled template.\n * @param {string} [options.variable='obj']\n * The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the \"interpolate\" delimiter to create a compiled template.\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // Use the HTML \"escape\" delimiter to escape data property values.\n * var compiled = _.template('<%- value %>');\n * compiled({ 'value': ' - Register Now - - {{ else if .Params.event.eventbrite_url }} - - - - - {{ end }} - - - {{ .Content }} - - - - - {{ partial "learnmore-contactus.html" . }} -{{ end }} diff --git a/layouts/page/aws-summit-2022.html b/layouts/page/aws-summit-2022.html index a12f136f8226..f622f9c22784 100644 --- a/layouts/page/aws-summit-2022.html +++ b/layouts/page/aws-summit-2022.html @@ -37,7 +37,7 @@Join us at one of our upcoming workshops!
diff --git a/layouts/page/devops-days-2022.html b/layouts/page/devops-days-2022.html index 3c4398d15397..b991830df4ca 100644 --- a/layouts/page/devops-days-2022.html +++ b/layouts/page/devops-days-2022.html @@ -37,7 +37,7 @@Join us at one of our upcoming workshops.
diff --git a/layouts/partials/header.html b/layouts/partials/header.html index 83ae76ed4b29..6ae58ff68d54 100644 --- a/layouts/partials/header.html +++ b/layouts/partials/header.html @@ -312,7 +312,7 @@