22 lines
136 KiB
JavaScript
22 lines
136 KiB
JavaScript
"use strict";
|
|
/*
|
|
* ATTENTION: An "eval-source-map" devtool has been used.
|
|
* This devtool is neither made for production nor for readable output files.
|
|
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
|
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
* or disable the default devtool with "devtool: false".
|
|
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
*/
|
|
self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{
|
|
|
|
/***/ "(app-pages-browser)/./app/gunbuilder/page.tsx":
|
|
/*!*********************************!*\
|
|
!*** ./app/gunbuilder/page.tsx ***!
|
|
\*********************************/
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ GunbuilderPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/data/partRoleMappings */ \"(app-pages-browser)/./data/partRoleMappings.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst STORAGE_KEY = \"gunbuilder-build-state\";\n// Category groups for the main grid\nconst CATEGORY_GROUPS = [\n {\n id: \"lower-group\",\n label: \"Lower Receiver Parts\",\n description: \"Everything from the serialized lower to small parts, fire control, and core controls.\",\n categoryIds: [\n \"lower\",\n \"completeLower\",\n \"lowerParts\",\n \"trigger\",\n \"grip\",\n \"safety\",\n \"buffer\",\n \"stock\"\n ]\n },\n {\n id: \"upper-group\",\n label: \"Upper Receiver Parts\",\n description: \"Barrel, upper, gas system, and the parts that keep the rifle cycling.\",\n categoryIds: [\n \"upper\",\n \"completeUpper\",\n \"bcg\",\n \"barrel\",\n \"gasBlock\",\n \"gasTube\",\n \"muzzleDevice\",\n \"suppressor\",\n \"handguard\",\n \"chargingHandle\",\n \"sights\",\n \"optic\"\n ]\n }\n];\nfunction GunbuilderPage() {\n _s();\n const searchParams = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams)();\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (true) {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n try {\n return JSON.parse(stored);\n } catch (e) {\n return {};\n }\n }\n }\n return {};\n });\n const [shareStatus, setShareStatus] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [shareUrl, setShareUrl] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const controller = new AbortController();\n async function fetchProducts() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(\"\".concat(API_BASE_URL, \"/api/products/gunbuilder?platform=AR-15\"), {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n const categoryId = _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_5__.PART_ROLE_TO_CATEGORY[p.partRole];\n if (!categoryId) {\n // Skip any parts we don't know how to map yet\n return null;\n }\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: String(p.id),\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n }).filter((p)=>p !== null);\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchProducts();\n return ()=>controller.abort();\n }, []);\n // Handle URL query parameter for part selection (?select=upper:165)\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const selectParam = searchParams.get(\"select\");\n if (selectParam) {\n const [categoryId, partId] = selectParam.split(\":\");\n if (categoryId && partId && _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === categoryId)) {\n setBuild((prev)=>{\n const updated = {\n ...prev,\n [categoryId]: partId\n };\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n }\n return updated;\n });\n router.replace(\"/gunbuilder\", {\n scroll: false\n });\n }\n }\n }, [\n searchParams,\n router\n ]);\n // Persist build state to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n }\n }, [\n build\n ]);\n const partsByCategory = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const grouped = {};\n for (const category of _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES){\n grouped[category.id] = parts.filter((p)=>p.categoryId === category.id);\n }\n return grouped;\n }, [\n parts\n ]);\n const selectedParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return Object.entries(build).map((param)=>{\n let [categoryId, partId] = param;\n return parts.find((p)=>p.id === partId && p.categoryId === categoryId);\n }).filter(Boolean);\n }, [\n build,\n parts\n ]);\n const totalPrice = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>selectedParts.reduce((sum, p)=>sum + p.price, 0), [\n selectedParts\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n // If no parts selected, clear the share URL\n if (Object.keys(build).length === 0) {\n setShareUrl(\"\");\n return;\n }\n try {\n var _window_location;\n const payload = JSON.stringify(build);\n const encoded = window.btoa(payload);\n var _window_location_origin;\n const origin = (_window_location_origin = (_window_location = window.location) === null || _window_location === void 0 ? void 0 : _window_location.origin) !== null && _window_location_origin !== void 0 ? _window_location_origin : \"\";\n const url = \"\".concat(origin, \"/gunbuilder/build?build=\").concat(encodeURIComponent(encoded));\n setShareUrl(url);\n } catch (e) {\n setShareUrl(\"\");\n }\n }, [\n build\n ]);\n const handleSelectPart = (categoryId, partId)=>{\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n };\n // Use group ordering for the summary as well\n const summaryCategoryOrder = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>CATEGORY_GROUPS.flatMap((group)=>group.categoryIds).filter((id)=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === id)), []);\n const handleShare = async ()=>{\n if (selectedParts.length === 0) {\n setShareStatus(\"Add a few parts before sharing your build.\");\n return;\n }\n const lines = [];\n lines.push(\"Shadow Standard — The Armory Build\");\n lines.push(\"\");\n lines.push(\"Total: $\".concat(totalPrice.toFixed(2)));\n lines.push(\"\");\n summaryCategoryOrder.forEach((categoryId)=>{\n const cat = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId);\n if (!cat) return;\n const selectedPartId = build[cat.id];\n const part = parts.find((p)=>p.id === selectedPartId && p.categoryId === cat.id);\n if (part) {\n lines.push(\"\".concat(cat.name, \": \").concat(part.brand, \" — \").concat(part.name, \" ($\").concat(part.price.toFixed(2), \")\"));\n } else {\n lines.push(\"\".concat(cat.name, \": [Not selected]\"));\n }\n });\n const text = lines.join(\"\\n\");\n try {\n await navigator.clipboard.writeText(text);\n setShareStatus(\"Build summary copied to clipboard.\");\n } catch (e) {\n setShareStatus(\"Could not access clipboard. You can copy from the build summary page.\");\n }\n };\n const handleCopyLink = async ()=>{\n if (!shareUrl) {\n setShareStatus(\"No shareable link available yet.\");\n return;\n }\n try {\n await navigator.clipboard.writeText(shareUrl);\n setShareStatus(\"Shareable link copied to clipboard.\");\n } catch (e) {\n setShareStatus(\"Could not copy link to clipboard.\");\n }\n };\n const handleNativeShare = async ()=>{\n if (!shareUrl) {\n setShareStatus(\"No shareable link available yet.\");\n return;\n }\n if (navigator.share) {\n try {\n await navigator.share({\n title: \"Shadow Standard — The Armory Build\",\n text: \"Check out my Shadow Standard Armory build.\",\n url: shareUrl\n });\n setShareStatus(\"Share dialog opened.\");\n } catch (e) {\n // User canceled or share failed; keep it quiet but let them know\n setShareStatus(\"Share canceled or unavailable. You can copy the link instead.\");\n }\n } else {\n // Fallback to copying the link\n await handleCopyLink();\n }\n };\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border-b border-amber-500/20 bg-amber-500/5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto flex max-w-6xl flex-col gap-1 px-4 py-2 text-[0.75rem] text-amber-100 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"rounded-sm bg-amber-500/20 px-2 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] text-amber-300\",\n children: \"Early Access Beta\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 333,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"hidden text-amber-100/90 md:inline\",\n children: \"You're using an early-access prototype of The Armory. Data, pricing, and available parts are still evolving.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 336,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 332,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-100/90 md:hidden\",\n children: \"Early-access prototype. Data and pricing may change.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 341,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 331,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 330,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard Co.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 350,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n \"The Build Bench: \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 354,\n columnNumber: 32\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 353,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Explore components from trusted brands, choose one part per category, track live prices, and watch your total build cost update as you go. This early-access builder keeps your setup saved locally so you can come back and refine it anytime.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 356,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 349,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 348,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mb-6 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4 flex flex-col gap-3 md:flex-row md:items-start md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"My Build Breakdown\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 369,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-400\",\n children: \"Current build total\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 373,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-semibold text-amber-300\",\n children: [\n \"$\",\n totalPrice.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 374,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500 mt-1\",\n children: [\n selectedParts.length,\n \" / \",\n _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.length,\n \" categories filled\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 377,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 372,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex flex-col items-stretch gap-2 sm:flex-row sm:flex-wrap\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/build\",\n className: \"w-full sm:w-auto rounded-md border border-amber-400/60 bg-amber-400/10 px-3 py-2 text-sm font-medium text-amber-200 hover:bg-amber-400/15 text-center transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed pointer-events-none\" : \"\"),\n children: \"Build Summary\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 384,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: handleShare,\n className: \"w-full sm:w-auto rounded-md px-3 py-2 text-sm font-semibold transition-colors border \".concat(selectedParts.length === 0 ? \"bg-zinc-900/80 text-zinc-600 border-zinc-800 cursor-not-allowed\" : \"bg-zinc-900/80 text-zinc-200 border-zinc-700 hover:bg-zinc-800\"),\n disabled: selectedParts.length === 0,\n children: \"Copy Build Summary\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 394,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>{\n setBuild({});\n if (true) {\n localStorage.removeItem(STORAGE_KEY);\n }\n },\n disabled: selectedParts.length === 0,\n className: \"w-full sm:w-auto rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-sm font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed\" : \"\"),\n children: \"Clear Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 406,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 383,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 368,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-3 md:items-end md:text-right md:flex-1\",\n children: [\n selectedParts.length > 0 && shareUrl && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"w-full md:w-auto\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h3\", {\n className: \"text-[0.7rem] font-semibold uppercase tracking-[0.16em] text-zinc-400\",\n children: \"Share Your Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 428,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-[0.7rem] text-zinc-500\",\n children: \"Share this link to let others view your build or bookmark it to come back later.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 431,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex flex-col gap-2 md:flex-row md:items-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.65rem] uppercase tracking-[0.16em] text-zinc-500 mb-1\",\n children: \"Shareable URL\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 437,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: \"text\",\n readOnly: true,\n value: shareUrl,\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-950/80 px-2 py-1.5 text-[0.7rem] text-zinc-200 font-mono outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 440,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 436,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 md:flex-none md:mt-5\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: handleNativeShare,\n className: \"flex-1 md:flex-none rounded-md bg-zinc-900/80 px-3 py-1.5 text-[0.75rem] font-semibold text-zinc-100 border border-zinc-700 hover:bg-zinc-800 hover:border-zinc-500 transition-colors\",\n children: \"Share\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 448,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: handleCopyLink,\n className: \"flex-1 md:flex-none rounded-md bg-amber-400 px-3 py-1.5 text-[0.75rem] font-semibold text-black hover:bg-amber-300 transition-colors\",\n children: \"Copy Link\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 455,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 447,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 435,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 427,\n columnNumber: 15\n }, this),\n shareStatus && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-[0.7rem] text-zinc-500\",\n children: shareStatus\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 468,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 425,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 366,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mb-4 text-xs text-zinc-500\",\n children: \"Work top-down through the major sections. Each row shows your current pick for that part type, with price and a direct buy link—or a quick way to choose a part if you haven't picked one yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 477,\n columnNumber: 11\n }, this),\n loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Loading parts from backend…\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 485,\n columnNumber: 13\n }, this),\n error && !loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400\",\n children: [\n error,\n \" — check that the Ballistic API is running and CORS is configured.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 490,\n columnNumber: 13\n }, this),\n !loading && !error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-6\",\n children: CATEGORY_GROUPS.map((group)=>{\n const groupCategories = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.filter((c)=>group.categoryIds.includes(c.id));\n if (groupCategories.length === 0) {\n return null;\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-baseline justify-between gap-2\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-sm font-semibold text-zinc-100\",\n children: group.label\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 511,\n columnNumber: 25\n }, this),\n group.description && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500 mt-1 max-w-xl\",\n children: group.description\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 515,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 510,\n columnNumber: 23\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 509,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"overflow-x-auto rounded-md border border-zinc-800 bg-zinc-950/80\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"table\", {\n className: \"min-w-full text-xs md:text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"thead\", {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-b border-zinc-800 bg-zinc-900/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-3 py-2 text-left font-semibold text-zinc-400\",\n children: \"Component / Part Type\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 526,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-3 py-2 text-left font-semibold text-zinc-400\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 529,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-3 py-2 text-right font-semibold text-zinc-400\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 532,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-3 py-2 text-right font-semibold text-zinc-400\",\n children: \"Sale Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 535,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-3 py-2 text-left font-semibold text-zinc-400\",\n children: \"Caliber\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 538,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-3 py-2 text-right font-semibold text-zinc-400\",\n children: \"Buy / Choose\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 541,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 525,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 524,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tbody\", {\n children: groupCategories.map((category)=>{\n var _partsByCategory_category_id;\n const categoryParts = (_partsByCategory_category_id = partsByCategory[category.id]) !== null && _partsByCategory_category_id !== void 0 ? _partsByCategory_category_id : [];\n const selectedPartId = build[category.id];\n const selectedPart = categoryParts.find((p)=>p.id === selectedPartId);\n const hasParts = categoryParts.length > 0;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-t border-zinc-900 hover:bg-zinc-900/60 transition-colors\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-3 py-2 align-top\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"font-medium text-zinc-100\",\n children: category.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 563,\n columnNumber: 35\n }, this),\n selectedPart ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] text-zinc-500 line-clamp-1\",\n children: selectedPart.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 567,\n columnNumber: 37\n }, this) : hasParts ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] text-zinc-600\",\n children: \"No part selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 571,\n columnNumber: 37\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] text-zinc-600\",\n children: \"No parts available yet\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 575,\n columnNumber: 37\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 562,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-3 py-2 align-top text-zinc-300\",\n children: selectedPart ? selectedPart.brand : \"—\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 582,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-3 py-2 align-top text-right text-amber-300\",\n children: selectedPart ? \"$\".concat(selectedPart.price.toFixed(2)) : \"—\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 587,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-3 py-2 align-top text-right text-zinc-400\",\n children: selectedPart ? \"—\" : \"—\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 594,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-3 py-2 align-top text-zinc-400\",\n children: \"—\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 600,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-3 py-2 align-top\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: selectedPart && selectedPart.url ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"hidden md:inline-flex rounded-md border border-zinc-700 bg-zinc-900/70 px-2.5 py-1 text-[0.7rem] font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors\",\n children: \"Change Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 610,\n columnNumber: 41\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"a\", {\n href: selectedPart.url,\n target: \"_blank\",\n rel: \"noreferrer\",\n className: \"inline-flex rounded-md bg-amber-400 px-2.5 py-1 text-[0.7rem] font-semibold text-black hover:bg-amber-300 transition-colors\",\n children: \"Buy\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 616,\n columnNumber: 41\n }, this)\n ]\n }, void 0, true) : hasParts ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"inline-flex rounded-md border border-zinc-700 bg-zinc-900/70 px-2.5 py-1 text-[0.7rem] font-medium text-zinc-200 hover:bg-zinc-800 hover:border-zinc-600 transition-colors\",\n onClick: ()=>{\n // If you want to pre-select something later, you can handle here.\n },\n children: \"Choose a Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 626,\n columnNumber: 39\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-[0.7rem] text-zinc-600\",\n children: \"—\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 636,\n columnNumber: 39\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 607,\n columnNumber: 35\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 606,\n columnNumber: 33\n }, this)\n ]\n }, category.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 557,\n columnNumber: 31\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 546,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 523,\n columnNumber: 23\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 522,\n columnNumber: 21\n }, this)\n ]\n }, group.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 508,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 497,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 476,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's New in Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 657,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Live parts and pricing pulled from multiple merchants.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 661,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Grouped layout for lower and upper receiver parts so you can see at a glance which sections of your build are still missing.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 662,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Running build total that updates automatically as you add or swap components.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 666,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Local build persistence so your selections stick around between visits on this device.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 670,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 660,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 656,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's on our roadmap\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 679,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Platform filters (AR-15, AR-9, AR-10)\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 683,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• More part categories and furniture\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 684,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Richer pricing/stock sync\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 685,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Smarter compatibility checks between components\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 686,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• AR9/AR10 support and more\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 687,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 682,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 678,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 346,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 329,\n columnNumber: 5\n }, this);\n}\n_s(GunbuilderPage, \"78cVwdxdZv31YfLZuVUR5yZ0wCk=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = GunbuilderPage;\nvar _c;\n$RefreshReg$(_c, \"GunbuilderPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2dDO0FBQ1Q7QUFFWTtJQWM5RFE7QUFERixNQUFNQyxlQUNKRCxDQUFBQSx3Q0FBQUEsT0FBT0EsQ0FBQ0UsR0FBRyxDQUFDQyx3QkFBd0IsY0FBcENILG1EQUFBQSx3Q0FBd0M7QUFJMUMsTUFBTUksY0FBYztBQUVwQixvQ0FBb0M7QUFDcEMsTUFBTUMsa0JBS0E7SUFDSjtRQUNFQyxJQUFJO1FBQ0pDLE9BQU87UUFDUEMsYUFDRTtRQUNGQyxhQUFhO1lBQ1g7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtTQUNEO0lBQ0g7SUFDQTtRQUNFSCxJQUFJO1FBQ0pDLE9BQU87UUFDUEMsYUFDRTtRQUNGQyxhQUFhO1lBQ1g7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1NBQ0Q7SUFDSDtDQVFEO0FBRWMsU0FBU0M7O0lBQ3RCLE1BQU1DLGVBQWVmLGdFQUFlQTtJQUNwQyxNQUFNZ0IsU0FBU2YsMERBQVNBO0lBQ3hCLE1BQU0sQ0FBQ2dCLE9BQU9DLFNBQVMsR0FBR3JCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDc0IsU0FBU0MsV0FBVyxHQUFHdkIsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDd0IsT0FBT0MsU0FBUyxHQUFHekIsK0NBQVFBLENBQWdCO0lBQ2xELE1BQU0sQ0FBQzBCLE9BQU9DLFNBQVMsR0FBRzNCLCtDQUFRQSxDQUFhO1FBQzdDLElBQUksSUFBNkIsRUFBRTtZQUNqQyxNQUFNNEIsU0FBU0MsYUFBYUMsT0FBTyxDQUFDbkI7WUFDcEMsSUFBSWlCLFFBQVE7Z0JBQ1YsSUFBSTtvQkFDRixPQUFPRyxLQUFLQyxLQUFLLENBQUNKO2dCQUNwQixFQUFFLFVBQU07b0JBQ04sT0FBTyxDQUFDO2dCQUNWO1lB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REFDSiw4REFBQ0E7a0RBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1oQjtHQXJtQndCeEk7O1FBQ0RkLDREQUFlQTtRQUNyQkMsc0RBQVNBOzs7S0FGRmEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2d1bmJ1aWxkZXIvcGFnZS50c3g/MDU0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlTWVtbywgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlU2VhcmNoUGFyYW1zLCB1c2VSb3V0ZXIgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcbmltcG9ydCB7IFBBUlRfUk9MRV9UT19DQVRFR09SWSB9IGZyb20gXCJAL2RhdGEvcGFydFJvbGVNYXBwaW5nc1wiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IG51bWJlcjsgLy8gYmFja2VuZCBudW1lcmljIGlkXG4gIG5hbWU6IHN0cmluZztcbiAgYnJhbmQ6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbiAgcGFydFJvbGU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlciB8IG51bGw7XG4gIG1haW5JbWFnZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgYnV5VXJsOiBzdHJpbmcgfCBudWxsO1xufTtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+OyAvLyBjYXRlZ29yeUlkIC0+IHBhcnRJZFxuXG5jb25zdCBTVE9SQUdFX0tFWSA9IFwiZ3VuYnVpbGRlci1idWlsZC1zdGF0ZVwiO1xuXG4vLyBDYXRlZ29yeSBncm91cHMgZm9yIHRoZSBtYWluIGdyaWRcbmNvbnN0IENBVEVHT1JZX0dST1VQUzoge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgY2F0ZWdvcnlJZHM6IENhdGVnb3J5SWRbXTtcbn1bXSA9IFtcbiAge1xuICAgIGlkOiBcImxvd2VyLWdyb3VwXCIsXG4gICAgbGFiZWw6IFwiTG93ZXIgUmVjZWl2ZXIgUGFydHNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiRXZlcnl0aGluZyBmcm9tIHRoZSBzZXJpYWxpemVkIGxvd2VyIHRvIHNtYWxsIHBhcnRzLCBmaXJlIGNvbnRyb2wsIGFuZCBjb3JlIGNvbnRyb2xzLlwiLFxuICAgIGNhdGVnb3J5SWRzOiBbXG4gICAgICBcImxvd2VyXCIsXG4gICAgICBcImNvbXBsZXRlTG93ZXJcIixcbiAgICAgIFwibG93ZXJQYXJ0c1wiLFxuICAgICAgXCJ0cmlnZ2VyXCIsXG4gICAgICBcImdyaXBcIixcbiAgICAgIFwic2FmZXR5XCIsXG4gICAgICBcImJ1ZmZlclwiLFxuICAgICAgXCJzdG9ja1wiLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1ncm91cFwiLFxuICAgIGxhYmVsOiBcIlVwcGVyIFJlY2VpdmVyIFBhcnRzXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkJhcnJlbCwgdXBwZXIsIGdhcyBzeXN0ZW0sIGFuZCB0aGUgcGFydHMgdGhhdCBrZWVwIHRoZSByaWZsZSBjeWNsaW5nLlwiLFxuICAgIGNhdGVnb3J5SWRzOiBbXG4gICAgICBcInVwcGVyXCIsXG4gICAgICBcImNvbXBsZXRlVXBwZXJcIixcbiAgICAgIFwiYmNnXCIsXG4gICAgICBcImJhcnJlbFwiLFxuICAgICAgXCJnYXNCbG9ja1wiLFxuICAgICAgXCJnYXNUdWJlXCIsXG4gICAgICBcIm11enpsZURldmljZVwiLFxuICAgICAgXCJzdXBwcmVzc29yXCIsXG4gICAgICBcImhhbmRndWFyZFwiLFxuICAgICAgXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICAgICAgXCJzaWdodHNcIixcbiAgICAgIFwib3B0aWNcIixcbiAgICBdLFxuICB9LFxuICAvLyBPcHRpb25hbDogZnV0dXJlIGdyb3VwIGZvciBhY2Nlc3Nvcmllcy9mdXJuaXR1cmUgaWYgbmVlZGVkXG4gIC8vIHtcbiAgLy8gICBpZDogXCJhY2Nlc3Nvcmllcy1ncm91cFwiLFxuICAvLyAgIGxhYmVsOiBcIkFjY2Vzc29yaWVzICYgRnVybml0dXJlXCIsXG4gIC8vICAgZGVzY3JpcHRpb246IFwiT3B0aWNzLCBsaWdodHMsIHNsaW5ncywgYW5kIG90aGVyIHN1cHBvcnRpbmcgZ2Vhci5cIixcbiAgLy8gICBjYXRlZ29yeUlkczogW1wib3B0aWNcIiwgXCJzaWdodHNcIiwgLi4uXSBhcyBDYXRlZ29yeUlkW10sXG4gIC8vIH0sXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBHdW5idWlsZGVyUGFnZSgpIHtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdXNlU2VhcmNoUGFyYW1zKCk7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuICBjb25zdCBbcGFydHMsIHNldFBhcnRzXSA9IHVzZVN0YXRlPFBhcnRbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIGlmIChzdG9yZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdG9yZWQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9KTtcbiAgY29uc3QgW3NoYXJlU3RhdHVzLCBzZXRTaGFyZVN0YXR1c10gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3NoYXJlVXJsLCBzZXRTaGFyZVVybF0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiXCIpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoUHJvZHVjdHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICBgJHtBUElfQkFTRV9VUkx9L2FwaS9wcm9kdWN0cy9ndW5idWlsZGVyP3BsYXRmb3JtPUFSLTE1YCxcbiAgICAgICAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhOiBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGlbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YVxuICAgICAgICAgIC5tYXAoKHApOiBQYXJ0IHwgbnVsbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkID0gUEFSVF9ST0xFX1RPX0NBVEVHT1JZW3AucGFydFJvbGVdO1xuICAgICAgICAgICAgaWYgKCFjYXRlZ29yeUlkKSB7XG4gICAgICAgICAgICAgIC8vIFNraXAgYW55IHBhcnRzIHdlIGRvbid0IGtub3cgaG93IHRvIG1hcCB5ZXRcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGlkOiBTdHJpbmcocC5pZCksIC8vIEFMV0FZUyBzdHJpbmdcbiAgICAgICAgICAgICAgY2F0ZWdvcnlJZCxcbiAgICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICAgICAgcHJpY2U6IHAucHJpY2UgPz8gMCxcbiAgICAgICAgICAgICAgaW1hZ2VVcmw6IHAubWFpbkltYWdlVXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIG5vdGVzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcigocCk6IHAgaXMgUGFydCA9PiBwICE9PSBudWxsKTtcblxuICAgICAgICBzZXRQYXJ0cyhub3JtYWxpemVkKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHJldHVybjtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBwcm9kdWN0c1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoUHJvZHVjdHMoKTtcblxuICAgIHJldHVybiAoKSA9PiBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0sIFtdKTtcblxuICAvLyBIYW5kbGUgVVJMIHF1ZXJ5IHBhcmFtZXRlciBmb3IgcGFydCBzZWxlY3Rpb24gKD9zZWxlY3Q9dXBwZXI6MTY1KVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdFBhcmFtID0gc2VhcmNoUGFyYW1zLmdldChcInNlbGVjdFwiKTtcbiAgICBpZiAoc2VsZWN0UGFyYW0pIHtcbiAgICAgIGNvbnN0IFtjYXRlZ29yeUlkLCBwYXJ0SWRdID0gc2VsZWN0UGFyYW0uc3BsaXQoXCI6XCIpO1xuICAgICAgaWYgKGNhdGVnb3J5SWQgJiYgcGFydElkICYmIENBVEVHT1JJRVMuc29tZSgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCkpIHtcbiAgICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkID0ge1xuICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgIFtjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHVwZGF0ZWQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJvdXRlci5yZXBsYWNlKFwiL2d1bmJ1aWxkZXJcIiwgeyBzY3JvbGw6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW3NlYXJjaFBhcmFtcywgcm91dGVyXSk7XG5cbiAgLy8gUGVyc2lzdCBidWlsZCBzdGF0ZSB0byBsb2NhbFN0b3JhZ2Ugd2hlbmV2ZXIgaXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoYnVpbGQpKTtcbiAgICB9XG4gIH0sIFtidWlsZF0pO1xuXG4gIGNvbnN0IHBhcnRzQnlDYXRlZ29yeTogUmVjb3JkPENhdGVnb3J5SWQsIFBhcnRbXT4gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBncm91cGVkID0ge30gYXMgUmVjb3JkPENhdGVnb3J5SWQsIFBhcnRbXT47XG4gICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBDQVRFR09SSUVTKSB7XG4gICAgICBncm91cGVkW2NhdGVnb3J5LmlkXSA9IHBhcnRzLmZpbHRlcihcbiAgICAgICAgKHApID0+IHAuY2F0ZWdvcnlJZCA9PT0gY2F0ZWdvcnkuaWQsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZ3JvdXBlZDtcbiAgfSwgW3BhcnRzXSk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRQYXJ0czogUGFydFtdID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGJ1aWxkKVxuICAgICAgLm1hcCgoW2NhdGVnb3J5SWQsIHBhcnRJZF0pID0+XG4gICAgICAgIHBhcnRzLmZpbmQoKHApID0+IHAuaWQgPT09IHBhcnRJZCAmJiBwLmNhdGVnb3J5SWQgPT09IGNhdGVnb3J5SWQpLFxuICAgICAgKVxuICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBQYXJ0W107XG4gIH0sIFtidWlsZCwgcGFydHNdKTtcblxuICBjb25zdCB0b3RhbFByaWNlID0gdXNlTWVtbyhcbiAgICAoKSA9PiBzZWxlY3RlZFBhcnRzLnJlZHVjZSgoc3VtLCBwKSA9PiBzdW0gKyBwLnByaWNlLCAwKSxcbiAgICBbc2VsZWN0ZWRQYXJ0c10sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuXG4gICAgLy8gSWYgbm8gcGFydHMgc2VsZWN0ZWQsIGNsZWFyIHRoZSBzaGFyZSBVUkxcbiAgICBpZiAoT2JqZWN0LmtleXMoYnVpbGQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2V0U2hhcmVVcmwoXCJcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnN0cmluZ2lmeShidWlsZCk7XG4gICAgICBjb25zdCBlbmNvZGVkID0gd2luZG93LmJ0b2EocGF5bG9hZCk7XG4gICAgICBjb25zdCBvcmlnaW4gPSB3aW5kb3cubG9jYXRpb24/Lm9yaWdpbiA/PyBcIlwiO1xuICAgICAgY29uc3QgdXJsID0gYCR7b3JpZ2lufS9ndW5idWlsZGVyL2J1aWxkP2J1aWxkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICBlbmNvZGVkLFxuICAgICAgKX1gO1xuICAgICAgc2V0U2hhcmVVcmwodXJsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHNldFNoYXJlVXJsKFwiXCIpO1xuICAgIH1cbiAgfSwgW2J1aWxkXSk7XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0UGFydCA9IChjYXRlZ29yeUlkOiBDYXRlZ29yeUlkLCBwYXJ0SWQ6IHN0cmluZykgPT4ge1xuICAgIHNldEJ1aWxkKChwcmV2KSA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIFtjYXRlZ29yeUlkXTogcGFydElkLFxuICAgIH0pKTtcbiAgfTtcblxuICAvLyBVc2UgZ3JvdXAgb3JkZXJpbmcgZm9yIHRoZSBzdW1tYXJ5IGFzIHdlbGxcbiAgY29uc3Qgc3VtbWFyeUNhdGVnb3J5T3JkZXI6IENhdGVnb3J5SWRbXSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIENBVEVHT1JZX0dST1VQUy5mbGF0TWFwKChncm91cCkgPT4gZ3JvdXAuY2F0ZWdvcnlJZHMpLmZpbHRlcihcbiAgICAgICAgKGlkKSA9PiBDQVRFR09SSUVTLnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSxcbiAgICAgICksXG4gICAgW10sXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlU2hhcmUgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHNlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZXRTaGFyZVN0YXR1cyhcIkFkZCBhIGZldyBwYXJ0cyBiZWZvcmUgc2hhcmluZyB5b3VyIGJ1aWxkLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBsaW5lcy5wdXNoKFwiU2hhZG93IFN0YW5kYXJkIOKAlCBUaGUgQXJtb3J5IEJ1aWxkXCIpO1xuICAgIGxpbmVzLnB1c2goXCJcIik7XG4gICAgbGluZXMucHVzaChgVG90YWw6ICQke3RvdGFsUHJpY2UudG9GaXhlZCgyKX1gKTtcbiAgICBsaW5lcy5wdXNoKFwiXCIpO1xuXG4gICAgc3VtbWFyeUNhdGVnb3J5T3JkZXIuZm9yRWFjaCgoY2F0ZWdvcnlJZCkgPT4ge1xuICAgICAgY29uc3QgY2F0ID0gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKTtcbiAgICAgIGlmICghY2F0KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkUGFydElkID0gYnVpbGRbY2F0LmlkXTtcbiAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0cy5maW5kKFxuICAgICAgICAocCkgPT4gcC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWQgJiYgcC5jYXRlZ29yeUlkID09PSBjYXQuaWQsXG4gICAgICApO1xuXG4gICAgICBpZiAocGFydCkge1xuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGAke2NhdC5uYW1lfTogJHtwYXJ0LmJyYW5kfSDigJQgJHtwYXJ0Lm5hbWV9ICgkJHtwYXJ0LnByaWNlLnRvRml4ZWQoXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICl9KWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lcy5wdXNoKGAke2NhdC5uYW1lfTogW05vdCBzZWxlY3RlZF1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHRleHQgPSBsaW5lcy5qb2luKFwiXFxuXCIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpO1xuICAgICAgc2V0U2hhcmVTdGF0dXMoXCJCdWlsZCBzdW1tYXJ5IGNvcGllZCB0byBjbGlwYm9hcmQuXCIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgc2V0U2hhcmVTdGF0dXMoXG4gICAgICAgIFwiQ291bGQgbm90IGFjY2VzcyBjbGlwYm9hcmQuIFlvdSBjYW4gY29weSBmcm9tIHRoZSBidWlsZCBzdW1tYXJ5IHBhZ2UuXCIsXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVDb3B5TGluayA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXNoYXJlVXJsKSB7XG4gICAgICBzZXRTaGFyZVN0YXR1cyhcIk5vIHNoYXJlYWJsZSBsaW5rIGF2YWlsYWJsZSB5ZXQuXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzaGFyZVVybCk7XG4gICAgICBzZXRTaGFyZVN0YXR1cyhcIlNoYXJlYWJsZSBsaW5rIGNvcGllZCB0byBjbGlwYm9hcmQuXCIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgc2V0U2hhcmVTdGF0dXMoXCJDb3VsZCBub3QgY29weSBsaW5rIHRvIGNsaXBib2FyZC5cIik7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZU5hdGl2ZVNoYXJlID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghc2hhcmVVcmwpIHtcbiAgICAgIHNldFNoYXJlU3RhdHVzKFwiTm8gc2hhcmVhYmxlIGxpbmsgYXZhaWxhYmxlIHlldC5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG5hdmlnYXRvci5zaGFyZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgbmF2aWdhdG9yLnNoYXJlKHtcbiAgICAgICAgICB0aXRsZTogXCJTaGFkb3cgU3RhbmRhcmQg4oCUIFRoZSBBcm1vcnkgQnVpbGRcIixcbiAgICAgICAgICB0ZXh0OiBcIkNoZWNrIG91dCBteSBTaGFkb3cgU3RhbmRhcmQgQXJtb3J5IGJ1aWxkLlwiLFxuICAgICAgICAgIHVybDogc2hhcmVVcmwsXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRTaGFyZVN0YXR1cyhcIlNoYXJlIGRpYWxvZyBvcGVuZWQuXCIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFVzZXIgY2FuY2VsZWQgb3Igc2hhcmUgZmFpbGVkOyBrZWVwIGl0IHF1aWV0IGJ1dCBsZXQgdGhlbSBrbm93XG4gICAgICAgIHNldFNoYXJlU3RhdHVzKFwiU2hhcmUgY2FuY2VsZWQgb3IgdW5hdmFpbGFibGUuIFlvdSBjYW4gY29weSB0aGUgbGluayBpbnN0ZWFkLlwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2sgdG8gY29weWluZyB0aGUgbGlua1xuICAgICAgYXdhaXQgaGFuZGxlQ29weUxpbmsoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvcmRlci1iIGJvcmRlci1hbWJlci01MDAvMjAgYmctYW1iZXItNTAwLzVcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIGZsZXggbWF4LXctNnhsIGZsZXgtY29sIGdhcC0xIHB4LTQgcHktMiB0ZXh0LVswLjc1cmVtXSB0ZXh0LWFtYmVyLTEwMCBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwicm91bmRlZC1zbSBiZy1hbWJlci01MDAvMjAgcHgtMiBweS0wLjUgdGV4dC1bMC42NXJlbV0gZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMThlbV0gdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgICAgRWFybHkgQWNjZXNzIEJldGFcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiB0ZXh0LWFtYmVyLTEwMC85MCBtZDppbmxpbmVcIj5cbiAgICAgICAgICAgICAgWW91JmFwb3M7cmUgdXNpbmcgYW4gZWFybHktYWNjZXNzIHByb3RvdHlwZSBvZiBUaGUgQXJtb3J5LiBEYXRhLFxuICAgICAgICAgICAgICBwcmljaW5nLCBhbmQgYXZhaWxhYmxlIHBhcnRzIGFyZSBzdGlsbCBldm9sdmluZy5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTEwMC85MCBtZDpoaWRkZW5cIj5cbiAgICAgICAgICAgIEVhcmx5LWFjY2VzcyBwcm90b3R5cGUuIERhdGEgYW5kIHByaWNpbmcgbWF5IGNoYW5nZS5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICA8aGVhZGVyIGNsYXNzTmFtZT1cIm1iLTZcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjJlbV0gdXBwZXJjYXNlIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgU2hhZG93IFN0YW5kYXJkIENvLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cIm10LTEgdGV4dC0yeGwgbWQ6dGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodFwiPlxuICAgICAgICAgICAgICBUaGUgQnVpbGQgQmVuY2g6IDxzcGFuIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwXCI+RWFybHkgQWNjZXNzPC9zcGFuPlxuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgIEV4cGxvcmUgY29tcG9uZW50cyBmcm9tIHRydXN0ZWQgYnJhbmRzLCBjaG9vc2Ugb25lIHBhcnQgcGVyXG4gICAgICAgICAgICAgIGNhdGVnb3J5LCB0cmFjayBsaXZlIHByaWNlcywgYW5kIHdhdGNoIHlvdXIgdG90YWwgYnVpbGQgY29zdFxuICAgICAgICAgICAgICB1cGRhdGUgYXMgeW91IGdvLiBUaGlzIGVhcmx5LWFjY2VzcyBidWlsZGVyIGtlZXBzIHlvdXIgc2V0dXAgc2F2ZWRcbiAgICAgICAgICAgICAgbG9jYWxseSBzbyB5b3UgY2FuIGNvbWUgYmFjayBhbmQgcmVmaW5lIGl0IGFueXRpbWUuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgICAgICAgICAgey8qIEJ1aWxkIHN1bW1hcnkgcGFuZWwgKi99XG4gICAgICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwibWItNiByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvODAgcC0zIG1kOnAtNCBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLXN0YXJ0IG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIHsvKiBMZWZ0OiB0aXRsZSArIHRvdGFscyArIHByaW1hcnkgYWN0aW9ucyAqL31cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICAgIE15IEJ1aWxkIEJyZWFrZG93blxuICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNDAwXCI+Q3VycmVudCBidWlsZCB0b3RhbDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgICAgICAke3RvdGFsUHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwIG10LTFcIj5cbiAgICAgICAgICAgICAgICB7c2VsZWN0ZWRQYXJ0cy5sZW5ndGh9IC8ge0NBVEVHT1JJRVMubGVuZ3RofSBjYXRlZ29yaWVzIGZpbGxlZFxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICB7LyogUHJpbWFyeSBhY3Rpb25zIG5vdyBsaXZlIHVuZGVyIHRoZSB0b3RhbCAqL31cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4IGZsZXgtY29sIGl0ZW1zLXN0cmV0Y2ggZ2FwLTIgc206ZmxleC1yb3cgc206ZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyL2J1aWxkXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2B3LWZ1bGwgc206dy1hdXRvIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1hbWJlci00MDAvNjAgYmctYW1iZXItNDAwLzEwIHB4LTMgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtYW1iZXItMjAwIGhvdmVyOmJnLWFtYmVyLTQwMC8xNSB0ZXh0LWNlbnRlciB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyBcIm9wYWNpdHktNDAgY3Vyc29yLW5vdC1hbGxvd2VkIHBvaW50ZXItZXZlbnRzLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEJ1aWxkIFN1bW1hcnlcbiAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU2hhcmV9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgdy1mdWxsIHNtOnctYXV0byByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgYm9yZGVyICR7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy05MDAvODAgdGV4dC16aW5jLTYwMCBib3JkZXItemluYy04MDAgY3Vyc29yLW5vdC1hbGxvd2VkXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcImJnLXppbmMtOTAwLzgwIHRleHQtemluYy0yMDAgYm9yZGVyLXppbmMtNzAwIGhvdmVyOmJnLXppbmMtODAwXCJcbiAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17c2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBDb3B5IEJ1aWxkIFN1bW1hcnlcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzZXRCdWlsZCh7fSk7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17c2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgdy1mdWxsIHNtOnctYXV0byByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgcHgtMyBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTgwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwID8gXCJvcGFjaXR5LTQwIGN1cnNvci1ub3QtYWxsb3dlZFwiIDogXCJcIlxuICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQ2xlYXIgQnVpbGRcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIHsvKiBSaWdodDogU2hhcmUgWW91ciBCdWlsZCAqL31cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTMgbWQ6aXRlbXMtZW5kIG1kOnRleHQtcmlnaHQgbWQ6ZmxleC0xXCI+XG4gICAgICAgICAgICB7c2VsZWN0ZWRQYXJ0cy5sZW5ndGggPiAwICYmIHNoYXJlVXJsICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgbWQ6dy1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtWzAuN3JlbV0gZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgU2hhcmUgWW91ciBCdWlsZFxuICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LVswLjdyZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgIFNoYXJlIHRoaXMgbGluayB0byBsZXQgb3RoZXJzIHZpZXcgeW91ciBidWlsZCBvciBib29rbWFyayBpdCB0byBjb21lXG4gICAgICAgICAgICAgICAgICBiYWNrIGxhdGVyLlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTIgZmxleCBmbGV4LWNvbCBnYXAtMiBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMC42NXJlbV0gdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtemluYy01MDAgbWItMVwiPlxuICAgICAgICAgICAgICAgICAgICAgIFNoYXJlYWJsZSBVUkxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICByZWFkT25seVxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzaGFyZVVybH1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTUwLzgwIHB4LTIgcHktMS41IHRleHQtWzAuN3JlbV0gdGV4dC16aW5jLTIwMCBmb250LW1vbm8gb3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWFtYmVyLTQwMFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBnYXAtMiBtZDpmbGV4LW5vbmUgbWQ6bXQtNVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlTmF0aXZlU2hhcmV9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIG1kOmZsZXgtbm9uZSByb3VuZGVkLW1kIGJnLXppbmMtOTAwLzgwIHB4LTMgcHktMS41IHRleHQtWzAuNzVyZW1dIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTUwMCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICBTaGFyZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNvcHlMaW5rfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtMSBtZDpmbGV4LW5vbmUgcm91bmRlZC1tZCBiZy1hbWJlci00MDAgcHgtMyBweS0xLjUgdGV4dC1bMC43NXJlbV0gZm9udC1zZW1pYm9sZCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICBDb3B5IExpbmtcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7c2hhcmVTdGF0dXMgJiYgKFxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQtWzAuN3JlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIHtzaGFyZVN0YXR1c31cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIHsvKiBMYXlvdXQgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC82MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwibWItNCB0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgIFdvcmsgdG9wLWRvd24gdGhyb3VnaCB0aGUgbWFqb3Igc2VjdGlvbnMuIEVhY2ggcm93IHNob3dzIHlvdXJcbiAgICAgICAgICAgIGN1cnJlbnQgcGljayBmb3IgdGhhdCBwYXJ0IHR5cGUsIHdpdGggcHJpY2UgYW5kIGEgZGlyZWN0IGJ1eVxuICAgICAgICAgICAgbGlua+KAlG9yIGEgcXVpY2sgd2F5IHRvIGNob29zZSBhIHBhcnQgaWYgeW91IGhhdmVuJmFwb3M7dCBwaWNrZWRcbiAgICAgICAgICAgIG9uZSB5ZXQuXG4gICAgICAgICAgPC9wPlxuXG4gICAgICAgICAge2xvYWRpbmcgJiYgKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIExvYWRpbmcgcGFydHMgZnJvbSBiYWNrZW5k4oCmXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7ZXJyb3IgJiYgIWxvYWRpbmcgJiYgKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXJlZC00MDBcIj5cbiAgICAgICAgICAgICAge2Vycm9yfSDigJQgY2hlY2sgdGhhdCB0aGUgQmFsbGlzdGljIEFQSSBpcyBydW5uaW5nIGFuZCBDT1JTIGlzXG4gICAgICAgICAgICAgIGNvbmZpZ3VyZWQuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHshbG9hZGluZyAmJiAhZXJyb3IgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTZcIj5cbiAgICAgICAgICAgICAge0NBVEVHT1JZX0dST1VQUy5tYXAoKGdyb3VwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBDYXRlZ29yaWVzID0gQ0FURUdPUklFUy5maWx0ZXIoKGMpID0+XG4gICAgICAgICAgICAgICAgICBncm91cC5jYXRlZ29yeUlkcy5pbmNsdWRlcyhjLmlkIGFzIENhdGVnb3J5SWQpLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBDYXRlZ29yaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtncm91cC5pZH0gY2xhc3NOYW1lPVwic3BhY2UteS0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1iYXNlbGluZSBqdXN0aWZ5LWJldHdlZW4gZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cC5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAuZGVzY3JpcHRpb24gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDAgbXQtMSBtYXgtdy14bFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cC5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJvdmVyZmxvdy14LWF1dG8gcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzgwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT1cIm1pbi13LWZ1bGwgdGV4dC14cyBtZDp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItemluYy04MDAgYmctemluYy05MDAvNjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHgtMyBweS0yIHRleHQtbGVmdCBmb250LXNlbWlib2xkIHRleHQtemluYy00MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudCAvIFBhcnQgVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB4LTMgcHktMiB0ZXh0LWxlZnQgZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcmFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB4LTMgcHktMiB0ZXh0LXJpZ2h0IGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC0zIHB5LTIgdGV4dC1yaWdodCBmb250LXNlbWlib2xkIHRleHQtemluYy00MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbGUgUHJpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC0zIHB5LTIgdGV4dC1sZWZ0IGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsaWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB4LTMgcHktMiB0ZXh0LXJpZ2h0IGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnV5IC8gQ2hvb3NlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cENhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhdGVnb3J5UGFydHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHNCeUNhdGVnb3J5W2NhdGVnb3J5LmlkXSA/PyBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhcnRJZCA9IGJ1aWxkW2NhdGVnb3J5LmlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhcnQgPSBjYXRlZ29yeVBhcnRzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocCkgPT4gcC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNQYXJ0cyA9IGNhdGVnb3J5UGFydHMubGVuZ3RoID4gMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtjYXRlZ29yeS5pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyLXQgYm9yZGVyLXppbmMtOTAwIGhvdmVyOmJnLXppbmMtOTAwLzYwIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey8qIENvbXBvbmVudCAvIFBhcnQgVHlwZSAqL31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB4LTMgcHktMiBhbGlnbi10b3BcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIHRleHQtemluYy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjYXRlZ29yeS5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZWxlY3RlZFBhcnQgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzAuN3JlbV0gdGV4dC16aW5jLTUwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlbGVjdGVkUGFydC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IGhhc1BhcnRzID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVswLjdyZW1dIHRleHQtemluYy02MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gcGFydCBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMC43cmVtXSB0ZXh0LXppbmMtNjAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIHBhcnRzIGF2YWlsYWJsZSB5ZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey8qIEJyYW5kICovfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHgtMyBweS0yIGFsaWduLXRvcCB0ZXh0LXppbmMtMzAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlbGVjdGVkUGFydCA/IHNlbGVjdGVkUGFydC5icmFuZCA6IFwi4oCUXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey8qIFByaWNlICovfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHgtMyBweS0yIGFsaWduLXRvcCB0ZXh0LXJpZ2h0IHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlbGVjdGVkUGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgJCR7c2VsZWN0ZWRQYXJ0LnByaWNlLnRvRml4ZWQoMil9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIuKAlFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsvKiBTYWxlIFByaWNlIChwbGFjZWhvbGRlciB1bnRpbCB3ZSB3aXJlIHRocm91Z2ggc2FsZS9vcmlnaW5hbCkgKi99XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC0zIHB5LTIgYWxpZ24tdG9wIHRleHQtcmlnaHQgdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsvKiBUT0RPOiB3aXJlIGluIHNhbGUvb3JpZ2luYWwgcHJpY2VzIGZyb20gYmFja2VuZCAqL31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2VsZWN0ZWRQYXJ0ID8gXCLigJRcIiA6IFwi4oCUXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey8qIENhbGliZXIgKHBsYWNlaG9sZGVyIGZvciBub3cpICovfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHgtMyBweS0yIGFsaWduLXRvcCB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey8qIFRPRE86IHdpcmUgaW4gY2FsaWJlciBmcm9tIFByb2R1Y3RTdW1tYXJ5RHRvIHdoZW4gYXZhaWxhYmxlICovfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsvKiBCdXkgLyBDaG9vc2UgKi99XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC0zIHB5LTIgYWxpZ24tdG9wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2VsZWN0ZWRQYXJ0ICYmIHNlbGVjdGVkUGFydC51cmwgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6aW5saW5lLWZsZXggcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHB4LTIuNSBweS0xIHRleHQtWzAuN3JlbV0gZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTgwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZSBQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtzZWxlY3RlZFBhcnQudXJsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggcm91bmRlZC1tZCBiZy1hbWJlci00MDAgcHgtMi41IHB5LTEgdGV4dC1bMC43cmVtXSBmb250LXNlbWlib2xkIHRleHQtYmxhY2sgaG92ZXI6YmctYW1iZXItMzAwIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IGhhc1BhcnRzID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHB4LTIuNSBweS0xIHRleHQtWzAuN3JlbV0gZm9udC1tZWRpdW0gdGV4dC16aW5jLTIwMCBob3ZlcjpiZy16aW5jLTgwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHlvdSB3YW50IHRvIHByZS1zZWxlY3Qgc29tZXRoaW5nIGxhdGVyLCB5b3UgY2FuIGhhbmRsZSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9vc2UgYSBQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtWzAuN3JlbV0gdGV4dC16aW5jLTYwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICB7LyogV2hhdCdzIE5ldyAqL31cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwibXQtOCByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvODAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICBXaGF0JmFwb3M7cyBOZXcgaW4gRWFybHkgQWNjZXNzXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibXQtMiBzcGFjZS15LTEgdGV4dC1zbSB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICA8bGk+4oCiIExpdmUgcGFydHMgYW5kIHByaWNpbmcgcHVsbGVkIGZyb20gbXVsdGlwbGUgbWVyY2hhbnRzLjwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIOKAoiBHcm91cGVkIGxheW91dCBmb3IgbG93ZXIgYW5kIHVwcGVyIHJlY2VpdmVyIHBhcnRzIHNvIHlvdSBjYW4gc2VlXG4gICAgICAgICAgICAgIGF0IGEgZ2xhbmNlIHdoaWNoIHNlY3Rpb25zIG9mIHlvdXIgYnVpbGQgYXJlIHN0aWxsIG1pc3NpbmcuXG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgUnVubmluZyBidWlsZCB0b3RhbCB0aGF0IHVwZGF0ZXMgYXV0b21hdGljYWxseSBhcyB5b3UgYWRkIG9yXG4gICAgICAgICAgICAgIHN3YXAgY29tcG9uZW50cy5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIOKAoiBMb2NhbCBidWlsZCBwZXJzaXN0ZW5jZSBzbyB5b3VyIHNlbGVjdGlvbnMgc3RpY2sgYXJvdW5kIGJldHdlZW5cbiAgICAgICAgICAgICAgdmlzaXRzIG9uIHRoaXMgZGV2aWNlLlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgey8qIFJvYWRtYXAgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cIm10LTggcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzgwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgV2hhdCZhcG9zO3Mgb24gb3VyIHJvYWRtYXBcbiAgICAgICAgICA8L2gyPlxuICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJtdC0yIHNwYWNlLXktMSB0ZXh0LXNtIHRleHQtemluYy00MDBcIj5cbiAgICAgICAgICAgIDxsaT7igKIgUGxhdGZvcm0gZmlsdGVycyAoQVItMTUsIEFSLTksIEFSLTEwKTwvbGk+XG4gICAgICAgICAgICA8bGk+4oCiIE1vcmUgcGFydCBjYXRlZ29yaWVzIGFuZCBmdXJuaXR1cmU8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBSaWNoZXIgcHJpY2luZy9zdG9jayBzeW5jPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgU21hcnRlciBjb21wYXRpYmlsaXR5IGNoZWNrcyBiZXR3ZWVuIGNvbXBvbmVudHM8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBBUjkvQVIxMCBzdXBwb3J0IGFuZCBtb3JlPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZU1lbW8iLCJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsIkxpbmsiLCJ1c2VTZWFyY2hQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwiUEFSVF9ST0xFX1RPX0NBVEVHT1JZIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIlNUT1JBR0VfS0VZIiwiQ0FURUdPUllfR1JPVVBTIiwiaWQiLCJsYWJlbCIsImRlc2NyaXB0aW9uIiwiY2F0ZWdvcnlJZHMiLCJHdW5idWlsZGVyUGFnZSIsInNlYXJjaFBhcmFtcyIsInJvdXRlciIsInBhcnRzIiwic2V0UGFydHMiLCJsb2FkaW5nIiwic2V0TG9hZGluZyIsImVycm9yIiwic2V0RXJyb3IiLCJidWlsZCIsInNldEJ1aWxkIiwic3RvcmVkIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkpTT04iLCJwYXJzZSIsInNoYXJlU3RhdHVzIiwic2V0U2hhcmVTdGF0dXMiLCJzaGFyZVVybCIsInNldFNoYXJlVXJsIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoUHJvZHVjdHMiLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwiY2F0ZWdvcnlJZCIsInBhcnRSb2xlIiwiU3RyaW5nIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsInVybCIsImJ1eVVybCIsIm5vdGVzIiwiZmlsdGVyIiwiZXJyIiwibWVzc2FnZSIsImFib3J0Iiwic2VsZWN0UGFyYW0iLCJnZXQiLCJwYXJ0SWQiLCJzcGxpdCIsInNvbWUiLCJjIiwicHJldiIsInVwZGF0ZWQiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwicmVwbGFjZSIsInNjcm9sbCIsInBhcnRzQnlDYXRlZ29yeSIsImdyb3VwZWQiLCJjYXRlZ29yeSIsInNlbGVjdGVkUGFydHMiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmluZCIsIkJvb2xlYW4iLCJ0b3RhbFByaWNlIiwicmVkdWNlIiwic3VtIiwia2V5cyIsImxlbmd0aCIsIndpbmRvdyIsInBheWxvYWQiLCJlbmNvZGVkIiwiYnRvYSIsIm9yaWdpbiIsImxvY2F0aW9uIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaGFuZGxlU2VsZWN0UGFydCIsInN1bW1hcnlDYXRlZ29yeU9yZGVyIiwiZmxhdE1hcCIsImdyb3VwIiwiaGFuZGxlU2hhcmUiLCJsaW5lcyIsInB1c2giLCJ0b0ZpeGVkIiwiZm9yRWFjaCIsImNhdCIsInNlbGVjdGVkUGFydElkIiwicGFydCIsInRleHQiLCJqb2luIiwibmF2aWdhdG9yIiwiY2xpcGJvYXJkIiwid3JpdGVUZXh0IiwiaGFuZGxlQ29weUxpbmsiLCJoYW5kbGVOYXRpdmVTaGFyZSIsInNoYXJlIiwidGl0bGUiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2Iiwic3BhbiIsImhlYWRlciIsImgxIiwic2VjdGlvbiIsImgyIiwiaHJlZiIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwiZGlzYWJsZWQiLCJyZW1vdmVJdGVtIiwiaDMiLCJpbnB1dCIsInJlYWRPbmx5IiwidmFsdWUiLCJncm91cENhdGVnb3JpZXMiLCJpbmNsdWRlcyIsInRhYmxlIiwidGhlYWQiLCJ0ciIsInRoIiwidGJvZHkiLCJjYXRlZ29yeVBhcnRzIiwic2VsZWN0ZWRQYXJ0IiwiaGFzUGFydHMiLCJ0ZCIsImEiLCJ0YXJnZXQiLCJyZWwiLCJ1bCIsImxpIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/page.tsx\n"));
|
|
|
|
/***/ })
|
|
|
|
}); |